如果 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 触发器记录对审计表的更新的主要内容,如果未能解决你的问题,请参考以下文章

PLSQL 触发器 - 基于选择查询更新记录

(SQL/PLSQL) 在触发期间显示更新的行

如何通过使用带有 PLSQL 的触发器来修改包含特定值的 CLOB 行?

如何检查时间是不是大于或小于PLSQL中的另一个时间

PLSQL——09触发器

左连接创建 column_x 和 column_y [重复]