方法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. 从面试角度分析ArrayList源码

    注:本系列文章中用到的jdk版本均为java8 ArrayList类图如下: ArrayList的底层是由数组实现的,数组的特点是固定大小,而ArrayList实现了动态扩容. ArrayList部分 ...

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

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

  3. disable_functions Bypass

    参考文章和poc(文中均有poc下载地址) : https://www.uedbox.com/post/59295/ https://www.uedbox.com/post/59402/ 当然 fre ...

  4. SQL注入----盲注总结

    参考文章:https://mp.weixin.qq.com/s?__biz=MzIzMTc1MjExOQ==&mid=2247490388&idx=1&sn=c677837d7 ...

  5. PHP函数number_format()

    PHP的number_format() 函数通过千位分组来格式化数字. 语法: number_format(number,decimals,decimalpoint,separator) 注释:该函数 ...

  6. PhPMyadmin拿Shell

    phpmyadmin 是一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,      --百度百科 1.入口寻找 目录扫描: 根据Linux对大小写敏感判断目标服 ...

  7. [LeetCode]148. Sort List链表归并排序

    要求时间复杂度O(nlogn),空间复杂度O(1),采用归并排序 传统的归并排序空间复杂度是O(n),原因是要用一个数组表示合并后的数组,但是这里用链表表示有序链表合并后的链表,由于链表空间复杂度是O ...

  8. [leetcode]39combinationsum回溯法找几个数的和为目标值

    import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Given a set of can ...

  9. Java学习日报7.10

    package Address;import java.util.Scanner; public class Address{ Scanner sc=new Scanner(System.in); p ...

  10. Android开发用到的几种常用设计模式浅谈(一):组合模式

    1:应用场景 Android中对组合模式的应用,可谓是泛滥成粥,随处可见,那就是View和ViewGroup类的使用.在android UI设计,几乎所有的widget和布局类都依靠这两个类.组合模式 ...