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