验证ORA_CLIENT_IP_ADDRESS只在系统触发器中有效

--------------------------------------------------------------------------
-----------------------------Cryking原创------------------------------
-----------------------转载请注明出处,谢谢!------------------------ 

 

ORA_CLIENT_IP_ADDRESS函数的功能是以VARCHAR2类型返回客户端IP地址,一般只用在系统触发器中,其实它也只在系统触发器中有效.

经常看到有人说使用ORA_CLIENT_IP_ADDRESS获得的IP为空,大概也是这个原因造成的.

这里采用DDL触发器和系统触发器做对比.

首先准备实验用的表及两个触发器对象(一个DDL触发器,一个系统触发器)

--建立记录表
23:37:15 SYS@orcl> create table t01(id number,nn varchar2(40));
Elapsed: 00:00:00.05
--建立系统触发器
23:37:53 SYS@orcl> create or replace trigger ORA_TEST
23:38:16   2    after logon ON database
23:38:16   3  BEGIN
23:38:16   4    dbms_output.put_line(ORA_LOGIN_USER||'IP:'||NVL(ORA_CLIENT_IP_ADDRESS,'AA'));
23:38:16   5    insert into t01 select nvl(max(id),0)+1,ORA_LOGIN_USER||'[system Trigger]IP:'||NVL(ORA_CLIENT_IP_ADDRESS,'AA') from t01;
23:38:16   6  end;
23:38:17   7  /
Elapsed: 00:00:00.05
--建立DDL触发器
23:38:19 SYS@orcl> create or replace trigger ORA_TEST_ddl
23:38:38   2    after ddl ON database
23:38:38   3  BEGIN
23:38:38   4    dbms_output.put_line(ORA_LOGIN_USER||'IP:'||NVL(ORA_CLIENT_IP_ADDRESS,'AA'));
23:38:38   5    insert into t01 select nvl(max(id),0)+1,ORA_LOGIN_USER||'[DDL Trigger]IP:'||NVL(ORA_CLIENT_IP_ADDRESS,'AA') from t01;
23:38:38   6  end;
23:38:38   7  /
Elapsed: 00:00:00.11


其中特别加了ORA_LOGIN_USER来标识登录的用户,以及DDL Trigger和system Trigger字串来标识触发的是哪个触发器.

--先测试系统触发器,发现dbms_output.put_line没有输出
00:06:11 @orcl> conn cry/cry
Connected.
00:09:28 CRY@orcl> conn scott/tiger
Connected.
00:09:37 SCOTT@orcl> conn sys/ as sysdba
Connected.

此时的表t01为

00:09:40 SYS@orcl> select * from t01;

        ID NN
---------- ----------------------------------------
         1 CRY[system Trigger]IP:192.168.123.102
         2 SCOTT[system Trigger]IP:192.168.123.102
         3 SYS[system Trigger]IP:192.168.123.102
Elapsed: 00:00:00.02

从表t01中发现ORA_CLIENT_IP_ADDRESS函数在系统触发器中有效,并且成功的返回了IP地址.

(PS:还可以看出在系统触发器中dbms_output.put_line失效了,没有输出任何东西)

--再测试DDL触发器,发现dbms_output.put_line有输出
00:10:11 @orcl> conn cry/cry
Connected.
00:11:17 CRY@orcl> create table cry01(id number);
CRYIP:AA
Elapsed: 00:00:00.07
00:11:47 CRY@orcl> conn scott/tiger
Connected.
00:12:00 SCOTT@orcl> create table scott01(id number);
SCOTTIP:AA
Elapsed: 00:00:00.05
00:12:20 @orcl> conn sys/ as sysdba
Connected.
00:12:23 SYS@orcl> create table sys01(id number);
SYSIP:AA
Elapsed: 00:00:00.04


注意带AA的都是dbms_output.put_line输出的,这说明在DDL触发器中dbms_output.put_line是有效的.

此时的T01记录表为:

00:12:33 SYS@orcl> select * from t01;

        ID NN
---------- ----------------------------------------
         1 CRY[system Trigger]IP:192.168.123.102
         2 SCOTT[system Trigger]IP:192.168.123.102
         3 SYS[system Trigger]IP:192.168.123.102
         4 CRY[system Trigger]IP:192.168.123.102
         5 CRY[DDL Trigger]IP:AA
         6 SCOTT[system Trigger]IP:192.168.123.102
         7 SCOTT[DDL Trigger]IP:AA
         8 SYS[system Trigger]IP:192.168.123.102
         9 SYS[DDL Trigger]IP:AA
Elapsed: 00:00:00.02

其中ID为1、2、3为上面登录三个用户时触发的系统触发器记录,第4条记录对应测试DDL触发器时登录的cry用户(登录触发了系统触发器)

第5条记录测试cry用户创建表cry01时触发的DDL触发器记录(此时我们可以发现ORA_CLIENT_IP_ADDRESS已经返回为空了,并将空转换为了字符'AA',可以去前面看DDL触发器的定义),

继续往下看发现只要是DDL Trigger的都没有记录IP,也就是ORA_CLIENT_IP_ADDRESS返回的IP为空了,而明显的system Trigger都有IP.

00:18:26 SYS@orcl> SELECT ORA_CLIENT_IP_ADDRESS FROM DUAL;

ORA_CLIENT_IP_ADDRESS
----------------------------------------------------------
<null>
Elapsed: 00:00:00.02

 

ORA_CLIENT_IP_ADDRESS虽然是函数,但是直接调用也是为空的

----
综上说明ORA_CLIENT_IP_ADDRESS函数只在系统触发器中起作用。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1)rpm格式包安装配置 1.1 下载以rpm后缀名的包,以11.2.0.4.0 版本为例,其基础包basic、sql*plus、devel包建议默认下载,其他包视情况而定: oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm --基础包,为了运行OCI、OCCI、JDBC-OCI 这几个应用程序; oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64.rpm --补充包/文件,是为了运行sql*plus的即时客户端; oracle-instantclient11.2-odbc-11.2.0.4.0-1.x86_64.rpm --补充包/文件,为运行ODBC环境附加库; oracle-instantclient11.2-jdbc-11.2.0.4.0-1.x86_64.rpm --补充JDBC下的XA、国际标准、行集操作; oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm --包含头文件和示例文件,为开发Oracle应用程序的即时客户端; 1.2 使用rpm -ivh [包名] 进行安装, 如:rpm -ivh oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm 安装的文件默认放在两个位置: 头文件:/usr/include/oracle/11.2/client64/ 下,如果在使用时报错找不到头文件,记得看路径是否是这个。 包文件:/usr/lib/oracle/11.2/client64/ 下,包含{bin、lib}两个文件夹; 1.3 创建文件夹: #mkdir -p /usr/lib/oracle/11.2/client64/network/admin/ 1.4 创建监听文件,并添加内容 #vim /usr/lib/oracle/11.2/client64/network/admin/tnsnames.ora ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = *IP*)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = *SID*) ) ) 1.5 配置环境变量 #vim ~/.bashrc --根目录下为全局使用,为限制用户权限,可只修改某一用户的环境变量 export ORACLE_HOME=/usr/lib/oracle/11.2/client64 export TNS_ADMIN=$ORACLE_HOME/network/admin export NLS_LANG='simplified chinese_china'.ZHS16GBK export LD_LIBRARY_PATH=$ORACLE_HOME/lib export PATH=$ORACLE_HOME/bin:$PATH 1.6 使配置完的环境变量生效 #source ~/.bashrc 1.7 连接数据库测试 #sqlplus /nolog SQL>conn scott/tiger@orcl 2)zip格式包安装配置(只以basic包做为示例) 2.1 下载包:oracle-instantclient11.2-basic-11.2.0.1.0-1.x86_64.zip 2.2 将包文件解压到指定目录下: #unzip oracle-instantclient11.2-basic-11.2.0.1.0-1.x86_64.zip 解压后的文件存放路径可以自行设定,但是与后面环境变量设定有关,本文设定/home/orcl/ 下。 头文件目录:/home/orcl/sdk/include/ 库文件目录:/home/orcl/instantclient_11_2/ 2.3 创建 network/admin/ 目录:mkdir -p /home/orcl/instantclient_11_2/network/admin/ 2.4 创建监听文件 tnsnames.ora #vim /home/orcl/instantclient_11_2/network/admin/tnsnames.ora ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.232.131)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) 2.5 配置环境变量 #vim ~/.bashrc export ORACLE_HOME=/home/orcl/instantclient_11_2 export TNS_ADMIN=$ORACLE_HOME/network/adminexport export NLS_LANG='simplified chinese_china'.ZHS16GBKexport export LD_LIBRARY_PATH=$ORACLE_HOME export PATH=$ORACLE_HOME:$PATH 2.6 配置完成后,将环境变量生效 #source ~/.bashrc 2.7 测试连接

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值