यदि कोई कार्रवाई UPKATE CASCADE के साथ FK बाधा के कारण होती है, तो EACH STATEMENT ट्रिगर निष्पादन के लिए कितनी बार होगा?


11

मैं समझता हूं कि FOR EACH STATEMENTजब मैं निष्पादित करता हूं तो टेबल टी के साथ ट्रिगर एक बार चल जाएगा UPDATE t ...

अब, जब tपरिभाषित किया जाता है FOREIGN KEY ... REFERENCES a ... ON UPDATE CASCADE, और मैं एन पंक्तियों को अपडेट करता हूं a, तो क्या ट्रिगर को एक बार या एन बार कहा जाएगा?

अलग-अलग रखो, एक एफके बाधा द्वारा कैस्केड की गई तालिका में परिवर्तन एकल की तरह UPDATE, या अधिक की श्रृंखला की तरह है UPDATE?


4
आप एक परीक्षण मामला बना सकते हैं! ट्रिगर के शरीर में किसी अन्य तालिका में डालें और देखें कि आपको कितनी पंक्तियाँ मिलती हैं। फिर इस प्रश्न के अपने उत्तर में लिखें (यह अनुमति है, यहां तक ​​कि प्रोत्साहित किया गया है)!
कॉलिन टी हार्ट

2
उल्लेख करने वाले प्रमुख वाक्य FOR EACH STATEMENTबाकी प्रश्न के लिए ऑर्थोगोनल है। एफके बाधाओं को विशेष ट्रिगर के साथ लागू किया जाता है FOR EACH ROW
इरविन ब्रान्डेसटेटर

1
@Erwin "E ROW के लिए" या "EACH ROW of t"?
ypercube y

@ypercube: मैंने विवरण के साथ एक उत्तर जोड़ा।
इरविन ब्रान्डेसटेटर

जवाबों:


6

विदेशी कुंजी बाधाओं को वर्तमान में विशेष आंतरिक ट्रिगर के साथ लागू किया गया है। सब के सब भाग जाते हैं FOR EACH ROW

ध्यान दें कि ये कार्यान्वयन विवरण हैं जो बदल सकते हैं, इसलिए इस पर भरोसा न करें। लेकिन मूल संस्करणों में पिछले कुछ संस्करणों में बदलाव नहीं हुआ है, इसलिए बड़े बदलाव की संभावना नहीं है।

मैं से एक सरल FK बाधा के साथ एक त्वरित परीक्षण भागा tblकरने के लिए tbltype। एक साधारण एफके को 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'

दो आंतरिक "संकेतन" पर ट्रिगर होता है tbltype
दो आंतरिक "चेक" पर ट्रिगर होता है tbl
वे सभी चलाए जा रहे हैं FOR EACH ROW, जैसा कि विषम संख्याओं द्वारा इंगित किया गया है tgtype

Postgres के 2 बाइट्स C स्रोत कोड में tgtype smallintप्रतिनिधित्व करते हैं int16जहां कम से कम महत्वपूर्ण बिट एन्कोड होता है TRIGGER_TYPE_ROW। यहाँ विस्तृत विवरण:

आप इसे समान ट्रिगर्स की एक जोड़ी के साथ आसानी से परख सकते हैं, जहां आप केवल परिवर्तन FOR ROW/ STATEMENT...


5

यह N समय को निष्पादित करता है, और इसे देखने का सबसे आसान तरीका है कि EXPLAIN ANALYZEपूर्वनिर्धारित, यानी के साथ कथन को निष्पादित करें

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.