0

Hi I'm up to develop a simple audit trigger for postgresql server. According to this document, I pretty much understand how it works. But I want to record my activity only when the certain row is updated. Below is the code from the link. And it records when there is update no matter what row is updated.

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

Please help me how to give a condition to above code. Thanks!

4

2 回答 2

2

触发器是用 PL/PgSQL 编写的。如果您要修改 PL/PgSQL 代码,我强烈建议您学习PL/PgSQL 手册。

在触发器中,行数据在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,因此除非满足审核条件,否则您根本不会触发触发器。看WHEN有关触发器的条款。

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

另见Pg 9.1 的更新触发器

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

于 2014-02-25T04:08:10.097 回答
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 查询的情况下使用相同的方法。希望这对其他人有帮助。

于 2018-09-14T07:21:00.640 回答