postgres - triggert vor dem Transaktions-Commit

8

Ich habe mich gefragt, ob es indirekt möglich ist, einen Trigger kurz vor der Transaktion ausführen zu lassen? In diesem Trigger werde ich Konsistenzprüfungen durchführen und die Transaktion gegebenenfalls zurücksetzen.

Zum Beispiel habe ich drei Tabellen:

%Vor%

Ich möchte einen Trigger erstellen, der überprüft, ob ein Benutzer immer Teil einer Gruppe ist. Keine verwaisten Benutzer sind erlaubt. Jedes Mal, wenn ein Benutzer eingefügt wird, überprüft dieser Trigger, ob eine entsprechende Einfügung in user_in_group stattgefunden hat. Wenn nicht, wird die Transaktion nicht ausgeführt.

Dies kann nicht mit einem einfachen zeilen- oder statementbasierten Trigger durchgeführt werden, da das obige Szenario zwei separate Anweisungen erfordert.

Umgekehrt kann ein Löschvorgang aus user_in_group einfach durch einen zeilenbasierten Trigger durchgeführt werden.

    
Appelsien S. 19.07.2011, 12:01
quelle

5 Antworten

15

Haben Sie sich die CREATE CONSTRAINT TRIGGER mit der Option DEFERRABLE (INITIALLY DEFERRED) angeschaut? ?

    
leonbloy 19.07.2011 14:04
quelle
1

Wenn Sie nach dem Dokument suchen, scheint es keine solche Trigger-Option zu geben ... Eine Möglichkeit, die Regel "Keine verwaisten Benutzer" zu erreichen, wäre das direkte Einfügen in die Tabellen users und user_in_group . Erstellen Sie stattdessen eine Ansicht (die diese Tabellen kombiniert, dh user_id, user_name, group_id ) mit einer Aktualisierungsregel die Daten in richtige Tabellen einfügt.

Oder erlauben Sie nur das Einfügen neuer Benutzer über eine gespeicherte Prozedur, die alle erforderlichen Daten als inpud akzeptiert und somit Benutzern keine Gruppe erlaubt.

BTW, warum haben Sie separate Tabelle für Benutzer und Gruppenbeziehung? Warum nicht group_id in users table mit FK / NOT NULL constraint hinzufügen?

    
ain 19.07.2011 12:32
quelle
1

Wäre es nicht die korrekte Methode, Constraints in die Datenbank einzubauen? Genau dafür scheint es sich zu interessieren. Fügen Sie eine Fremdschlüsseleinschränkung und eine Nicht-Null hinzu, und es scheint, dass Sie im Geschäft sein sollten.

Jetzt für symmetrische Einschränkungen überarbeitet:

%Vor%

Verboten:

%Vor%

Beispiel für eine (nicht aufschiebbare, boo) Prüffunktion:

%Vor%     
Seth Robertson 19.07.2011 13:13
quelle
0

Von den Dokumenten . . .

  

Trigger können so definiert werden, dass sie vor oder nach jedem INSERT ausgeführt werden.   UPDATE oder DELETE, entweder einmal pro geänderte Zeile oder einmal pro   SQL-Anweisung.

    
quelle
0

Sie können den Operator sql WITH wie folgt verwenden:

%Vor%     
Kern 04.04.2016 13:00
quelle