Comment spécifier l'ordre d'exécution de déclenchement sous PostgreSQL?
-
16-10-2019 - |
Question
J'utilise en fonction du temps « classique » partitionnement en utilisant des déclencheurs. J'ai trouvé un besoin d'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 entièrement vérifié, mais je soupçonne que les pistes logiques de partitionnement avant le déclenchement de maintenir, et depuis la ligne ne se termine pas dans la table parent, le 2e déclenchement ne incendies.
Qu'est-ce qui se passe si je veux courir un AFTER INSERT OR UPDATE
aussi bien? Étant donné que la ligne ne fait pas dans la table d'origine, je suis à une perte pour mettre en œuvre la logique après.
La solution
Je ne pouvais pas le dire mieux que le manuel fait ici :
En cas de retours ou de déclenchement
BEFORE
INSTEAD OF
NULL
, l'opération est abandonnés pour cette ligne et les déclencheurs suivants ne sont pas déclenchés (pour cette ligne).
Ni le (par ordre alphabétique) déclenche plus tard sur le même événement, ni aucun déclenche AFTER
se déclenche, si le déclencheur de BEFORE
annule.
Autres conseils
PostgreSQL exécute les déclencheurs dans l'ordre alphabétique par nom. Donc, assurez-vous d'utiliser des noms qui les obtiennent dans l'ordre que vous voulez. De la documentation
spécifie que SQL plusieurs triggers doivent être déclenchés en temps de création commande. PostgreSQL utilise pour nom, qui a été jugé plus commode.
BTW SQL crée le même déclencheur deux fois.