方法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. springmvc表单标签库的使用

    springmvc中可以使用表单标签库,支持数据绑定,用来将用户输入绑定到领域模型. 例子来源<Servlet.JSP和SpringMVC学习指南> 项目代码 关键代码及说明 bean对象 ...

  2. wsgi和asgi的关系

    什么是WSGI #CGI CGI(Common Gateway Interface,通用网关接口),定义客户端与Web服务器的交流方式的一个程序,例如正常情况下客户端发送过来一个请求,根据HTTP协议 ...

  3. python 类和方法(面向对象)

    类和方法 name = "Jack" city = "bejing" print("my name is %S and come from %s &q ...

  4. css 01-CSS属性:字体属性和文本属性

    01-CSS属性:字体属性和文本属性 #本文重要内容 CSS的单位 字体属性 文本属性 定位属性:position.float.overflow等 #CSS的单位 html中的单位只有一种,那就是像素 ...

  5. [OI笔记]后缀自动机

    本来没打算写的,不过想想看后缀自动机的理论看了两三天了才有点懂(我太傻了)-下周期末考的话大概要去复习一下文化课感觉回来又要忘得差不多,还是开篇blog记一下好了. 相关的资料: cls当年的课件:2 ...

  6. C# 中 ConcurrentDictionary 一定线程安全吗?

    根据 .NET 官方文档的定义:ConcurrentDictionary<TKey,TValue> Class 表示可由多个线程同时访问的线程安全的键/值对集合.这也是我们在并发任务中比较 ...

  7. CORS(跨域资源共享)笔记

    0.前言 CORS(Cross-Origin Resource Sharing)是一个用于处理跨域问题的W3C标准,本文将介绍什么是跨域,引起跨域的同源策略,什么是CORS,CORS的工作过程,请求方 ...

  8. Centos7.6上部署Supervisor来监控和操作各类服务

    supervisor    是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统.它可以很方便的监听.启动.停止.重启一个 ...

  9. 【入门必看】不理解「对象」?很可能有致命bug:简单的Python例子告诉你

    简介:越来越多的人要在学习工作中用到『编程』这个工具了,其中很大一部分人用的是Python.大部分人只是做做简单的科研计算.绘图.办公自动化或者爬虫,但-- 这就不需要理解「指针与面向对象」了吗? 在 ...

  10. [leetcode]49. Group Anagrams重排列字符串分组

    是之前的重排列字符串的延伸,判断是重排列后存到HashMap中进行分组 这种HashMap进行分组的方式很常用 public List<List<String>> groupA ...