¿Cómo especificar el orden de ejecución de activación en PostgreSQL?
-
16-10-2019 - |
Pregunta
Estoy usando partición "clásica" basada en el tiempo usando desencadenantes. He encontrado la necesidad de un gatillo separado, que se ejecuta en la tabla original.
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();
No he verificado completamente, pero sospecho que la lógica de partición se ejecuta antes del gatillo Mantener, y dado que la fila no termina en la tabla principal, entonces el segundo gatillo nunca dispara.
¿Qué pasa si quiero ejecutar un AFTER INSERT OR UPDATE
¿también? Dado que la fila no llega a la tabla original, entonces tengo pérdida para implementar la lógica posterior.
Solución
No podría decirlo mejor que El manual hace aquí:
Si alguna
BEFORE
oINSTEAD OF
retornos de activaciónNULL
, la operación se abandona para esa fila y los desencadenantes posteriores no se disparan (para esa fila).
Ni el (alfabéticamente) posterior se desencadena en el mismo evento ni ningún AFTER
Los disparadores dispararán, si el BEFORE
Cancos de activación.
Otros consejos
PostgreSQL ejecuta los desencadenantes en orden alfabético por su nombre. Así que asegúrese de usar nombres que los obtengan en el orden que desee. De los documentos
SQL especifica que se deben disparar múltiples desencadenantes en orden de tiempo de creación. PostgreSQL usa el orden de nombre, que se consideró más conveniente.
Por cierto, su SQL crea el mismo gatillo dos veces.