我正在使用Oracle DB的系统。 ETL工具(ODI)将以下触发器放在表上以启用更改的数据捕获(CDC)。
create or replace trigger SCHEMA.T$TABLE_NAME
after insert or update or delete on SCHEMA.TABLE_NAME
for each row
declare
V_FLAG VARCHAR(1);
V_ROW_ID VARCHAR2(60);
begin
if updating then
V_ROW_ID := :new.ROW_ID;
V_FLAG := 'U';
end if;
if inserting then
V_ROW_ID := :new.ROW_ID;
V_FLAG := 'I';
end if;
if deleting then
V_ROW_ID := :old.ROW_ID;
V_FLAG := 'D';
end if;
insert into SCHEMA.J$TABLE_NAME
(
JRN_SUBSCRIBER,
JRN_CONSUMED,
JRN_FLAG,
JRN_DATE,
ROW_ID
)
select JRN_SUBSCRIBER,
'0',
V_FLAG,
sysdate,
V_ROW_ID
from SCHEMA.SNP_SUBSCRIBERS
where JRN_TNAME = 'SCHEMA.TABLE_NAME'
/* The following line can be uncommented for symetric replication */
/* and upper(USER) <> upper('SCHEMA') */
;
end;
我的问题是这件事无法识别更新。例如,当我对一行进行非常简单的更新时,它仍会在CDC表中插入一个“I”,表示它将更新作为插入读取。这是怎么回事?这有些奇怪的神谕吗?我没有在任何地方读过它。
提前致谢!
答案 0 :(得分:0)
好吧,我最终只是将触发器限制为仅在插入上运行。这符合我的目的。
答案 1 :(得分:-1)
尝试删除“for each row”,它应该可以正常工作。
我遇到了同样的问题
编辑:对不起,我没有读好您的触发器..如果没有每个行,它将不再工作查看我的相关问题: How to prevent an Insert Trigger from being fired when no row is inserted?