I vincoli di chiave esterna sono attualmente implementati con speciali trigger interni. Sono tutti in esecuzione FOR EACH ROW.
Nota che questi sono dettagli di implementazione che possono cambiare, quindi non fare affidamento su di esso. Ma le basi non sono cambiate rispetto alle ultime due versioni principali, quindi è improbabile che si verifichino cambiamenti importanti.
Ho eseguito un test rapido con un semplice vincolo FK da tbla tbltype. Un semplice FK è implementato con quattro semplici trigger interni FOR EACH ROWnel mio test a pag 9.4.
Ecco una breve rassegna su come indagare:
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'
Si attivano due "noazioni" interne tbltype.
Si attivano due "controlli" interni tbl.
Vengono eseguiti tutti FOR EACH ROW, come indicato dai numeri dispari in tgtype.
I 2 byte di Postgres tgtype smallintrappresentano un int16codice sorgente in C in cui codifica il bit meno significativo TRIGGER_TYPE_ROW. Spiegazione dettagliata qui:
Puoi facilmente testarlo con una coppia di trigger identici in cui cambi solo FOR ROW/ STATEMENT...