Sql 用于将旧Val和新Val添加到审核表的Oracle触发器?

Sql 用于将旧Val和新Val添加到审核表的Oracle触发器?,sql,oracle,triggers,Sql,Oracle,Triggers,我想创建一个Oracle触发器,它将在更新表“User”时执行 用户 身份证 系 特权 哈希键 Oracle触发器随后将向下表“Audit”中添加行 审计 用户ID 字段名 奥杜瓦尔 新谷 日期 它将记录特定字段的旧值和新值的更改以及更改时间 我的问题是: 它如何知道哪个字段正在更新,然后在审核表中创建一行来记录该更改字段的新旧值 在更新事务中更新多个字段时,如何使触发器工作 甲骨文触发器是否适用于此 这是到目前为止我的代码(它不起作用,因为我不知道把什么作为字段的参数) 代码 创建

我想创建一个Oracle触发器,它将在更新表“User”时执行

用户

  • 身份证
  • 特权
  • 哈希键
Oracle触发器随后将向下表“Audit”中添加行

审计

  • 用户ID
  • 字段名
  • 奥杜瓦尔
  • 新谷
  • 日期
它将记录特定字段的旧值和新值的更改以及更改时间

我的问题是:

  • 它如何知道哪个字段正在更新,然后在审核表中创建一行来记录该更改字段的新旧值
  • 在更新事务中更新多个字段时,如何使触发器工作
甲骨文触发器是否适用于此

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

代码

创建或替换触发器用户\u更新\u尝试
更新用户ID、部门、权限、哈希键之前
关于用户
开始
插入到审计中
(
用户ID,
字段名称,
老瓦尔,
纽约,
更改日期
)
价值观
(
用户ID,

您可以使用
更新
条件谓词来标识字段名

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;
在这种情况下,如果更新了多个列,触发器将在表audit中插入多条记录

编辑:

您编写的触发器是语句级触发器。
:NEW
:OLD
限定符将在行级触发器中工作,您必须为每行提到


我在我的代码中添加了这一点。

看起来您的解决方案将在审核表中只创建一条记录。如果用户id正在更新,它将跳过其余的elsif记录,不是吗?@Rene,是的,我认为您是对的,触发器需要了解是多字段更新还是单字段更新transaction@Rene,谢谢你指出这个问题,我已经更新了我的答案。得到一个错误:ORA-04079:无效的触发器规范关于我需要使用“AS”或“DECLARE”的某些内容在您的insert查询中,问题可能与
用户ID
有关。请尝试使用
:new.USER\u ID
删除它。这里介绍了另一种数据审核或记录旧数据的方法
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;