如何在trigger读取user值,是通过streams同步过来的数据

[复制链接]
查看11 | 回复8 | 2015-3-6 11:57:31 | 显示全部楼层 |阅读模式
把db1.A表的数据通过streams同步到db2.A表中,db2.A中有一个trigger用于记录一些log信息,
问题一是:当通过streams同步过来的数据,不会触发db2.A上的触发器,解决方法是在db2.A设置一下参数:
exec dbms_ddl.set_trigger_firing_property ('testuser', 'TR1_table_A', FALSE); 这个参数默认是true。设置好了,就可以触发db2.A上的触发器了。
但问题二是:这个触发器里面的user值无法得到,但其它的如sysdate则正常。而且如果是手工地在db2.A中插入一条数据,则user值则能得到。请问各位,通过streams同步过来的数据,触发器里不能得到这个user值吗?
这是db2.A上的触发器的SQL:
CREATE OR REPLACE TRIGGER TR1_table_A BEFORE UPDATE OR INSERT ON A FOR EACH ROW
BEGIN
IF dbms_ddl.is_trigger_fire_once('dms', 'TR1_table_A') THEN
insert into test1 values('true', to_char(sysdate,'DD/MM/YYYY HH24:MI:SS'));
ELSE
insert into test1 values('false', to_char(sysdate,'DD/MM/YYYY HH24:MI:SS'));
END IF;
IF USER IS NULL THEN
insert into test2 values('USER IS NULL', to_char(sysdate,'DD/MM/YYYY HH24:MI:SS'));
ELSE
insert into test2 values(USER, to_char(sysdate,'DD/MM/YYYY HH24:MI:SS'));
END IF;
END;
[ 本帖最后由 panys2000 于 2008-12-31 16:05 编辑 ]
回复

使用道具 举报

千问 | 2015-3-6 11:57:31 | 显示全部楼层
我试了ora_login_user,但结果同USER一样都为空,且ora_client_ip_address也为空。
但ora_database_name和ora_instance_num都是能得到的。
难道streams过来的数据,都通过自已的渠道,而不产生user,ora_login_user,ora_client_ip_address吗?
回复

使用道具 举报

千问 | 2015-3-6 11:57:31 | 显示全部楼层
I checked the document, seems no:
http://download.oracle.com/docs/ ... adg14evt.htm#998000
but why you need to know the username since by schema and appliction behavior you should be able to know which trigger you need to change?
回复

使用道具 举报

千问 | 2015-3-6 11:57:31 | 显示全部楼层
netbanker, thank your response.
好的,我把需求在说清楚点,现有三个DB(db_A,db_B,db_C),各有一个表T1。db_A和_dbC中的数据可以通过Streams同步到db_B中,此时数据同步到db_B后是不用做任何处理的。
但如果在db_B端手工地插入一条数据时,我们则需要根据一些业务分类,分别把这样的数据传回到db_A或db_C中。所以此时在db_B的T1中要能够区分这条数据的来源是:1 Streams同步过来的,还是2 db_B来身产生的。(db_B相当是一个所有DB数据的全集)
目前,我们能根据user为空认定它是1 Streams同步过来的,否则是2 db_B来身产生的。但这种判断为空的作法不严谨,只是试验出来的,我是想确切地知道,是不是对于1就是不能得到user的值,还是说某个地方设的不对
回复

使用道具 举报

千问 | 2015-3-6 11:57:31 | 显示全部楼层
不知道你能不能自己写个规则,然后
DBMS_STREAMS_ADM.set_rule_transform_function(
rule_name=> capture_dml_rule,
transform_function=> '规则代码');
END;
/
用TRIGGER估计不台好把值读出来.
回复

使用道具 举报

千问 | 2015-3-6 11:57:31 | 显示全部楼层
if I were you, I would prefer to set up some conflict rule (put your logic in it) to resolve your problem, not by stream schema, you are making your case more complicated.
回复

使用道具 举报

千问 | 2015-3-6 11:57:31 | 显示全部楼层
set_rule_transform_function和conflict rule都是好的方法,我会考虑的。
之所以坚持trigger,是因为现有的大量的代码都是基于trigger的,不想有太大的变更。
得到null是不是有可能是streams bug,如果是这样,真不用再去研究了
回复

使用道具 举报

千问 | 2015-3-6 11:57:31 | 显示全部楼层
ok, I gave you my suggestion, add column in ur table with database name using trigger insert data. hope you know what I mean
回复

使用道具 举报

千问 | 2015-3-6 11:57:31 | 显示全部楼层
原帖由 netbanker 于 2009-1-16 05:22 发表
ok, I gave you my suggestion, add column in ur table with database name using trigger insert data. hope you know what I mean

是的,这个方法也是可以的.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行