2010-10-12 128 views
1

我正在使用Oracle DB的系统上工作。 ETL工具(ODI)将以下触发器放在表上以启用更改的数据捕获(CDC)。Oracle触发器无法识别插入

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',表示它将更新作为插入读取。这是怎么回事?这有些奇怪的oracle事情?我没有在任何地方读过它。

在此先感谢!

回答

0

那么,我最终只是限制触发器只能在插入上运行。这对我的目的有效。

-1

尝试删除“对于每一行”,它应该工作。

我有同样的问题,以及之前

编辑:对不起,我没有读你的触发以及..它不会工作了没有EACH ROW

见我相关的问题: How to prevent an Insert Trigger from being fired when no row is inserted?

+0

这给我扔了一些关于不使用:new引用的错误。我猜你在说我应该将这个触发器重写为语句级触发器而不是行级触发器? http://psoug.org/reference/table_trigger.html – Nate 2010-10-12 14:42:33

+0

是的,你是对的,:新需要一个ROW LEVEL触发器......(看我的编辑) – guigui42 2010-10-12 14:44:25

+0

好的,这是我的问题:我需要行ID行。我不认为我可以在声明级别触发器中获得该信息,对吗? – Nate 2010-10-12 15:04:11