我想创建一个将在“User”表上的Update上执行的Oracle Trigger
用户
然后,Oracle触发器将向下表“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;
答案 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
。
我在我的代码中添加了这个。