【问题标题】:PLSQL Trigger To Record Update To Audit Table If Column_X Updates如果 Column_X 更新,PLSQL 触发器记录对审计表的更新
【发布时间】: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

标签: oracle plsql triggers


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多