Ograniczenia klucza obcego są obecnie wdrażane za pomocą specjalnych wewnętrznych wyzwalaczy. Wszystkie są uruchomione FOR EACH ROW.
Pamiętaj, że są to szczegóły implementacji, które można zmienić, więc nie polegaj na tym. Ale podstawy nie zmieniły się w ciągu ostatnich kilku głównych wersji, więc poważne zmiany są mało prawdopodobne.
Przeprowadziłem szybki test z prostym ograniczeniem FK od tbldo tbltype. Prosty FK jest implementowany z czterema prostymi wewnętrznymi wyzwalaczami FOR EACH ROWw moim teście na str. 9.4.
Oto krótki przegląd tego, jak przeprowadzić dochodzenie:
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'
Włączone są dwa wewnętrzne „bezczynności” tbltype.
Włączone dwa wewnętrzne „sprawdzanie” tbl.
Wszystkie są uruchamiane FOR EACH ROW, jak wskazują nieparzyste liczby w tgtype.
2 bajty Postgres tgtype smallintreprezentują int16kod źródłowy w C, w którym kodowany jest najmniej znaczący bit TRIGGER_TYPE_ROW. Szczegółowe wyjaśnienie tutaj:
Można łatwo sprawdzić to z pary identycznych wyzwalaczy gdzie jedyną zmianą FOR ROW/ STATEMENT...