由查找session IP 展开---函数、触发器、包
由查找session IP 展开---函数、触发器、包
一、userenv函数、sys_context函数
--查看当前client会话的session IP信息
SQL>select sys_context('userenv','ip_address') from dual;
SYS_CONTEXT('USERENV','IP_ADDRESS')
--------------------------------------------------------------------------------
192.168.56.117
展开:能够通过userenv函数或者sys_context函数能够获得当前会话的信息
SQL>SELECT USERENV('LANGUAGE') FROM DUAL;
USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.ZHS16GBK
--使用參数列举
--ISDBA:返回当前用户是否是dba。假设是则返回true
--SESSION:返回当前会话的标志
--EXTRYID:返回会话入口标志
--INSTANCE:返回当前instance的标志
--LANGUAGE:返回当前环境语言变量
--LANG:返回当前环境的语言缩写
--TERMINAL:返回用户的终端或机器的标志
SQL>SELECT SYS_CONTEXT('USERENV','LANGUAGE') FROM DUAL;
SYS_CONTEXT('USERENV','LANGUAGE')
------------------------------------------------------------------------------------------------
AMERICAN_AMERICA.ZHS16GBK
SQL>select sys_context('userenv','host') from dual;
SYS_CONTEXT('USERENV','HOST')
--------------------------------------------------------------------------------
WORKGROUP\FPA4GFVZXULBFCR
二、v$session视图中
通过v$session视图,将客户端IP信息存入client_identifier字段或client_info字段
使用client_info字段
SQL>execdbms_application_info.set_client_info(sys_context('userenv','ip_address'));
SQL>select username,sid,serial#,client_info,client_identifier from v$session wheresid=(select sys_context('userenv','sid') from dual);
使用client_identifier字段
SQL>exec dbms_session.set_identifier(sys_context('userenv','ip_address'));
SQL>select username,sid,serial#,client_info,client_identifier from v$session wheresid=(select sys_context('userenv','sid') from dual);
范例截图例如以下:
三、触发器
通过触发器调用,新的客户端连接开启时自己主动触发。将IP信息写入client_info字段
create or replace triggeron_login_trigger
after logon on database
begin
dbms_application_info.set_client_info(sys_context('USERENV','IP_ADDRESS'));
end;
/
通过触发器调用,新的客户端连接开启时自己主动触发,将IP信息写入client_identifier字段
create or replace triggeron_login_trigger
after logon on database
begin
dbms_session.set_identifier(sys_context('userenv','ip_address'));
end;
/
四、使用UTL_INADDR Package
在没有触发器记录的前提下,通过UTL_INADDR Package来实现获取SESSION IP,并且能够获取其他SESSION IP。
通过说明UTL_INADDR Package的工作原理,体现出UTL_INADDR Package是怎样实现的。
实验分析開始:
[root@org54~]# ps -ef |grep sql
oracle 2740 2707 0 21:17 pts/1 00:00:00 sqlplus
oracle 3479 3451 0 21:49 pts/2 00:00:00 sqlplus
root 3482 3375 0 21:49 pts/3 00:00:00 grep sql
[root@org54~]# su - oracle
[oracle@org54~]$ ps -ef |grep LO
oracle 2770 2740 0 21:18 ? 00:00:00 oraclemetro (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
oracle 3480 3479 0 21:49 ?
00:00:00 oraclemetro(DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
oracle 3520 3488 0 21:50 pts/3 00:00:00 grep LO
补充:安装strace工具,跟踪进程运行时的系统调用和所接收的信号。
——引用自网络,strace注解:在Linux世界,进程不能直接訪问硬件设备,当进程须要訪问硬件设备(比方读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式。通过系统调用訪问硬件设备。strace能够跟踪到一个进程产生的系统调用,包含參数,返回值。运行消耗的时间。
——引用结束。
[root@org54RHEL_5.5 x86_64 DVD]# cd Server/ --使用linux光盘安装工具
[root@org54Server]# ls -ll |grep strace
-r--r--r-- 326root root 175066 Jan 18 2010 strace-4.5.18-5.el5_4.1.i386.rpm
[root@org54Server]# rpm -ivh strace-4.5.18-5.el5_4.1.i386.rpm
warning:strace-4.5.18-5.el5_4.1.i386.rpm: Header V3 DSA signature: NOKEY, key ID37017186
Preparing... ########################################### [100%]
1:strace ###########################################[100%]
[root@org54Server]# rpm -qa |grep strace
strace-4.5.18-5.el5_4.1
补充完成
[oracle@org54~]$ strace -p 2770 --打开跟踪
SQL>SELECT UTL_INADDR.get_host_address('org54') from dual; --运行查询
UTL_INADDR.GET_HOST_ADDRESS('ORG54')
--------------------------------------------------------------------------------------------------------
192.168.56.5
到strace跟踪信息界面下,查看信息例如以下:
Process 2770attached - interrupt to quit
read(8,"\0\323\0\0\6\0\0\0\0\0\3^!a\200\0\0\0\0\0\0TL\351\tj\0\0\0|\360\345"...,2064) = 211
gettimeofday({1404438819,340059}, NULL) = 0
gettimeofday({1404438819,340388}, NULL) = 0
getrusage(RUSAGE_SELF,{ru_utime={0, 440932}, ru_stime={0, 423935}, ...}) = 0
times(NULL) = 429805698
gettimeofday({1404438819,343035}, NULL) = 0
gettimeofday({1404438819,343625}, NULL) = 0
getrusage(RUSAGE_SELF,{ru_utime={0, 440932}, ru_stime={0, 423935}, ...}) = 0
gettimeofday({1404438819,344254}, NULL) = 0
times(NULL) = 429805698
getrusage(RUSAGE_SELF,{ru_utime={0, 440932}, ru_stime={0, 423935}, ...}) = 0
getrusage(RUSAGE_SELF,{ru_utime={0, 440932}, ru_stime={0, 423935}, ...}) = 0
times(NULL) = 429805698
gettimeofday({1404438819,345897}, NULL) = 0
gettimeofday({1404438819,346375}, NULL) = 0
getrusage(RUSAGE_SELF,{ru_utime={0, 440932}, ru_stime={0, 423935}, ...}) = 0
getrusage(RUSAGE_SELF,{ru_utime={0, 440932}, ru_stime={0, 423935}, ...}) = 0
gettimeofday({1404438819,348358}, NULL) = 0
getrusage(RUSAGE_SELF,{ru_utime={0, 440932}, ru_stime={0, 423935}, ...}) = 0
gettimeofday({1404438819,349038}, NULL) = 0
gettimeofday({1404438819,349493}, NULL) = 0
gettimeofday({1404438819,349742}, NULL) = 0
gettimeofday({1404438819,350092}, NULL) = 0
getrusage(RUSAGE_SELF,{ru_utime={0, 440932}, ru_stime={0, 423935}, ...}) = 0
gettimeofday({1404438819,350832}, NULL) = 0
gettimeofday({1404438819,351126}, NULL) = 0
gettimeofday({1404438819,351435}, NULL) = 0
gettimeofday({1404438819,351851}, NULL) = 0
gettimeofday({1404438819,352268}, NULL) = 0
getrusage(RUSAGE_SELF,{ru_utime={0, 440932}, ru_stime={0, 423935}, ...}) = 0
gettimeofday({1404438819,353079}, NULL) = 0
gettimeofday({1404438819,353494}, NULL) = 0
open("/etc/hosts",O_RDONLY) = 24
--注意此条语句,表示当我们进行UTL_INADDR.get_host_address查询时。后台进程会去读取hosts文件,假设存在解析关系,便会返回信息显示,下面会验证假设没有解析的现象
fcntl64(24,F_GETFD) = 0
fcntl64(24,F_SETFD, FD_CLOEXEC) = 0
fstat64(24,{st_mode=S_IFREG|0644, st_size=416, ...}) = 0
mmap2(NULL,4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x11a000
read(24,"# Do not remove the following li"..., 4096) = 416
close(24) = 0
munmap(0x11a000,4096) = 0
gettimeofday({1404438819,359617}, NULL) = 0
gettimeofday({1404438819,359908}, NULL) = 0
getrusage(RUSAGE_SELF,{ru_utime={0, 441932}, ru_stime={0, 424935}, ...}) = 0
gettimeofday({1404438819,360851}, NULL) = 0
gettimeofday({1404438819,363074}, NULL) = 0
getrusage(RUSAGE_SELF,{ru_utime={0, 442932}, ru_stime={0, 424935}, ...}) = 0
getrusage(RUSAGE_SELF,{ru_utime={0, 442932}, ru_stime={0, 424935}, ...}) = 0
times(NULL) = 429805700
gettimeofday({1404438819,366127}, NULL) = 0
write(11,"\1Q\0\0\6\0\0\0\0\0\20\27\30\252g\312N\23\337\326\212\21+%R>\367|xr\7\3"...,337) = 337
read(8,"\0\25\0\0\6\0\0\0\0\0\3\5\"\21\0\0\0\17\0\0\0", 2064) = 21
gettimeofday({1404438819,369259}, NULL) = 0
gettimeofday({1404438819,369906}, NULL) = 0
getrusage(RUSAGE_SELF,{ru_utime={0, 442932}, ru_stime={0, 424935}, ...}) = 0
times(NULL) = 429805701
gettimeofday({1404438819,370962}, NULL) = 0
gettimeofday({1404438819,371394}, NULL) = 0
getrusage(RUSAGE_SELF,{ru_utime={0, 442932}, ru_stime={0, 424935}, ...}) = 0
gettimeofday({1404438819,372304}, NULL) = 0
gettimeofday({1404438819,372741}, NULL) = 0
gettimeofday({1404438819,373117}, NULL) = 0
getrusage(RUSAGE_SELF,{ru_utime={0, 442932}, ru_stime={0, 424935}, ...}) = 0
getrusage(RUSAGE_SELF,{ru_utime={0, 442932}, ru_stime={0, 424935}, ...}) = 0
times(NULL) = 429805701
gettimeofday({1404438819,375003}, NULL) = 0
gettimeofday({1404438819,375561}, NULL) = 0
gettimeofday({1404438819,376567}, NULL) = 0
write(11,"\0\204\0\0\6\0\0\0\0\0\4\1\0\0\0\37\0\1\1\0\0\0{\5\0\0\0\0\21\0\0\0"...,132) = 132
read(8,"\0\34\0\0\6\0\0\0\0\0\21i#L,\351\t\1\0\0\0\21\0\0\0\3\223$", 2064) =28
gettimeofday({1404438819,378886}, NULL) = 0
gettimeofday({1404438819,379120}, NULL) = 0
getrusage(RUSAGE_SELF,{ru_utime={0, 442932}, ru_stime={0, 424935}, ...}) = 0
times(NULL) = 429805702
gettimeofday({1404438819,380076}, NULL) = 0
gettimeofday({1404438819,380433}, NULL) = 0
getrusage(RUSAGE_SELF,{ru_utime={0, 442932}, ru_stime={0, 424935}, ...}) = 0
getrusage(RUSAGE_SELF,{ru_utime={0, 442932}, ru_stime={0, 424935}, ...}) = 0
times(NULL) = 429805702
getrusage(RUSAGE_SELF,{ru_utime={0, 442932}, ru_stime={0, 424935}, ...}) = 0
times(NULL) = 429805702
gettimeofday({1404438819,384734}, NULL) = 0
gettimeofday({1404438819,385145}, NULL) = 0
getrusage(RUSAGE_SELF,{ru_utime={0, 442932}, ru_stime={0, 424935}, ...}) = 0
getrusage(RUSAGE_SELF,{ru_utime={0, 442932}, ru_stime={0, 424935}, ...}) = 0
times(NULL) = 429805703
gettimeofday({1404438819,386442}, NULL) = 0
gettimeofday({1404438819,386802}, NULL) = 0
gettimeofday({1404438819,387042}, NULL) = 0
write(11,"\0\21\0\0\6\0\0\0\0\0\t\1\0\0\0!\0", 17) = 17
read(8,
*缺少hosts解析时,UTL_INADDR.get_host_address查询现象
[root@org54~]# vi /etc/hosts --将clientFPA4GFVZXULBFCR解析地址凝视掉
# Do notremove the following line, or various programs
# that requirenetwork functionality will fail.
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
192.168.56.11rac11
192.168.56.22rac22
192.168.56.31rac11-vip
192.168.56.32rac22-vip
192.168.2.11rac11-priv
192.168.2.22rac22-priv
192.168.56.7node1
192.168.56.8gc1
192.168.56.5 org54
#192.168.56.117FPA4GFVZXULBFCR
~
~
"/etc/hosts"19L, 417C written
client登陆
主机端:
SQL>col MACHINE for a50
SQL>select username,machine,program,sql_id from v$session where username is notnull
--查询到登陆主机
USERNAME MACHINE PROGRAM SQL_ID
------------------------------------------------------------- -------------
SYS org54 sqlplus@org54 (TNS V1-V3)
SCOTT WORKGROUP\FPA4GFVZXULBFCR sqlplus.exe
SYS org54 sqlplus@org54 (TNS V1-V3) 8w8k8ss45hm25
SQL>select UTL_INADDR.get_host_address('FPA4GFVZXULBFCR') from dual; --在没有hosts解析的情况下,报错了
selectUTL_INADDR.get_host_address('FPA4GFVZXULBFCR') from dual
*
ERROR at line1:
ORA-29257:host FPA4GFVZXULBFCR unknown
ORA-06512: at"SYS.UTL_INADDR", line 19
ORA-06512: at"SYS.UTL_INADDR", line 40
ORA-06512: atline 1
[root@org54~]# vi /etc/hosts --将clientFPA4GFVZXULBFCR解析地址又一次加入进去
# Do notremove the following line, or various programs
# that requirenetwork functionality will fail.
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
192.168.56.11rac11
192.168.56.22rac22
192.168.56.31rac11-vip
192.168.56.32rac22-vip
192.168.2.11rac11-priv
192.168.2.22rac22-priv
192.168.56.7node1
192.168.56.8gc1
192.168.56.5 org54
192.168.56.117FPA4GFVZXULBFCR
~
~
"/etc/hosts"19L, 417C written
SQL>select UTL_INADDR.get_host_address('FPA4GFVZXULBFCR') from dual; --再次发起查询
UTL_INADDR.GET_HOST_ADDRESS('FPA4GFVZXULBFCR')
--------------------------------------------------------------------------------------------------------
192.168.56.117
小结:
综上可知,使用UTL_INADDR Package在捕获SESSION IP时不再依赖数据库的信息。在触发器没有记录的情况下。能够实现捕捉其他SESSION的地址信息。
***********************************************声明************************************************
原创作品。出自 “深蓝的blog” 博客,欢迎转载,转载时请务必注明出处(http://blog.csdn.net/huangyanlong)。
表述有错误之处,请您留言,不胜感激。
*****************************************************************************************************
由查找session IP 展开---函数、触发器、包的更多相关文章
- Oracle中如何导出存储过程、函数、包和触发器的定义语句?如何导出表的结构?如何导出索引的创建语句?
Oracle中如何导出存储过程.函数.包和触发器的定义语句?如何导出表的结构?如何导出索引的创建语句? QQ群里有人问:如何导出一个用户下的存储过程? 麦苗答:方法有多种,可以使用DBMS_MET ...
- oracle PL/SQL(procedure language/SQL)程序设计之函数+过程+包
匿名PL/SQL块回顾 DECLARE (可选) 定义在PL/SQL块中要使用的对象BEGIN (必须) 执行语句EXCEPTION (可选) 错误处理语句END; (必须)匿名块( ...
- oracle PL/SQL(procedure language/SQL)程序设计之函数+过程+包(转)
匿名PL/SQL块回顾 DECLARE (可选) 定义在PL/SQL块中要使用的对象 BEGIN (必须) 执行语句 EXCEPTION (可选) 错误处理语句 END; (必 ...
- Oracle学习2 视图 索引 sql编程 游标 存储过程 存储函数 触发器
---视图 ---视图的概念:视图就是提供一个查询的窗口,来操作数据库中的数据,不存储数据,数据在表中. ---一个由查询语句定义的虚拟表. ---查询语句创建表 create table emp a ...
- oracle中的创建过程,函数,包
一.创建存储过程 存储过程是在oracle中存取完成特定业务逻辑的代码块.存储过程是命名块,匿名块不存在数据库中,命名块会存储到数据库中,匿名块每次运行都需要提前编译,命名块一次存储,只会编译一次.命 ...
- 数字转IP地址函数
--------------------------------------------------------------------- -- Author : htl258(Tony) -- Da ...
- TCP/IP协议栈与数据包封装+TCP与UDP区别
ISO制定的OSI参考模型的过于庞大.复杂招致了许多批评.与此对照,由技术人员自己开发的TCP/IP协议栈获得了更为广泛的应用.如图2-1所示,是TCP/IP参考模型和OSI参考模型的对比示意图. T ...
- 查看SQL SERVER 加密存储过程,函数,触发器,视图
原文:查看SQL SERVER 加密存储过程,函数,触发器,视图 create PROCEDURE sp_decrypt(@objectname varchar(50))ASbeginset noc ...
- 获取手机浏览器IP的函数
function GetIP() { if (!empty($_SERVER['HTTP_CLIENT_IP'])) { //如果变量是非空或非零的值,则 empty()返回 FALSE. $IP = ...
随机推荐
- nyoj201 作业题
作业题 时间限制: 3000 ms | 内存限制: 65535 KB 难度: 3 描述 小白同学这学期有一门课程叫做<数值计算方法>,这是一门有效使用数字计算机求数学问题近似解的方 ...
- Android自定义控件(二)——有弹性的ScrollView
本文在http://gundumw100.iteye.com/blog/1075286的基础上稍作修改, 实现了当手指滑动到ScrollView的顶部.底部时, 可以继续的向上.向下拉伸.当释放手指的 ...
- EF中执行原生sql与使用Local获取本地数据
使用DbSet的Local属性可以访问当前context中被追踪且没有被标记为删除的实体(内存中的数据) using (var context = new BloggingContext()) { / ...
- PixelFormat 枚举
成员名称 说明 Alpha 像素数据包含没有进行过自左乘的 alpha 值. Canonical 默认像素格式,每像素 32 位. 此格式指定 24 位颜色深度和一个 8 位 alpha 通道. Do ...
- Java数据结构漫谈-Stack
Stack(栈)是一种比较典型的数据结构,其元素满足后进先出(LIFO)的特点. Java中Stack的实现继承自Vector,所以其天然的具有了一些Vector的特点,所以栈也是线程安全的. cla ...
- hdu4355 三分
F - 三分 Crawling in process... Crawling failed Time Limit:2000MS Memory Limit:32768KB 64bit I ...
- hdfs-over-ftp安装与配置
hdfs-over-ftp是一个开源,简单易用的实现了对HDFS系统的下载和上传功能的小工具.可以作为管理工具来使用,快捷方便. 1 安装jdk(1.6以上版本)并配置环境变量分别执行java -ve ...
- No-args constructor for class does not exist. Register an InstanceCreator with G
有时候我们在使用Googel官方的json解析包时,如果自己的实体类中出现代参的构造函数.在1.4的jar中,如果类造型中有参数,就会调用不了无参构造器,(如:HashMap的构造器就会有参数) 参考 ...
- CSS3 基础知识
CSS3 基础知识1.边框 1.1 圆角 border-radius:5px 0 0 5px; 1.2 阴影 box-shadow:2px 3px 4px 5px rgba(0,0,0 ...
- UIP协议栈
UIP协议栈笔记 http://blog.chinaunix.net/uid-23247944-id-2974928.html