2016-06-30 4 views
0

Ich frage mich, ob es möglich ist, die Ausführung eines Triggers in PostgreSql basierend auf einer Transaktion zu erzwingen.Ausführen von Postgres Trigger für eine ganze Transaktion und nicht für jede Aktualisierungsoperation

Ich aktualisiere die Datensätze von einem Python-Skript (aus einer For-Schleife). Es gibt einen Auslöser, der einen Datensatz bei der Aktualisierungsoperation in die Tabelle einfügt. Jetzt möchte ich nur einen Datensatz basierend auf der gesamten Transaktion einfügen und nicht für jeden Datensatz, von dem ich in einem Python-Skript aktualisiere.

Gibt es eine Möglichkeit, dies zu tun?

+0

Wenn es zwischen BEGIN und COMMIT eine Reihe von Update-Anweisungen gibt, möchte ich meinen Trigger nur einmal dafür aufrufen. Gibt es eine Möglichkeit, ein solches Szenario zu erkennen? – akashag26

Antwort

0

Es ist ein wenig klobig, aber man kann mit einem bedingten Trigger dies tun:

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

Der schwierige Bit ist die Definition IsFirstCallForThisTransaction(). Intern muss es irgendwo eine Markierung setzen, aber wir müssen auch sicherstellen, dass dieses Flag für die aktuelle Transaktion gilt.

Eine Option besteht darin, SET LOCAL zu verwenden, um eine custom configuration variable zuzuweisen.

my_vars.trigger_called_in_current_transaction = false 

Oder alternativ, fügen Sie eine Standard auf die Datenbank in Frage: Sie können postgresql.conf Datei, indem dieser Linie Servers diese Variable initialisieren

ALTER DATABASE MyDB SET my_vars.trigger_called_in_current_transaction = false; 

Dann ist die Funktion wie folgt aussehen würde:

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; 
Verwandte Themen