2014-01-06 24 views
0

我正在使用,ruby和PG gem連接到我的PG數據庫。我觸發了觸發器。我只需要返回觸發器函數中的更新值。PL/PgSQL觸發器只返回更新的字段

require 'pg' 

TRIGGER_FUNCTION = %{ 
CREATE OR REPLACE FUNCTION notify_account() 
RETURNS TRIGGER 
LANGUAGE plpgsql 
AS $$ 
    BEGIN 
     NOTIFY accounts_trigger; 
     IF (TG_OP = 'UPDATE') THEN 
     // Here is where I need to return, the changed fields alone 
     ELSE 
     RETURN NEW; 
     END IF; 
    END 
$$ 
} 

DROP_TRIGGER = %{ 
DROP TRIGGER IF EXISTS accounts_notify_trigger ON accounts 
} 


TRIGGER = %{ 
CREATE TRIGGER accounts_notify_trigger 
AFTER UPDATE OR INSERT OR DELETE 
ON accounts 
FOR EACH STATEMENT 
EXECUTE PROCEDURE notify_account(); 
} 

回答

1

我不明白你的意思是「返回」只是改變了字段。這就是NEW元組所做的 - 你不能忽略未改變的字段,因爲那樣你會返回一個與表格行不兼容的元組,並且觸發器會失敗。

所以我想你的意思是你想日誌更改的項目只。

將元組作爲鍵/值集進行比較時,SQL並不好。在這種情況下,我傾向於做的是將每個元組變成通過hstore設置的鍵/值集合,然後使用集合操作來僅提取不同的對。

有條件地,hstore提供了一個運算符,它只是做我們想要的,所以我們甚至不必爲將hstore轉換爲SQL鍵/值列表和使用SQL集操作而煩惱。

嘗試類似:

RAISE NOTICE 'Changed fields: %', (hstore(NEW) - hstore(OLD)); 

,如果您還沒有你需要CREATE EXTENSION hstore;爲超級用戶。

如果您正在嘗試編寫審計觸發器,則可能需要檢出http://wiki.postgresql.org/wiki/Audit_trigger_91plus