您好我正在開發一個簡單的postgresql服務器審計觸發器。根據這document,我非常明白它是如何工作的。但是我只想在更新特定行時記錄我的活動。以下是鏈接中的代碼。並且它記錄何時更新,而不管哪一行被更新。Postgres審計觸發器只能觸發一行更新
IF (TG_OP = 'UPDATE') THEN
...
請幫助我如何給上述代碼一個條件。謝謝!
您好我正在開發一個簡單的postgresql服務器審計觸發器。根據這document,我非常明白它是如何工作的。但是我只想在更新特定行時記錄我的活動。以下是鏈接中的代碼。並且它記錄何時更新,而不管哪一行被更新。Postgres審計觸發器只能觸發一行更新
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
的情況下,被測試的名字被從/變爲感興趣的名稱。
在這種情況下,您可以改爲使用CREATE TRIGGER
上的WHEN
子句,因此除非符合審覈條件,否則根本不會觸發觸發器。見the WHEN
clause on triggers。
這只是一個基本的編程問題;你需要學習編程語言才能使用它。請參閱updated trigger for Pg 9.1。
哦,並記住想想NULL
;記得NULL = 'anything'
是NULL
。如果你想說「這些東西是平等的,或者都是空的」,請使用IS DISTINCT FROM
。
我不能嘗試這個解決方案,直到我回到工作明天,但它似乎完美謝謝! – user3242117
*「但我只想在更新某行時記錄我的活動。」*好的。哪一排?在SQL中,您需要知道表的名稱,一個或多個列的名稱以及該鍵的值。 –
在名爲'User'的表中,我們說'name'row varchar(32)。 – user3242117