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
a tbltype
. Un FK simple se implementa con cuatro disparadores internos simples FOR EACH ROW
en mi prueba en la página 9.4.
Aquí hay un resumen rápido sobre cómo investigar:
SELECT oid -- 74791
FROM pg_constraint
WHERE conrelid = 'tbl'::regclass
AND contype = 'f';
SELECT objid, classid::regclass -- 74792,74793,74794,74795 / 'pg_trigger'
FROM pg_depend
WHERE refobjid = 74791
AND deptype = 'i'
SELECT tgrelid::regclass, tgname, tgfoid, tgtype FROM pg_trigger
WHERE oid IN (74792,74793,74794,74795) ORDER BY tgfoid;
'tbl' ;'RI_ConstraintTrigger_c_74794';1644;5
'tbl' ;'RI_ConstraintTrigger_c_74795';1645;17
'tbltype';'RI_ConstraintTrigger_a_74792';1654;9
'tbltype';'RI_ConstraintTrigger_a_74793';1655;17
SELECT oid, proname FROM pg_proc
WHERE oid IN (1654,1655,1644,1645);
1644;'RI_FKey_check_ins'
1645;'RI_FKey_check_upd'
1654;'RI_FKey_noaction_del'
1655;'RI_FKey_noaction_upd'
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 en tgtype
.
Los 2 bytes de Postgres tgtype smallint
representan un int16
código fuente en C donde codifica el bit menos significativo TRIGGER_TYPE_ROW
. Explicación detallada aquí:
Puede probar esto fácilmente con un par de disparadores idénticos donde solo cambia FOR ROW
/ STATEMENT
...