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.
Haben Sie sich die CREATE CONSTRAINT TRIGGER mit der Option DEFERRABLE (INITIALLY DEFERRED)
angeschaut? ?
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?
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%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.
Tags und Links triggers postgresql transactions