方法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. react项目中对dom元素样式修改的另一种方法以及将组件插入到node节点中

    在项目中,以前如果遇到对dom元素的操作都是直接获取dom元素,比如说: 但是如果修改的样式比较多的话,不如直接"切换"dom元素,如下例子: 这样会节省一些性能.因为操作dom的 ...

  2. C# 海量数据瞬间插入到数据库的方法

    C# 海量数据瞬间插入到数据库的方法 当我们在数据库中进行大量的数据追加时,是不是经常因为数据量过大而苦恼呢?而所谓的海量数据,一般也是上万级的数据,比如我们要添加一百万条数据,应该如何提高它的效率呢 ...

  3. 微信小程序自动化,记录趟过的坑!

    项目思想:关键字+数据驱动混合测试 基于Android-微信小程序自动化的关键是:webview的切换 对于微信App来说如何从NATIVE切换到webview的过程 测试版本信息 1.微信版本:7. ...

  4. java-01-基础语法

    1. 注释 单行注释 格式: // 注释信息 多行注释 格式: /* 注释信息 */ 文档注释 格式: /** 注释信息 */ 2. 常量 定义:在程序运行过程中,其值不可发生改变的量 分类: 常量类 ...

  5. JavaScript var,let,const三个关键字的区别

    var: 1)声明作用域:在函数内部,使用var定义一个变量(局部变量),在函数被调用完之后,该变量会被立即销毁.在定义变量时如果省略var,就会创建一个全局变量(不建议在局部作用域中定义全局变量,难 ...

  6. SQL注入基本知识点总结

    SQL注入基本知识 information_schema    MySQL 中存储所有数据库名.所有表名.所有字段名的系统数据库叫 information_schema ,这是在 MySQL 数据库初 ...

  7. 54 个官方 Spring Boot Starters 出炉!别再重复造轮子了…….

    在之前的文章,栈长介绍了 Spring Boot Starters,不清楚的可以点击链接进去看下. 前段时间 Spring Boot 2.4.0 也发布了,本文栈长再详细总结下最新的 Spring B ...

  8. Python循环语句代码详解:while、for、break

    1 while循环 循环语句是程序设计中常用的语句之一.任何编程语言都有while循环,Python也不例外.while循环的格式如下所示.  while(表达式):       -   else:  ...

  9. java基础:详解类和对象,类和对象的应用,封装思想,构造方法详解,附练习案列

    1. 类和对象 面向对象和面向过程的思想对比 : 面向过程 :是一种以过程为中心的编程思想,实现功能的每一步,都是自己实现的 面向对象 :是一种以对象为中心的编程思想,通过指挥对象实现具体的功能 1. ...

  10. HCIP----静态实验

    要求: 1.全网可达 2.拓扑中所需地址全部基于192.168.0.0/24划分所得 3.使用静态路由 4.R1有三个环回,需要汇总 5.PC1与PC3属于同一VLAN,PC2和PC4属于同一VLAN ...