oracle触发器无法识别插入

时间:2010-10-12 14:30:17

标签: oracle insert triggers

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

提前致谢!

2 个答案:

答案 0 :(得分:0)

好吧,我最终只是将触发器限制为仅在插入上运行。这符合我的目的。

答案 1 :(得分:-1)

尝试删除“for each row”,它应该可以正常工作。

我遇到了同样的问题

编辑:对不起,我没有读好您的触发器..如果没有每个行,它将不再工作

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