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 tbl
do tbltype
. Prosty FK jest implementowany z czterema prostymi wewnętrznymi wyzwalaczami FOR EACH ROW
w 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 smallint
reprezentują int16
kod ź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
...