如果 Column_X 更新,PLSQL 触发器记录对审计表的更新
Posted
技术标签:
【中文标题】如果 Column_X 更新,PLSQL 触发器记录对审计表的更新【英文标题】:PLSQL Trigger To Record Update To Audit Table If Column_X Updates 【发布时间】: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
【参考方案1】:
谢谢 Gurwinder Singh,我想这就是你告诉我要尝试的。考虑到我的数据总是进入/离开 NULL 状态,这很有效,尽管可能有一种更漂亮的方式来编写它。
CREATE OR REPLACE TRIGGER audit_table
AFTER UPDATE ON table_1
FOR EACH ROW
WHEN ((new.column_x IS NULL AND old.column_x IS NOT NULL) OR (new.column_x IS NOT NULL AND old.column_x IS NULL))
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
【讨论】:
以上是关于如果 Column_X 更新,PLSQL 触发器记录对审计表的更新的主要内容,如果未能解决你的问题,请参考以下文章