由查找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 = ...
随机推荐
- java实验7-多线程编程
1 利用Thread和Runnable创建线程 [实验目的] (1)理解用实现Runnable接口的方法实现多线程. (2)掌握线程优先级的设置. (3)加深对线程状态转换的理解. [实验要求] 要求 ...
- HashSet的分析(转)
一. HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set 的迭代顺序:特别是它不保证该顺序恒久不变.此类允许使用null元素. 二. ...
- Word文档分割总结
Word文档分割总结 方法: 1. word创建子文件实现文件分割 2. VBA实现 3. 网上分割合并的插件软件 一. word创建子文件实现文件分割 打开需要分割的文件 >> 视图 & ...
- 普通用户之间的ssh无密码访问设置方法
两台CentOS6.2服务器,客户端是node1,服务器是node2,先都用root用户配置,方法如下: 第一步:在客户端Node1:生成密匙对,我用的是rsa的密钥.使用命令 "ssh-k ...
- AVL树插入和删除
一.AVL树简介 AVL树是一种平衡的二叉查找树. 平衡二叉树(AVL 树)是一棵空树,或者是具有下列性质的二叉排序树: 1它的左子树和右子树都是平衡二叉树, 2且左子树和右子树高度之差的 ...
- Linux 下安装oracle数据库
原文出处 http://www.linuxidc.com/Linux/2015-02/113222.html 需要安装Oracle DataGuard,所以先要安装单台Oracle11g, ...
- Oracle遇到的一些问题
1.制造数据时出现错误 ORA-30009问题 计划任务: insert into test select rownum,sysdate from dual connect 会出现ORA-30009 ...
- ASP.NET MVC DefaultModelBinder
转载自 Leo‘s Blog 看到很多ASP.NET MVC项目还在从request.querystring或者formContext里面获取数据,这实在是非常落后的做法.也有的项目建了大量的自定义的 ...
- Android Development Tools 发生checkAndLoadTargetData错误
之前使用时没有出现任何问题的,我把D:\IDE\ADT\adt-bundle-windows-x86_64-20140321\eclipse目录下面的 eclipse.exe重名名为adt.exe并设 ...
- LeetCode_Unique Binary Search Trees
Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...