ทริกเกอร์ FOR FOR EACH STATEMENT จะเรียกใช้งานบ่อยแค่ไหนหากการดำเนินการเกิดจากข้อ จำกัด FK ที่มี CASCADE UPDATE


11

ผมเข้าใจว่าทริกเกอร์บนเสื้อตารางที่กำหนดไว้กับจะทำงานเมื่อตอนที่ผมดำเนินการFOR EACH STATEMENTUPDATE t ...

ทีนี้เมื่อtถูกกำหนดด้วยFOREIGN KEY ... REFERENCES a ... ON UPDATE CASCADEและฉันอัพเดทแถว N แถวaนั่นจะทำให้ทริกเกอร์ถูกเรียกครั้งเดียวหรือครั้ง N หรือไม่?

สิ่งที่แตกต่างกันคือการเปลี่ยนแปลงในตารางที่เรียงซ้อนกันโดยข้อ จำกัด FK เป็นแบบเดี่ยวUPDATEมากกว่าหรือมากกว่าแบบอนุกรมUPDATEหรือไม่?


4
คุณสามารถสร้างกรณีทดสอบ! แทรกเข้าไปในตารางอื่นในเนื้อความของทริกเกอร์และดูจำนวนแถวที่คุณได้รับ จากนั้นเขียนขึ้นในคำตอบของคุณเองสำหรับคำถามนี้ (ที่ได้รับอนุญาตสนับสนุนแม้)
Colin 't Hart

2
ประโยคชั้นนำที่กล่าวถึงFOR EACH STATEMENTเป็นมุมฉากของคำถามที่เหลือ จำกัด FK FOR EACH ROWจะดำเนินการกับทริกเกอร์พิเศษ
Erwin Brandstetter

1
@ เออร์วิน "สำหรับแต่ละแถวของ" หรือ "สำหรับแต่ละแถวของ"
ypercubeᵀᴹ

@ypercube: ฉันได้เพิ่มคำตอบพร้อมรายละเอียดแล้ว
Erwin Brandstetter

คำตอบ:


6

ข้อ จำกัด ต่างประเทศที่สำคัญถูกนำมาใช้กับทริกเกอร์ภายในพิเศษ FOR EACH ROWทั้งหมดของพวกเขาจะถูกเรียกใช้

โปรดทราบว่านี่คือรายละเอียดการใช้งานที่สามารถเปลี่ยนแปลงได้ดังนั้นอย่าพึ่งพา แต่พื้นฐานไม่ได้เปลี่ยนไปในสองสามเวอร์ชันหลักดังนั้นการเปลี่ยนแปลงครั้งใหญ่จึงไม่น่าเป็นไปได้

ฉันวิ่งทดสอบอย่างรวดเร็วด้วยง่าย จำกัด FK จากไปtbl tbltypeใช้ FK อย่างง่ายพร้อมกับทริกเกอร์ภายในสี่ตัวFOR EACH ROWในการทดสอบของฉันในหน้า 9.4
ต่อไปนี้เป็นบทสรุปอย่างรวดเร็วเกี่ยวกับวิธีตรวจสอบ:

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'

"noaction" ภายในสองชุดtbltypeทำงาน
ทริกเกอร์ "check" ภายในสองอันtblทำงาน
ทั้งหมดของพวกเขาจะดำเนินการตามที่ระบุโดยเลขคี่ในFOR EACH ROWtgtype

2 ไบต์ของ Postgres tgtype smallintเป็นตัวแทนint16ในรหัสที่มา C TRIGGER_TYPE_ROWที่น้อยถอดรหัสบิตอย่างมีนัยสำคัญ คำอธิบายโดยละเอียดที่นี่:

คุณสามารถทดสอบสิ่งนี้ได้อย่างง่ายดายด้วยทริกเกอร์ที่เหมือนกันซึ่งคุณเปลี่ยนFOR ROW/ STATEMENT...


5

มันจะดำเนินการครั้ง N และวิธีที่ง่ายที่สุดที่จะเห็นสิ่งนี้คือการดำเนินการคำสั่งที่มีEXPLAIN ANALYZEprepended คือ

EXPLAIN ANALYZE UPDATE a SET col = 1 WHERE othercol = 'foo';

สิ่งนี้จะให้ข้อมูลคล้ายกับคุณ:

Trigger for constraint t_col_fk on a: time=1.300 calls=9

(ทดสอบกับ 9.2)


1
มันค่อนข้างน่าแปลกใจสำหรับฉัน ทดสอบกับ 9.4 ด้วยผลลัพธ์เดียวกัน
dezso
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.