Oracle After Update Trigger错误

时间:2011-06-16 12:32:11

标签: oracle triggers

我想跟踪另一个表中一个表的更改。我需要的是一个更新后触发器,它写入已更改列的名称(如果更改了多个列,那么将有多个插入到CHANGES表中),列的旧值和新值。我怎么做。我试过这个但是在更新桌子后出错了。所以我只给你身体。

IF :NEW.STAJYEAR!=:OLD.STAJYEAR THEN
 INSERT INTO X_STAJ (USERID,EDITDATE,CHANGEDCOLUMN,OLDVALUE,NEWVALUE)
 VALUES (:NEW.USERID,SYSDATE,'STAJYEAR',:OLD.STAJYEAR,:NEW.STAJYEAR);
END IF;

错误代码为:ORA-04098:触发'SYS.TR__TRACK_CHANGES'无效且重新验证失败

CREATE OR REPLACE TRIGGER STAJCHANGER.TR_TRACK_CHANGES
AFTER UPDATE
OF STAJYEAR
  ,STAJMONTH
  ,STAJDAY
ON STAJCHANGER.STAJ 
REFERENCING NEW AS New OLD AS Old
FOR EACH ROW
DECLARE
OLDVALUE NUMBER;
NEWVALUE NUMBER;
COLUMNID NUMBER;


BEGIN


   IF :NEW.STAJYEAR!=:OLD.STAJYEAR THEN
    INSERT INTO X_STAJ (USERID,EDITDATE,CHANGEDCOLUMN,OLDVALUE,NEWVALUE)
    VALUES (:NEW.USERID,SYSDATE,'STAJYEAR',:OLD.STAJYEAR,:NEW.STAJYEAR);
    END IF;

   IF :NEW.STAJMONTH!=:OLD.STAJMONTH THEN
    INSERT INTO X_STAJ (USERID,EDITDATE,CHANGEDCOLUMN,OLDVALUE,NEWVALUE)
    VALUES (:NEW.USERID,SYSDATE,'STAJMONTH',:OLD.STAJMONTH,:NEW.STAJMONTH);
    END IF; 

       IF :NEW.STAJDAY!=:OLD.STAJDAY THEN
    INSERT INTO X_STAJ (USERID,EDITDATE,CHANGEDCOLUMN,OLDVALUE,NEWVALUE)
    VALUES (:NEW.USERID,SYSDATE,'STAJDAY',:OLD.STAJDAY,:NEW.STAJDAY);
    END IF;

END TR_TRACK_CHANGES;
/

2 个答案:

答案 0 :(得分:4)

该错误似乎表明触发器所有者是SYS,但您显式显示的创建语句将所有者称为STAJCHANGER。

这让我很奇怪,您是否在某个时刻意外地在SYS中创建了一个(无效)触发器版本,并且忘了放弃它?

答案 1 :(得分:0)

此SQL Plus命令将显示错误:

SHOW ERROR TRIGGER STAJCHANGER.TR_TRACK_CHANGES