`
juji1010
  • 浏览: 114997 次
社区版块
存档分类
最新评论

oracle:获取session的IP地址

阅读更多
方法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 11g安装配置

    准备从以下地址启动 Oracle Universal Installer /tmp/OraInstall2011-10-12_08-07-32PM. 请稍候... SHAPE \* MERGEFORMAT 典型的安装设置 单实例数据库、企业版、管理口令 基本目录:/opt/oracle/ 软件位置...

    Oracle 主要配置文件介绍

    其缺省的名称为 LISTENER 这个监听器缺省以tcp/ip为协议地址且端口号为1521运行 在CAMS应用中 监听文件定义的监听器就使用这个缺省名字 并且使用缺省的协议 tcp/ip 和缺省的端口号 1521 待配置好监听文件...

    Oracle练习.txt

    3.如何在Oracle服务器上通过SQLPLUS查看本机IP地址 ? select sys_context('userenv','ip_address') from dual; 如果是登陆本机数据库,只能返回127.0.0.1 4.如何给表、列加注释? SQL>comment on table 表 is '表...

    ORACLE应用中常见的傻瓜问题1000问-1

    如何在Oracle服务器上通过SQLPLUS查看本机IP地址 ? <br> select sys_context( userenv , ip_address ) from dual; <br> 如果是登陆本机数据库,只能返回127.0.0.1,呵呵 <br> 20. unix 下怎幺调整...

    oracle asm rac

    配置IP地址 使用setup命令修改IP 分别配置eth0和eth1(我们只演示node1的配置,node2也配置成相应的IP) 保存退出 重启使配置生效 3、关闭没必要的服务 chkconfig autofs off chkconfig acpid off ...

    weblogic集群部署文档.docx

    9.填写各个受管理服务器的详细信息,这里要注意的是new_ManagedServer_2的监听地址填的是主机2的ip地址,因为这个服务实际是运行在主机2上nodes_1和nodes_2 的ip为实际节点机器的ip端口为实际生产环境的port , ...

    Linux部署服务器常用命令.doc

    /usr/kde/3.5/sbin:/usr/kde/3.5/bin:/usr/qt/3/bin 如果ifconfig没行就打上面的,配置环境变量 cat /etc/sysconfig/network-scripts/ifcfg-eth0 IP地址配置文件 cat /etc/passwd 本机多少用户 su - oracle 切换用户...

    超级有影响力霸气的Java面试题大全文档

    redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。 23、EJB与JAVA BEAN的区别?  Java Bean 是可...

    java 面试题 总结

    redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。 20、EJB与JAVA BEAN的区别? Java Bean 是可复用...

    C#基类库(苏飞版)

    获取物理地址 3.普通下载 4.分块下载 5.输出硬盘文件,提供下载 支持大文件、续传、速度限制、资源占用小 复制代码 FileUp 1.把上传的文件转换为字节数组 2.流转化为字节数组 2.上传文件根据FileUpload控件上传 3...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例111 通过IP地址查找主机所在地 142 实例112 解决用substr()函数对中文字符串截取时出现乱码的问题 143 实例113 字符串与HTML标记相互转换 144 实例114 运用PHP 5.0新型字符串输出XML数据 145 实例115 判断字符串...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例111 通过IP地址查找主机所在地 142 实例112 解决用substr()函数对中文字符串截取时出现乱码的问题 143 实例113 字符串与HTML标记相互转换 144 实例114 运用PHP 5.0新型字符串输出XML数据 145 实例115 判断字符串...

    .net 稳定 高效 易用 可同步 TCP 通信框架

    设置服务器的IP地址 TcpSettings.DeafultIPAddress = "192.168.1.3"; TcpSettings.DefultPort = 8511;//不设置端口会使用默认端口。 这样就可以使用默认的静态客户端了。 也可以自己创建对象。 客户端创建后...

    JAVA上百实例源码以及开源项目

    6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...

    mysql-8.0.20-macos10.15-x86_64.tar.gz

    博客地址 下载mysql-8.0.20-macos10.15-x86_64.tar.gz 可以从mysql官网下载,如果比较慢, 从https://download.csdn.net/download/long4512524/12427861 中下载 解压 tar zxvf mysql-8.0.20-macos10.15-x86_64....

    JAVA上百实例源码以及开源项目源代码

    6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    有IP地址、用户名与密码等,可以下载一个FTP上传工具(cure)上传更新后的内容.可以在http://www.skycn.com/soft/683.html下载到. 下载以后,通过"站点管理"-->"新建站点".输入IP,用户名,密码.然后连接即可. 当然也...

Global site tag (gtag.js) - Google Analytics