2013-04-20 223 views
2

我有一個包含多個字段和額外outofsync字段的表。 創建觸發器和觸發器函數,在任何更新/插入之前將outofsync字段值設置爲true。更新字段按觸發器更新

觸發:

CREATE TRIGGER goods_update_outofsync 
    BEFORE UPDATE 
    ON goods 
    FOR EACH ROW 
    EXECUTE PROCEDURE tg_update_goods_outofsync(); 

觸發功能:

CREATE OR REPLACE FUNCTION tg_update_goods_outofsync() 
    RETURNS trigger AS 
$BODY$ 
    BEGIN 
    NEW.outofsync=true; 
    RETURN NEW; 
    END; 
    $BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 
ALTER FUNCTION tg_update_goods_outofsync() 
    OWNER TO postgres; 

現在涉及到一個「簡單」的問題,我無法找到答案:如何手動outofsync字段更新爲假,因爲每次嘗試後都會通過觸發器自動更改爲true。

編輯:

這幾乎工程:

IF (NEW.outofsync = OLD.outofsync) THEN 
    NEW.outofsync=true; 
END IF; 

除了當outofsync領域的價值已經是假的,我想將它設置爲false,因爲它變成了真的,那麼......

非常感謝您的幫助!

回答

4

至少四個選項:

  • 設置爲同步在觸發另一用戶和測試current_user;

  • 在更新同步字段之前,在事務中定義自定義配置變量(GUC)和SET LOCALset_config(...);測試GUC在觸發器和基於它的行爲改變;

  • 在設置同步之前暫時禁用事務中的觸發器;

  • 讓觸發器檢查所有其他值是否由更新保持不變,如果沒有其他值已更改,則允許同步設置爲true。使用IS DISTINCT FROM進行此測試可以方便地處理空值。

我可能會自己使用自定義的GUC,current_setting('my.guc')從觸發器中獲取值。

如果您使用的是Pg 9.1或更高版本,則必須將my(或任何您真正稱之爲前綴的)添加到custom_variable_classes。在9.2及以上版本中,任何週期爲(.)的變量被假定爲自定義變量。請參閱passing user ID to triggers

+0

因爲我不熟悉GUC並且在這個表中有很多字段(對於解決方案D),我會禁用我認爲的觸發器。謝謝! – HoGo 2013-04-23 09:39:26

+0

http://koo.fi/blog/2013/01/08/disable-postgresql-triggers-temporarily/我想我寧願禁用當前會話中的所有觸發器,而不僅僅是全局觸發器。 – HoGo 2013-04-23 09:42:03

+0

哦,你可以使用普通的'set_config' SQL函數,而不是'SET'語句。 – 2013-05-20 08:06:14