方法1

创建触发器: 




create orreplace trigger login_on 




alfterlogon on database 




begin 




dbms_application_info.set_client_info(sys_context('userenv','ip_address')); 




end; 













这样以后在连接到DB的session,就会自动在v$session动态视图的client_info列记录session的IP地址了。 




从V$SESSION中只能得到机器名, 而通过机器名不能确定到具体的机器. 所以必须得到IP 


在oracle中的v$session视图中可以保存有会话的想关信息,包括了客户端的大部分连接信息。其中我们可以将会话的发起ip地址写入到client_identifier和client_info 


上文中我们提到了使用userenv函数或者sys_context函数可以获得当前会话的相关信息,其中就包含的有ip_address这一项 


当我们使用client_identifier字段来保存登录会话的ip地址的时候,我们需要用到dbms_session.set_identifier过程/函数 


当我们使用client_info字段来保存登陆会话的ip地址的时候,我们需要用到dbms_application_info.set_client_info过程/函数 






例:查看当前用户的ip地址: 


MAI@test > select sys_context('userenv','ip_address') from dual; 


SYS_CONTEXT('USERENV','IP_ADDRESS') 


------------------------------------- 


192.168.77.1 






MAI@test > select username,sid,serial#,client_info,client_identifier from v$session where sid=(select sys_context('userenv','sid') from dual); 


USERNAME            SID    SERIAL# CLIENT_INFO          CLIENT_IDENTIFIER 


--------------- ------- ---------- -------------------- -------------------- 


MAI                 138      38266 


使用client_identifier字段 


MAI@test > exec dbms_session.set_identifier(sys_context('userenv','ip_address')); 


MAI@test > select username,sid,serial#,client_info,client_identifier from v$session where sid=(select sys_context('userenv','sid') from dual); 


USERNAME            SID    SERIAL# CLIENT_INFO          CLIENT_IDENTIFIER 


--------------- ------- ---------- -------------------- -------------------- 


MAI                 138      38270                      192.168.77.1 


使用client_info字段 


MAI@test > exec dbms_application_info.set_client_info(sys_context('userenv','ip_address')); 


MAI@test > select username,sid,serial#,client_info,client_identifier from v$session where sid=(select sys_context('userenv','sid') from dual); 


USERNAME            SID    SERIAL# CLIENT_INFO          CLIENT_IDENTIFIER 


--------------- ------- ---------- -------------------- -------------------- 


MAI                 138      38270 192.168.77.1         192.168.77.1 






当然,这个过程过程可以通过一个触发器来调用,当每一个新的用户连接开启的时候自动触发该触发器,将相应的ip信息写入v$session的相应字段。 


触发器的例子: 


create or replace trigger on_login_trigger 


after logon on database 


begin 


dbms_application_info.set_client_info(sys_context('USERENV','IP_ADDRESS')); 


end; 





建立这个trigger需要有dba权限,这样的话,当每个用户新登录的时候,这个触发器就会起作用,然后就能够将客户端的ip地址填充到v$session视图中的client_info字段中: 


MAI@test > select username,sid,serial#,client_info,client_identifier from v$session where sid=(select sys_context('userenv','sid') from dual); 


USERNAME            SID    SERIAL# CLIENT_INFO          CLIENT_IDENTIFIER 


--------------- ------- ---------- -------------------- -------------------- 


MAI                 149        425 192.168.77.1

方法2

利用sys_context函数我们可以获得当前session的hostname和ip address 




SQL> selectsys_context('userenv','host') from dual; 




SYS_CONTEXT('USERENV','HOST') 


-------------------------------------------------------------- 


WORKGROUP\IBM-L3YMBNP 




SQL> select sys_context('userenv','ip_address') from dual; 




SYS_CONTEXT('USERENV','IP_ADDRESS') 


----------------------------------------------------------- 


127.0.0.1 




通过sys_context我们只能获得当前session的信息,如果要获得其他session呢? 


这个时候我们就用utl_inaddr包来获取 




SQL> selectutl_inaddr.get_host_address('IBM-L3YMBNP') from dual; 




UTL_INADDR.GET_HOST_ADDRESS('IBM-L3YMBNP') 


------------------------------------------------------------------- 


9.181.142.152 




而且我们还可以获得sina以及其他web site的ip 


SQL> select utl_inaddr.get_host_address('www.sina.com.cn') from dual; 




UTL_INADDR.GET_HOST_ADDRESS('WWW.SINA.COM.CN') 


--------------------------------------------------------------------- 


218.30.108.55 




其原理是:首先获取域名解析服务器(resolv.conf),在根据host.conf文件确定解析顺序,因为缺省的是hosts文件优先解析,这个时候会又继续读取/etc/hosts文件。 




如果hosts文件存在解析关系,则返回信息;如果不存在,则继续问询DNS服务器,获得解析地址,如果不能解析,则会出错 


SQL> select utl_inaddr.get_host_address('www.a.com') from dual; 


select utl_inaddr.get_host_address('www.a.com') from dual 


       * 


ERROR 位于第 1 行: 


ORA-29257: 未知的主机www.a.com 


ORA-06512: 在"SYS.UTL_INADDR", line 35 


ORA-06512: 在"SYS.UTL_INADDR", line 40 


ORA-06512: 在line 1 




基本上就是这样了。

Oracle获取session的IP方法的更多相关文章

  1. Python 优雅获取本机 IP 方法【转】

    转自:https://www.cnblogs.com/lfxiao/p/9672975.html 见过很多获取服务器本地IP的代码,个人觉得都不是很好,例如以下这些 不推荐:靠猜测去获取本地IP方法 ...

  2. Python 优雅获取本机 IP 方法

    原文 见过很多获取服务器本地IP的代码,个人觉得都不是很好,例如以下这些 不推荐:靠猜测去获取本地IP方法 #!/usr/bin/env python # -*- coding: utf-8 -*- ...

  3. Oracle获取session的trace

    1. 使用参数SQL_TRACE 下面是官网对此参数的说明 SQL_TRACE Property Description Parameter type Boolean Default value fa ...

  4. Java正确获取客户端真实IP方法整理

    在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实I ...

  5. 干货:Java正确获取客户端真实IP方法整理

    在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实I ...

  6. 获取Session和request方法

    action中的几种写法 //第一种很少用public class LoginAction1 extends ActionSupport {        private Map request;   ...

  7. C#获取本机IP方法,获取本机局域网IP地址方法

    1. private void GetIP() { string hostName = Dns.GetHostName();//本机名 //System.Net.IPAddress[] address ...

  8. hibernate的获取session的两方法比较,和通过id获取对象的比较,一级缓存二级缓存

    opensession与currentsession的联系与区别 在同一个线程中opensession的session是不一样的,而currentsession获取的session是一样的,这就保证了 ...

  9. Oracle获取alter.log的方法

    10g下:可以在 admin\{sid}\pfile文件下的init.ora文件中找到以下内容:audit_file_dest = C:\ORACLE\PRODUCT\10.2.0\ADMIN\ORC ...

随机推荐

  1. sqli-labs less5-6(双查询注入)

    less-5 双查询注入 利用count(), group by, floor(), rand()报错 双查询注入的原理参考博客 打开less-5 用union注入的流程进行发现页面不会有回显,所以u ...

  2. PHP代码审计学习-PHP-Audit-Labs-day1

    0x01 前言 偶然间看到红日团队的PHP代码审计教程,想起之前立的flag,随决定赶紧搞起来.要不以后怎么跟00后竞争呢.虽然现在PHP代码审计不吃香,但是php代码好歹能看懂,CTF中也经常遇到, ...

  3. 一文带你彻底了解大数据处理引擎Flink内存管理

    摘要: Flink是jvm之上的大数据处理引擎. Flink是jvm之上的大数据处理引擎,jvm存在java对象存储密度低.full gc时消耗性能,gc存在stw的问题,同时omm时会影响稳定性.同 ...

  4. 开源一套原创文本处理工具:Java+Bat脚本实现自动批量处理对账单工具

    原创/朱季谦 这款工具是笔者在2018年初开发完成的,时隔两载,偶然想起这款小工具,于是,决定将其开源,若有人需要做类似Java批处理实现整理文档的工具,可参考该工具逻辑思路来实现. 该工具是运行在w ...

  5. 多任务-python实现-死锁,银行家算法(2.1.5)

    @ 目录 1.死锁 2.避免死锁的方式-银行家算法 1.死锁 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去.此时称系 ...

  6. Linux系列之Centos安装

    http://mirrors.aliyun.com/centos/6/isos/x86_64/可下载iso文件 第一步 笔记本进入BIOS开启虚拟化 第二步 进入vmware官网下载vm,作者用的是v ...

  7. MySQL高可用(二)主备延时如何解决?

    从上篇文章我们知道主备同步是依赖于 binlog,主库负责生产 binlog,备库负责消费 binlog,从而实现主备同步. 今天我们来学习一下主备同步里的一个重点的问题:主备延时. 主备延时,简单来 ...

  8. 图解HTTP权威指南 | HTTP报文

                                                                                    一.问题 1.报文流是如何流动的 2.H ...

  9. Ubuntu使用Nginx 部署你的静态网页

    首先使用Putty 登录填写名称  unbutu 然后获取管理员权限 sudo -i 首先更新APT库sudo apt-get updatesudo apt-get upgrade 安装 git,su ...

  10. 两千星 .NET5 框架 Furion 亮点分析(一)

    让 .NET 开发更简单,更通用,更流行. Furion 介绍 Furion 是基于 .NET5 平台下打造的现代化 Web 框架.旨在 让 .NET 开发更简单,更通用,更流行.. Furion 非 ...