Les contraintes de clé étrangère sont actuellement implémentées avec des déclencheurs internes spéciaux. Tous sont exécutés FOR EACH ROW
.
Notez que ce sont des détails d'implémentation qui peuvent changer, alors ne vous y fiez pas. Mais les bases n'ont pas changé au cours des deux dernières versions principales, donc des changements majeurs sont peu probables.
J'ai effectué un test rapide avec une simple contrainte FK de tbl
à tbltype
. Un FK simple est implémenté avec quatre déclencheurs internes simples FOR EACH ROW
dans mon test à la page 9.4.
Voici un bref aperçu sur la façon d'enquêter:
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'
Deux déclencheurs "noaction" internes sont activés tbltype
.
Deux déclencheurs de «vérification» internes sont activés tbl
.
Tous sont exécutés FOR EACH ROW
, comme indiqué par des nombres impairs dans tgtype
.
Les 2 octets de Postgres tgtype smallint
représentent un int16
code source en C où le bit le moins significatif encode TRIGGER_TYPE_ROW
. Explication détaillée ici:
Vous pouvez facilement tester cela avec une paire de déclencheurs identiques où vous modifiez FOR ROW
/ STATEMENT
...