web-dev-qa-db-fra.com

Comment spécifier l'ordre d'exécution de la gâchette sous PostgreSQL?

J'utilise un partitionnement temporel "classique" utilisant des déclencheurs. J'ai trouvé un besoin pour un déclencheur séparé, qui fonctionne sur la table d'origine.

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();

Je n'ai pas complètement vérifié, mais je soupçonne que la logique de partitionnement fonctionne avant la gâchette de maintien et, étant donné que la ligne ne se retrouve pas dans la table des parents, le 2e déclencheur ne tire jamais.

Que se passe-t-il si je veux courir un AFTER INSERT OR UPDATE ainsi que? Depuis que la ligne ne se fait pas dans la table d'origine, je suis une perte pour mettre en œuvre la logique après la lecture.

7

Je ne pouvais pas le dire mieux que le manuel le fait ici :

Si un BEFORE ou INSTEAD OF Déclenchement de la gâchette NULL, l'opération est abandonnée pour cette ligne et des déclencheurs ultérieurs ne sont pas tirés (pour cette rangée).

Ni le (alphabétiquement) déclenche la plus tard sur le même événement, ni aucun déclencheur AFTER _ déclenche, si la gâchette BEFORE déclenche.

10
Erwin Brandstetter

PostgreSQL exécute les déclencheurs dans l'ordre alphabétique par nom. Assurez-vous donc d'utiliser des noms qui les obtiennent dans l'ordre de votre choix. De les docs

SQL Spécifie que plusieurs déclencheurs doivent être tirés dans le temps de création. PostgreSQL utilise la commande de nom, qui a été jugé plus pratique.

BTW Votre SQL crée le même déclencheur deux fois.

8
Eelke