方法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. abp.zero 9.0框架的前端Angular使用说明

    abp.zero 9.0框架的前端Angular使用说明 目录 abp.zero 9.0框架的前端Angular使用说明 摘要 1 部署及启动 1.1 依赖包安装 1.2 使用yarn安装依赖包 1. ...

  2. [日常摸鱼]bzoj1444 [JSOI2009]有趣的游戏——AC自动机+矩阵

    今天学校跳蚤市场摆摊聚众吸毒打call,东西卖了一百多好开心_(:з」∠)_ (然后大家中午就去吃了一顿好的x) 下午听演讲然后现在来填坑orz(其实是昨晚的坑) 题目:bzoj1444 先用字符串构 ...

  3. 仵航说 Vue项目如何打包并发布到linux服务器 仵老大

    1,打包 1.1首先你会在本地编辑好你的代码, 1.2然后在控制台输入 npm run build npm run build 1.3稍等片刻就打包完毕 2,位置 2.1打包完毕之后会在项目中生成一个 ...

  4. Python高级语法-私有属性-with上下文管理器(4.7.3)

    @ 目录 1.说明 2.代码 关于作者 1.说明 上下文管理器 这里使用with open操作文件,让文件对象实现了自动释放资源.我们也能自定义上下文管理器,通过__enter__()和__exit_ ...

  5. SpringBoot2 整合OAuth2组件,模拟第三方授权访问

    本文源码:GitHub·点这里 || GitEE·点这里 一.模式描述 授权服务 验证第三方服务的身份,验证邮箱用户的身份,记录和管理认证Token,为资源服务器提供Token校验.场景:第三方网站借 ...

  6. 详述网络中ARP安全的综合功能

    组网图形 ARP安全简介 ARP(Address Resolution Protocol)安全是针对ARP攻击的一种安全特性,它通过一系列对ARP表项学习和ARP报文处理的限制.检查等措施来保证网络设 ...

  7. 用Python写个开心消消乐小游戏

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 提到开心消消乐这款小游戏,相信大家都不陌生,其曾在 2015 年获得过玩家最喜爱的移动单机游戏奖,受 ...

  8. Java安全之Shiro 550反序列化漏洞分析

    Java安全之Shiro 550反序列化漏洞分析 首发自安全客:Java安全之Shiro 550反序列化漏洞分析 0x00 前言 在近些时间基本都能在一些渗透或者是攻防演练中看到Shiro的身影,也是 ...

  9. C#访问Access数据库提示未安装ISAM

    解决办法 1.在前面加上Jet OLEDB:,如: Jet OLEDB:Database Password='zt' <add name="ConStrOleDb" conn ...

  10. Excel 单元格快速填充技巧

    1.普通的复制填充空白单元格 直接左键选中单元格右下边框向下拉,选择填充格式(复制填充) 2.普通的顺序填充空白单元格 直接左键选中单元格右下边框向下拉,选择填充格式(序列填充) 3.其他方式填充空白 ...