嗨,我要为postgresql服务器开发一个简单的审计触发器。根据这个document,我非常了解它是如何工作的。但我想仅在更新某一行时记录我的活动。以下是链接中的代码。无论更新哪一行,它都会在有更新时进行记录。
IF (TG_OP = 'UPDATE') THEN
...
请帮助我如何给出上述代码的条件。谢谢!
触发器用PL / PgSQL编写。如果你要修改PL / PgSQL代码,我强烈建议你学习PL/PgSQL manual。
在触发器中,行数据位于OLD
和NEW
(对于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;
如果名称从/更改为感兴趣的名称,则测试NEW
和OLD
。
在这种情况下,您可以改为将其更改为在WHEN
上使用CREATE TRIGGER
子句,因此除非满足审核条件,否则永远不会触发触发器。见the WHEN
clause on triggers。
这只是一个基本的编程问题;你需要学习编程语言才能使用它。
哦,记得考虑一下NULL
;记得NULL = 'anything'
是NULL
。如果你想说“这些东西是平等的,或者都是空的”,请使用IS DISTINCT FROM
。
来自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查询的情况下使用它。希望这能帮到别人。