Fremdschlüsseleinschränkungen werden derzeit mit speziellen internen Triggern implementiert. Alle von ihnen werden ausgeführt FOR EACH ROW
.
Beachten Sie, dass dies Implementierungsdetails sind, die sich ändern können. Verlassen Sie sich also nicht darauf. Die Grundlagen haben sich in den letzten Hauptversionen jedoch nicht geändert, sodass größere Änderungen unwahrscheinlich sind.
Ich habe einen Schnelltest mit einer einfachen FK-Einschränkung von tbl
bis durchgeführt tbltype
. In FOR EACH ROW
meinem Test auf Seite 9.4 ist eine einfache FK mit vier einfachen internen Triggern implementiert .
Hier ist ein kurzer Überblick über die Untersuchung:
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'
Zwei interne "noaction" werden ausgelöst tbltype
.
Zwei interne "Check" -Trigger werden aktiviert tbl
.
Alle von ihnen werden ausgeführt FOR EACH ROW
, wie durch ungerade Zahlen in angezeigt tgtype
.
Die 2 Bytes der Postgres tgtype smallint
stellen einen int16
In-C-Quellcode dar, in dem das niedrigstwertige Bit codiert TRIGGER_TYPE_ROW
. Detaillierte Erklärung hier:
Sie können dies leicht mit einem Paar identischer Trigger testen, bei denen Sie nur FOR ROW
/ STATEMENT
...