0
我想知道是否可以根據事務強制在PostgreSql中執行觸發器。對整個事務執行Postgres觸發器,而不是對每個更新操作執行PostgreSQL觸發器
我正在更新python腳本中的記錄(從for循環中)。有一個觸發器將更新操作中的記錄插入表中。現在,我只想插入一個基於整個事務的記錄,而不是從python腳本中更新的每條記錄。
有沒有辦法可以做到這一點?
我想知道是否可以根據事務強制在PostgreSql中執行觸發器。對整個事務執行Postgres觸發器,而不是對每個更新操作執行PostgreSQL觸發器
我正在更新python腳本中的記錄(從for循環中)。有一個觸發器將更新操作中的記錄插入表中。現在,我只想插入一個基於整個事務的記錄,而不是從python腳本中更新的每條記錄。
有沒有辦法可以做到這一點?
這是一個有點笨拙,但你可以是有條件觸發做到這一點:
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;
如果在BEGIN和COMMIT之間有一堆更新語句,我只想爲此調用一次觸發器。有沒有辦法來檢測這種情況? – akashag26