2014-02-25 107 views
0

您好我正在开发一个简单的postgresql服务器审计触发器。根据这document,我非常明白它是如何工作的。但是我只想在更新特定行时记录我的活动。以下是链接中的代码。并且它记录何时更新,而不管哪一行被更新。Postgres审计触发器只能触发一行更新

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

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

+0

*“但我只想在更新某行时记录我的活动。”*好的。哪一排?在SQL中,您需要知道表的名称,一个或多个列的名称以及该键的值。 –

+0

在名为'User'的表中,我们说'name'row varchar(32)。 – user3242117

回答

1

触发器是用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的情况下,被测试的名字被从/变为感兴趣的名称。

在这种情况下,您可以改为使用CREATE TRIGGER上的WHEN子句,因此除非符合审核条件,否则根本不会触发触发器。见the WHEN clause on triggers

这只是一个基本的编程问题;你需要学习编程语言才能使用它。请参阅updated trigger for Pg 9.1

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

+0

我不能尝试这个解决方案,直到我回到工作明天,但它似乎完美谢谢! – user3242117