Postgres审计触发器仅由一行UPDATE触发

问题描述 投票:0回答:2

嗨,我要为postgresql服务器开发一个简单的审计触发器。根据这个document,我非常了解它是如何工作的。但我想仅在更新某一行时记录我的活动。以下是链接中的代码。无论更新哪一行,它都会在有更新时进行记录。

    IF (TG_OP = 'UPDATE') THEN
...

请帮助我如何给出上述代码的条件。谢谢!

postgresql triggers audit-logging
2个回答
2
投票

触发器用PL / PgSQL编写。如果你要修改PL / PgSQL代码,我强烈建议你学习PL/PgSQL manual

在触发器中,行数据位于OLDNEW(对于UPDATE触发器)。所以你可以像其他任何东西一样对IF进行测试。例如。:

IF (TG_OP = 'UPDATE') THEN
  IF NEW."name" = 'name_to_audit' OR OLD."name" = 'name_to_audit' THEN
   -- do audit commands
  END IF;
END IF;

如果名称从/更改为感兴趣的名称,则测试NEWOLD

在这种情况下,您可以改为将其更改为在WHEN上使用CREATE TRIGGER子句,因此除非满足审核条件,否则永远不会触发触发器。见the WHEN clause on triggers

这只是一个基本的编程问题;你需要学习编程语言才能使用它。

另见updated trigger for Pg 9.1

哦,记得考虑一下NULL;记得NULL = 'anything'NULL。如果你想说“这些东西是平等的,或者都是空的”,请使用IS DISTINCT FROM


0
投票

来自Postgresql文档:

CREATE TRIGGER log_update
    AFTER UPDATE ON accounts
    FOR EACH ROW
    WHEN (OLD.* IS DISTINCT FROM NEW.*)
    EXECUTE PROCEDURE log_account_update();

这仅适用于该表上的UPDATE。对于INSERT AND DELETE,您可以在没有WHERE查询的情况下使用它。希望这能帮到别人。

© www.soinside.com 2019 - 2024. All rights reserved.