1

我想创建一个 Oracle 触发器,它将在“用户”表上的更新上执行

用户

  • ID
  • 部门
  • 特权
  • 散列键

然后,Oracle 触发器会将行添加到下表“Audit”中

审计

  • 用户身份
  • 字段名称
  • Old_Val
  • 新值
  • 日期

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

我的问题是:

  • 它如何知道要更新哪个字段,然后在审计表中创建一行来记录该更改字段的旧值和新值
  • 在更新事务中更新多个字段时,如何让触发器工作?

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;
4

1 回答 1

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;

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

编辑:

您编写的触发器是语句级触发器。:NEWAND:OLD限定符将在您必须提到的行级触发器中工作FOR EACH ROW

我已经在我的代码中添加了它。

于 2013-10-28T10:06:24.777 回答