Oracle Trigger用于向审计表添加Old Val和New Val?

时间:2013-10-28 09:47:33

标签: sql oracle triggers

我想创建一个将在“User”表上的Update上执行的Oracle Trigger

用户

  • ID
  • 特权
  • Hashkey

然后,Oracle触发器将向下表“Audit”

添加行

审核

  • 用户ID
  • 字段名称
  • Old_Val
  • New_Val
  • 日期

它将记录特定字段的旧值和新值以及更改时的更改。

我的问题是:

  • 如何知道哪个字段正在更新,然后在Audit表中创建一行以记录该更改字段的旧值和新值
  • 如何在更新交易中更新多个字段时,我的触发器是否可以工作?

Oracle触发器是否适用于此?

到目前为止,这是我的代码(它不起作用,因为我不知道该放置什么作为字段的参数)

代码

    CREATE OR REPLACE TRIGGER USER_UPDATE_TRG
BEFORE UPDATE OF USER_ID,Department, Privilege, Hashkey 
ON USER
BEGIN
  INSERT INTO AUDIT
  (
  USER_ID,
  FIELD_NAME,
  OLD_VAL,
  NEW_VAL,
  CHANGED_DATE
  )
  VALUES
  (
  USER_ID,
  <what do I put here for Field Name?,
  :old.Field,
  :new.Field,
  sysdate  
  )
END;

1 个答案:

答案 0 :(得分:2)

您可以使用UPDATING条件谓词来标识字段名称。

CREATE OR REPLACE TRIGGER USER_UPDATE_TRG
BEFORE UPDATE OF USER_ID,Department, Privilege, Hashkey 
ON USER
FOR EACH ROW
BEGIN
     IF UPDATING ('USER_ID') THEN 
          INSERT INTO AUDIT
          (
          USER_ID,
          FIELD_NAME,
          OLD_VAL,
          NEW_VAL,
          CHANGED_DATE
          )
          VALUES
          (
          :new.USER_ID,
          'USER_ID',
          :old.USER_ID,
          :new.USER_ID,
          SYSDATE  
          );
     END IF;

     IF UPDATING ('DEPARTMENT') THEN
          .....
     END IF;

     IF UPDATING ('PRIVILEGE') THEN
          .....
     END IF;

     IF UPDATING ('HASHKEY') THEN
          .....
     END IF;
END;

在这种情况下,如果更新了多个列,则触发器将在表审核中插入多个记录。

编辑:

您编写的触发器是语句级触发器。 :NEW:OLD限定符适用于行级触发器,您必须提及FOR EACH ROW

我在我的代码中添加了这个。