联系:手机/微信(+86 17813235971) QQ(107644445)
标题:Total insert collisions (ogg)
作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]
1、错误现象
Replicating from ECP.TAB_UUM_PACKAGE to RWGL.TAB_UUM_USER:
*** Total statistics since 2011-08-05 10:34:10 ***
2、错误原因
RWGL.TAB_UUM_USER表上有insert触发器,导致失败。因为触发器使得插入操作为插入和触发器中的操作绑定为了一个整体,现在因为触发器失败,导致插入失败,而且还会丢失该条插入记录,需要查找出该条记录比较困难。
3、解决方案
采用自治事件结合异常捕获
自治事件使得触发器和插入操作相互分离,异常捕获记录触发器失败的原因,插入到日志表中,通过该表,可以查询查失败的记录,然后人工干预,触发器实例:
create or replace trigger ogg_t before insert on t_1 for each row declare tid NUMBER; err VARCHAR2(100); PRAGMA AUTONOMOUS_TRANSACTION; BEGIN SELECT t.id2 INTO tid FROM t_2 t WHERE NAME=:new.Name; INSERT INTO t_3 VALUES(tid,:new.name); COMMIT; EXCEPTION WHEN TOO_MANY_ROWS THEN INSERT INTO t_error VALUES(:new.id,'TOO_MANY_ROWS'); COMMIT; WHEN NO_DATA_FOUND THEN INSERT INTO t_error VALUES(:new.id,'NO_DATA_FOUND'); COMMIT; WHEN OTHERS THEN err:=SUBSTR(SQLERRM(SQLCODE),1,100); INSERT INTO t_error VALUES(:new.id,err); COMMIT; end ogg_t;
1)PRAGMA AUTONOMOUS_TRANSACTION;
自治事务,就是说触发器不管是成功,还是失败,数据库同步程序都能够同步成功数据到目标端
2)COMMIT;
因为采用了自治事件,所以begin end中的操作是独立与数据库中数据,需要单独提交
3)EXCEPTION
添加异常处理
4)INSERT INTO t_error VALUES(:new.id,’TOO_MANY_ROWS’);(类此语句,注意commit)
建立一张错误日志表(根据具体情况决定),如果触发器失败,把错误记录到该表中,以后出现问题查找很方便(要求:通过该表能够查询到那条语句的触发器执行失败。失败原因,失败时间,额外列(用于确定对应记录))