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

时间:2014-02-25 03:04:53

标签: postgresql triggers audit-logging

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

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

请帮我解释如何为上述代码提供条件。谢谢!

2 个答案:

答案 0 :(得分:2)

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

在触发器中,行数据位于OLDNEW(针对UPDATE触发器)。所以你可以对其进行IF测试。 E.g:

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

答案 1 :(得分: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查询就可以使用它。希望这对其他人有帮助。