【发布时间】:2016-12-06 16:30:05
【问题描述】:
我正试图密切关注表中的特定列是否收到更新,如果收到更新,则将该更改插入到我的审计表中。如果任何列发生更改,或者我的列更改为特定值,但由于某种原因,当我尝试比较 old.column_x != new.column_x 时,我已经能够编写此触发器来执行此操作!它没有记录更新。我尝试了几种代码变体,这是我尝试过的最新版本。
CREATE OR REPLACE TRIGGER audit_table
AFTER UPDATE ON table_1
FOR EACH ROW
WHEN (new.column_x != old.column_x)
BEGIN
INSERT INTO audit_table (
column_1,
old_column_x,
new_column_x,
auditdtm
)
VALUES (
:old.column_1,
:old.column_x,
:new.column_x,
SYSDATE);
END
【问题讨论】:
-
不编译没有错误。如果我将 WHEN 行更改为 [WHEN (new.column_x IS NULL)],那么当我在记录中将该列设为空时,触发器就会起作用并记录我的更新。
-
您希望 column_x 为空吗?
-
是的,我的应用程序中的一个函数会将该列设置为 NULL 或 01/01/3000。
-
在
when子句中使用or条件处理null情况 -
null的情况是为了确保如果值更改为null或从null更改,它将被审计。否则,如果旧值或新值是null,简单比较将始终返回false