Oracle获取session的IP方法
创建触发器:
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
利用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方法的更多相关文章
- Python 优雅获取本机 IP 方法【转】
转自:https://www.cnblogs.com/lfxiao/p/9672975.html 见过很多获取服务器本地IP的代码,个人觉得都不是很好,例如以下这些 不推荐:靠猜测去获取本地IP方法 ...
- Python 优雅获取本机 IP 方法
原文 见过很多获取服务器本地IP的代码,个人觉得都不是很好,例如以下这些 不推荐:靠猜测去获取本地IP方法 #!/usr/bin/env python # -*- coding: utf-8 -*- ...
- Oracle获取session的trace
1. 使用参数SQL_TRACE 下面是官网对此参数的说明 SQL_TRACE Property Description Parameter type Boolean Default value fa ...
- Java正确获取客户端真实IP方法整理
在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实I ...
- 干货:Java正确获取客户端真实IP方法整理
在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实I ...
- 获取Session和request方法
action中的几种写法 //第一种很少用public class LoginAction1 extends ActionSupport { private Map request; ...
- C#获取本机IP方法,获取本机局域网IP地址方法
1. private void GetIP() { string hostName = Dns.GetHostName();//本机名 //System.Net.IPAddress[] address ...
- hibernate的获取session的两方法比较,和通过id获取对象的比较,一级缓存二级缓存
opensession与currentsession的联系与区别 在同一个线程中opensession的session是不一样的,而currentsession获取的session是一样的,这就保证了 ...
- Oracle获取alter.log的方法
10g下:可以在 admin\{sid}\pfile文件下的init.ora文件中找到以下内容:audit_file_dest = C:\ORACLE\PRODUCT\10.2.0\ADMIN\ORC ...
随机推荐
- JavaSE22-Lambda表达式&方法引用
1.Lambda表达式 1.1 Lambda表达式的标准格式 1 (形式参数) -> {代码块} 形式参数:如果有多个参数,参数之间用逗号隔开:如果没有参数,留空即可 ->:由英文中画线和 ...
- Java基础语法吐血整理
前言 自己的Java理论知识方面一直都不是很好,决定从0开始好好总结下,把想到的和以前不确定的(查阅资料确定)的知识整理一下,加油!!坚持!!! Java概述 Java三大体系 1.JavaSE 标准 ...
- linux之文本编辑器vi常用命令
由于经常在linux下面文本操作,所以这里稍微系统的总结一下自己常用的vi命令 1.打开命令: vi+filename (还有各种打开的姿势,只不过我比较顺手这个) 2.退出命令: :q 退出而 ...
- 来感受Linux命令行的“真香定律”
Shell看起来只是一个黑黑的命令框,刚开始接触会觉得很丑,毕竟与Win/Mac的华丽界面比起来,命令行终端直接可以丑拒了.但是,实际上它的功能要强大得多,毕竟Linux一开始就是广泛应用于服务器,通 ...
- 在Centos下使用Siege对Django服务进行压力测试
Siege是linux下的一个web系统的压力测试工具,支持多链接,支持get和post请求,可以对web系统进行多并发下持续请求的压力测试.今天我们就使用Siege来对Django进行一次压力测试, ...
- NET 5使用HangFire定时任务
注意:1. 当Hangfire服务由Web程序来启用时,默认情况下,web应用程序中的Hangfire服务器实例在第一个用户访问您的站点之前不会启动.甚至,有一些事件会在一段时间后导致web应用程序关 ...
- 数据库SQL调优的几种方式 EFcore读的情况下使用 AsNoTracking非跟踪查询
不要用GUID 当主键 没有规律 可以用雪花ID DBA 优化法则 硬件资源是根本,DBA是为了充分利用硬件资源 一般清空下可以不使用外键 可以提高性能 合理使用临时表 临时表分页; 一些查询语句加w ...
- C# 生成图片验证码 图片缩略图 水印
using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D ...
- wpf窗体项目 生成dll类库文件
我想把一个wpf应用程序的输出类型由windows应用程序改为类库该怎么做,直接在项目属性里改的话报错为 库项目文件无法指定applicationdefinition属性 wpf窗体项目运行之后bin ...
- 【Linux】使用笔记
前言 搜狗输入法,作为我体验最好的一个输入法,一直陪我从小学走到了现在,优麒麟线上发布会时,搜狗团队代表用"聪明"来形同它,事实也确实如此,它能十分人性地记录使用者常用的热词,并且 ...