2011-06-16 141 views
0

我想跟踪另一个表中某个表的更改。我需要的是一个更新后触发器,它写入已更改列的名称(如果多列更改,则会有多个插入到CHANGES表中),列的旧值和新值。我怎么做。我试过这个,但是在更新表格后出现错误。所以我只给你一个正文。Oracle After Update触发错误

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; 
/
+0

你有错误?任何线索,它说什么? – 2011-06-16 12:40:00

+0

你可以发布你收到的错误吗?表格的定义呢?此时最佳猜测是X_STAJ.OLDVALUE,NEWVALUE可能与您想要记录的所有列类型不兼容。 – 2011-06-16 12:40:08

+0

错误:ORA-04098:触发器'SYS.TR__TRACK_CHANGES'无效,重新验证失败 – 2011-06-16 12:42:09

回答

0

此SQL Plus命令会显示错误:

SHOW ERROR TRIGGER STAJCHANGER.TR_TRACK_CHANGES 
4

该错误似乎表明触发所有者是SYS,但您显示的创建语句明确地将所有者作为STAJCHANGER提供。

这让我想知道,你是否意外地在SYS中创建了一个(无效)版本的触发器,并且忘记删除它?