我想跟踪另一个表中某个表的更改。我需要的是一个更新后触发器,它写入已更改列的名称(如果多列更改,则会有多个插入到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;
/
你有错误?任何线索,它说什么? – 2011-06-16 12:40:00
你可以发布你收到的错误吗?表格的定义呢?此时最佳猜测是X_STAJ.OLDVALUE,NEWVALUE可能与您想要记录的所有列类型不兼容。 – 2011-06-16 12:40:08
错误:ORA-04098:触发器'SYS.TR__TRACK_CHANGES'无效,重新验证失败 – 2011-06-16 12:42:09