Entiendo que un activador en la tabla t definido con FOR EACH STATEMENT
se ejecutará una vez cuando ejecuto un UPDATE t ...
.
Ahora, cuando t
se define con FOREIGN KEY ... REFERENCES a ... ON UPDATE CASCADE
, y actualizo N filas a
, ¿hará que se llame al disparador una vez, o N veces?
Dicho de otra manera, ¿los cambios en una tabla en cascada por una restricción FK se parecen más a una sola UPDATE
, o más a una serie de UPDATE
s?
postgresql
trigger
foreign-key
postgresql-9.2
Hanno Fietz
fuente
fuente
FOR EACH STATEMENT
es ortogonal al resto de la pregunta. Las restricciones FK se implementan con desencadenantes especialesFOR EACH ROW
.Respuestas:
Las restricciones de clave externa se implementan actualmente con activadores internos especiales. Todos ellos se ejecutan
FOR EACH ROW
.Tenga en cuenta que estos son detalles de implementación que pueden cambiar, así que no confíe en ellos. Pero lo básico no ha cambiado en las últimas dos versiones principales, por lo que es poco probable que ocurran cambios importantes.
Ejecuté una prueba rápida con una simple restricción FK de
tbl
atbltype
. Un FK simple se implementa con cuatro disparadores internos simplesFOR EACH ROW
en mi prueba en la página 9.4.Aquí hay un resumen rápido sobre cómo investigar:
Se activan dos "nociones" internas
tbltype
.Dos activadores internos de "verificación" activados
tbl
.Todos ellos se ejecutan
FOR EACH ROW
, como lo indican los números impares entgtype
.Los 2 bytes de Postgres
tgtype smallint
representan unint16
código fuente en C donde codifica el bit menos significativoTRIGGER_TYPE_ROW
. Explicación detallada aquí:Puede probar esto fácilmente con un par de disparadores idénticos donde solo cambia
FOR ROW
/STATEMENT
...fuente
Se ejecuta N veces, y la forma más fácil de ver esto es ejecutar la declaración con un
EXPLAIN ANALYZE
antecedente, es decirEsto le dará información similar a esta:
Trigger for constraint t_col_fk on a: time=1.300 calls=9
(probado con 9.2)
fuente