【问题标题】:Oracle update trigger issueOracle 更新触发器问题
【发布时间】:2017-06-11 22:05:22
【问题描述】:

问题是我有以下触发器来监视我的特定列“CHANGED”,如果它更新为 1,我希望它将同一行和列“CHANGED_DATE”更新为当前 SYSDATE。出于某种原因,我不断收到此错误,任何帮助将不胜感激。

错误

UPDATE "SYSADM"."SHIP_CALENDAR" SET CHANGED = '1' WHERE ROWID = 'AABCxCAAEAAAKYEAAB' AND ORA_ROWSCN = '6165377066'
ORA-04091: table SYSADM.SHIP_CALENDAR is mutating, trigger/function may not see it
ORA-06512: at "SYSADM.SHIP_CALENDAR_CHANGED", line 5
ORA-04088: error during execution of trigger 'SYSADM.SHIP_CALENDAR_CHANGED'

触发器

create or replace TRIGGER SHIP_CALENDAR_CHANGED
AFTER UPDATE
   OF CHANGED
   ON SHIP_CALENDAR
   REFERENCING OLD AS o NEW AS n
   FOR EACH ROW
DECLARE  
  BEGIN
     -- UPDATE SHIP CALENDAR SET UPDATE_CHANGE TO SYSDATE IF CHANGED CHANGES
     IF :n.CHANGED = '1' then  
       UPDATE SHIP_CALENDAR
         SET CHANGED_DATE = SYSDATE
         WHERE SHIPMENT_ID = :o.SHIPMENT_ID;
     END IF;  
END;

表格

【问题讨论】:

  • 你试过搜索吗?关于“变异触发器”问题有很多答案

标签: sql oracle oracle11g


【解决方案1】:

使用before update 触发器:

create or replace TRIGGER SHIP_CALENDAR_CHANGED
BEFORE UPDATE
   OF CHANGED
   ON SHIP_CALENDAR
   REFERENCING OLD AS o NEW AS n
   FOR EACH ROW
DECLARE  
  BEGIN
     -- UPDATE SHIP CALENDAR SET UPDATE_CHANGE TO SYSDATE IF CHANGED CHANGES
     IF :n.CHANGED = '1' then  
        :n.CHANGED_DATE := SYSDATE
     END IF;  
END;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    • 2014-06-21
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 2011-10-25
    相关资源
    最近更新 更多