2014-02-25 110 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