【问题标题】:oracle trigger not recognizing insertoracle触发器无法识别插入
【发布时间】:2011-04-24 08:45:23
【问题描述】:

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

提前致谢!

【问题讨论】:

    标签: oracle insert triggers


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      我之前也遇到过同样的问题

      编辑:抱歉,我没有很好地阅读您的触发器。如果没有每一行,它将无法工作

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

      【讨论】:

      • 这给了我一些关于不使用 :new 引用的错误。我猜你是说我应该将此触发器重写为语句级触发器而不是行级触发器? psoug.org/reference/table_trigger.html
      • 是的,你是对的,:new 需要一个 ROW LEVEL 触发器...(见我的编辑)
      • 好的,这是我的问题:我需要行的行 ID。我不认为我可以在语句级触发器中得到它,可以吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-27
      • 1970-01-01
      • 2012-03-16
      • 2018-04-11
      • 2021-08-25
      • 2014-06-28
      • 1970-01-01
      相关资源
      最近更新 更多