2016-06-30 70 views
0

我想知道是否可以根據事務強制在PostgreSql中執行觸發器。對整個事務執行Postgres觸發器,而不是對每個更新操作執行PostgreSQL觸發器

我正在更新python腳本中的記錄(從for循環中)。有一個觸發器將更新操作中的記錄插入表中。現在,我只想插入一個基於整個事務的記錄,而不是從python腳本中更新的每條記錄。

有沒有辦法可以做到這一點?

+0

如果在BEGIN和COMMIT之間有一堆更新語句,我只想爲此調用一次觸發器。有沒有辦法來檢測這種情況? – akashag26

回答

0

這是一個有點笨拙,但你可以是有條件觸發做到這一點:

CREATE TRIGGER t 
AFTER UPDATE ON MyTable 
FOR EACH ROW 
WHEN (IsFirstCallForThisTransaction()) 
EXECUTE PROCEDURE MyTrigger(); 

棘手位被定義IsFirstCallForThisTransaction()。在內部,它需要在某個地方設置一個標誌,但我們也需要保證這個標誌的作用範圍是當前事務。

一個選項是使用SET LOCAL來指定custom configuration variable

my_vars.trigger_called_in_current_transaction = false 

或者,附加一個默認的數據庫問題:

ALTER DATABASE MyDB SET my_vars.trigger_called_in_current_transaction = false; 

然後函數會是這個樣子:您可以通過將這一行服務器的postgresql.conf文件初始化這個變量

CREATE FUNCTION IsFirstCallForThisTransaction() RETURNS BOOLEAN AS 
$BODY$ 
BEGIN 
    IF current_setting('my_vars.trigger_called_in_current_transaction')::boolean THEN 
    RETURN false; 
    ELSE 
    SET LOCAL my_vars.trigger_called_in_current_transaction TO true; 
    RETURN true; 
    END IF; 
END 
$BODY$ 
LANGUAGE plpgsql VOLATILE;