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.

¿Fue útil?

Solución

No podría decirlo mejor que El manual hace aquí:

Si alguna BEFORE o INSTEAD OF retornos de activación NULL, 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange
scroll top