Yabancı anahtar kısıtlamaları şu anda özel dahili tetikleyicilerle uygulanmaktadır. Hepsi yönetilir FOR EACH ROW
.
Bunların değişebilen uygulama ayrıntıları olduğunu unutmayın, bu yüzden ona güvenmeyin. Ancak, temel sürümlerin son birkaçında temeller değişmedi, bu nedenle büyük değişiklikler olası değildir.
Ben basit bir FK kısıtlaması ile hızlı bir testi yaptık tbl
etmek tbltype
. Basit bir FK, sayfa 9.4'deki testimde dört basit dahili tetikleyici ile uygulanır FOR EACH ROW
.
İşte araştırmak için hızlı bir özet:
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'
İki dahili "noaction" tetikleyicisi açılır tbltype
.
İki dahili "kontrol" tetikleyicisi açık tbl
.
Hepsi, FOR EACH ROW
tek sayılarla gösterildiği gibi çalıştırılır tgtype
.
Postgres'in 2 baytı, en az anlamlı bitin kodladığı C cinsinden tgtype smallint
bir int16
kaynak kodunu temsil eder TRIGGER_TYPE_ROW
. Ayrıntılı açıklama burada:
Bunu sadece değiştirdiğiniz bir çift özdeş tetikleyici ile kolayca test edebilirsiniz FOR ROW
/ STATEMENT
...