2009-08-09 13 views
8

सुंदर सामान्य एसक्यूएल सर्वर में चलाता 2005कर आग से चलाता है और जब जब वे

किन स्थितियों तालिका निकाल दिया चलाता है और किन परिस्थितियों में वे नहीं कर रहे हैं के बारे में सवाल नहीं करते हैं?

किसी भी कोड को प्रदर्शित करने के उदाहरण बहुत अच्छा होगा।

मैं एक लेखा परीक्षा आधारित डेटाबेस लिख रहा हूँ और सिर्फ इतना है कि बंद चलाता है कि मैं अद्यतन के लिए स्थापित किया है आग नहीं हो सकता है, हटा सकते हैं और मेरी मेज पर डालने किसी भी परिस्थितियों के बारे में पता होना चाहता हूँ।

मैं क्या मतलब का एक उदाहरण है,

UPDATE MyTable SET name = 'test rows' WHERE id in (1, 2, 3); 

निम्नलिखित बयान केवल अद्यतन ट्रिगर एक बार सक्रिय करता है।

+0

मैंने अब सीखा है कि वे TRUNCATE - http://stackoverflow.com/questions/2234223/sql-trigger-on-truncate –

उत्तर

16

जब आप उन्हें आग करना चाहते हैं?

CREATE TRIGGER AFTER ACTION 
के बाद कार्रवाई ( insert update delete) नहीं किए जा चलाता है यही कारण है कि

INSTEAD OF कार्रवाई के स्थान पर ट्रिगर को आग लगती है।

ट्रिगर्स के साथ सबसे बड़ी गॉथस में से एक यह है कि जब भी कोई कार्रवाई नहीं होती है, तो वे आग लगती हैं, यदि कोई पंक्ति प्रभावित नहीं होती है। यह एक बग नहीं है, और यह कुछ ऐसा है जो आपको सावधानी से जला सकता है यदि आप सावधान नहीं हैं।

इसके अलावा, ट्रिगर्स के साथ, आप inserted और deleted टेबल का उपयोग करेंगे। अपडेट की गई पंक्तियां दोनों में सूचीबद्ध हैं। यह बहुत से लोगों को फेंक देता है, क्योंकि उन्हें update के बारे में delete के रूप में insert के रूप में सोचने के लिए उपयोग नहीं किया जाता है।

एमएसडीएन दस्तावेज वास्तव में आग लगने पर और here के प्रभाव के बारे में एक गहन गहन चर्चा है।

+0

पर आग नहीं लगा सकते हैं क्या आप एक उदाहरण दे सकते हैं जो दिखाता है कि कोई ट्रिगर समस्याएं कैसे बना सकता है पंक्तियां प्रभावित होती हैं? धन्यवाद। –

+2

इस पर एक नज़र डालें: http://www.sqlfiddle.com/#!6/be3d3/3। मैंने ट्रिगर्स को लोगों को ईमेल बंद करने के लिए निर्धारित किया है। यदि आपके पास ऐसी प्रक्रिया है जो निष्क्रिय रूप से आवेषण या अपडेट रिकॉर्ड करता है जो शायद ही कभी किसी पंक्ति को प्रभावित करता है लेकिन केवल इसे चुनाव करता है, जो आपको बहुत तेज़ी से जला सकता है। अंगूठे के नियम के रूप में, हमेशा अपने ट्रिगर में पंक्तियों को प्रभावित करते हैं या नहीं! – Eric

+0

मुझे पता है कि यह पुराना है, लेकिन बस डाले गए और हटाए गए दोनों का उपयोग करके अपडेट को समझाने के लिए एक वोट दिया। यह मेरे ट्रिगर डिजाइन के साथ कुछ घंटों के लिए लड़ने के बाद मेरे बेकन को बचाया। – gmaness

2

मैंने सोचा कि मैं लिंक एरिक एक स्थिति तैनात है, जिसमें एक ट्रिगर नहीं आग होगा से प्रकाश डाला चाहते हैं:

हालांकि एक कम तालिका कथन एक हटाएँ प्रभाव में है, क्योंकि आपरेशन एक ट्रिगर सक्रिय नहीं कर सकते व्यक्तिगत पंक्ति हटाने को लॉग नहीं करता है। हालांकि, केवल एक ट्रंकेट टेबल निष्पादित करने के लिए तालिका पर अनुमतियों वाले लोगों को अनजाने में एक ट्रंकेट टेबल स्टेटमेंट के साथ एक डेली ट्रिगर को बाधित करने के बारे में चिंतित होना चाहिए।

· एक तालिका गिरा दिया जाता है:

5

2008 पर आप Change Data Capture

में बनाया का उपयोग कर सकते इसके अलावा काफी कुछ स्थितियों ट्रिगर आग नहीं है, इस तरह के रूप हैं।

· एक तालिका काट दिया गया। नेस्टेड और/या पुनरावर्ती चलाता के लिए

· सेटिंग शुरू होने से ही ट्रिगर को रोकने के।

· डेटा थोक भरी हुई है, ट्रिगर को दरकिनार।

3

निम्नलिखित कथन केवल एक बार अद्यतन ट्रिगर को सक्रिय करता है।

कोई भी क्रिया प्रकार विवरण केवल एक बार ट्रिगर को सक्रिय करता है इससे कोई फर्क नहीं पड़ता कि कितनी पंक्तियां प्रभावित होती हैं, ट्रिगर्स को कई पंक्ति प्रविष्टियों/अपडेट/डिलीटों को संभालने के लिए लिखा जाना चाहिए।

यदि आपका ट्रिगर डालने वाले या हटाए गए छद्म कोडों में एक समय में केवल एक पंक्ति पर निर्भर करता है, तो यह असफल हो जाएगा। और इससे भी बदतर यह किसी त्रुटि के साथ असफल नहीं होगा, यह केवल उन सभी पंक्तियों को प्रभावित नहीं करेगा जिन्हें आप ट्रिगर करते हैं। किसी ट्रिगर में लूप या कर्सर के माध्यम से इसे ठीक न करें, सेट-आधारित तर्क में बदलें। एक ट्रिगर में एक कर्सर आपके पूरे ऐप को एक डरावना ठहराव में ला सकता है जबकि 500,000 रिकॉर्ड प्रक्रियाओं का लेनदेन और घंटों तक टेबल को लॉक कर देता है।

पास ट्रिगर्स द्वारा थोक प्रविष्टियां जब तक कि आप उनका उपयोग करने के लिए निर्दिष्ट नहीं करते हैं। इसके बारे में जागरूक रहें क्योंकि यदि आप ट्रिगर को पारित करते हैं तो आपको यह सुनिश्चित करने के लिए कोड की आवश्यकता होगी कि ट्रिगर में जो कुछ भी होता है वह भी थोक सम्मिलन के बाद होता है। या आपको FIRE_TRIGGERS विकल्प के साथ थोक प्रविष्टियों को कॉल करने की आवश्यकता है।

संबंधित मुद्दे