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 tbl
a tbltype
. Un semplice FK è implementato con quattro semplici trigger interni FOR EACH ROW
nel 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 smallint
rappresentano un int16
codice 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
...