Wie kann die Trigger-Ausführungsreihenfolge unter PostgreSQL angegeben werden?

7

Ich verwende "klassische" zeitbasierte Partitionierung mit Triggern. Ich habe festgestellt, dass ein separater Trigger erforderlich ist, der auf der Originaltabelle ausgeführt wird.

CREATE TABLE twitter_interactions(...);
CREATE OR REPLACE FUNCTION insert_twitter_interactions ...;
CREATE TRIGGER insert_twitter_interactions_trig
  BEFORE INSERT OR UPDATE on twitter_interactions
  FOR EACH ROW EXECUTE PROCEDURE insert_twitter_interactions();

CREATE OR REPLACE FUNCTION maintain_data_pointers ...;
CREATE TRIGGER maintain_data_pointers_trig
  BEFORE INSERT OR UPDATE on twitter_interactions
  FOR EACH ROW EXECUTE PROCEDURE insert_twitter_interactions();

Ich habe nicht vollständig überprüft, aber ich vermute, dass die Partitionierungslogik vor dem Auslöser für die Wartung ausgeführt wird. Da die Zeile nicht in der übergeordneten Tabelle landet, wird der zweite Auslöser nie ausgelöst.

Was passiert, wenn ich auch eine ausführen möchte AFTER INSERT OR UPDATE? Da die Zeile es nicht in die ursprüngliche Tabelle schafft, kann ich die After-Logik nicht implementieren.

François Beausoleil
quelle

Antworten:

10

Ich könnte es nicht besser sagen als das Handbuch hier :

Wenn einer BEFOREoder ein INSTEAD OFTrigger zurückkehrt NULL, wird die Operation für diese Zeile abgebrochen und nachfolgende Trigger werden nicht ausgelöst (für diese Zeile).

Weder die (alphabetisch) späteren Auslöser für dasselbe Ereignis noch irgendwelche AFTERAuslöser werden BEFOREausgelöst , wenn der Auslöser abgebrochen wird.

Erwin Brandstetter
quelle
Gutes altes RTFM ... Aber wenn Sie die Anweisung lesen , können andere Trigger ausgelöst und abgeschlossen werden , wenn der Einfügetrigger der letzte ist. Ich werde das weiter untersuchen. Vielen Dank!
François Beausoleil
@ FrançoisBeausoleil: Richtig. Sie können andere Trigger für dasselbe Ereignis drücken, bevor Sie das INSERT mit abbrechen RETURN NULL. Sie können auch mehr Programmcode in dieselbe Triggerfunktion einfügen.
Erwin Brandstetter
8

PostgreSQL führt die Trigger in alphabetischer Reihenfolge nach Namen aus. Stellen Sie also sicher, dass Sie Namen verwenden, die sie in der gewünschten Reihenfolge erhalten. Aus den Dokumenten

SQL gibt an, dass mehrere Trigger in der Reihenfolge der Erstellungszeit ausgelöst werden sollen. PostgreSQL verwendet die Namensreihenfolge, die als bequemer eingestuft wurde.

Übrigens erstellt Ihr SQL zweimal denselben Trigger.

Eelke
quelle
Einfacher Fehler beim Kopieren und Einfügen. Schrieb die SQL oben zur Veranschaulichung. Danke für die Antwort!
François Beausoleil