2008-10-16 9 views
23

मेरे पास एक सारणी है जिसमें उस पर एक सम्मिलित ट्रिगर है। यदि मैं संग्रहीत प्रक्रिया से एक सम्मिलित कथन में इस तालिका में 6000 रिकॉर्ड्स में सम्मिलित करता हूं, तो संग्रहीत ट्रिगर पूरा होने से पहले संग्रहित प्रक्रिया वापस आ जाएगी?एसक्यूएल ट्रिगर सिंक्रोनस या असिंक्रोनस हैं?

बस ऐसे ही मैं सही ढंग से सोच रहा हूँ, ट्रिगर केवल बुलाया जाना चाहिए (मुझे पता है 'कहा जाता है' सही शब्द नहीं है) सुनिश्चित करने के लिए एक बार, क्योंकि वहाँ केवल 1 डालने बयान सही था,?

मेरा मुख्य सवाल यह है: sproc खत्म भले ही ट्रिगर पूरा नहीं किया है होगा?

उत्तर

19

आपका सम्मिलित ट्रिगर पूरे सम्मिलन कथन के लिए एक बार चलाएगा। यही कारण है कि inserted अस्थायी तालिका का उपयोग करना महत्वपूर्ण है कि वास्तव में क्या डाला गया है, और न केवल हालिया एकल रिकॉर्ड, या ऐसा कुछ चुनें।

मैं सिर्फ एक डालने और अद्यतन ट्रिगर परीक्षण किया है और वास्तव में, वे एसक्यूएल सर्वर द्वारा डालने का हिस्सा माना जाता है। ट्रिगर खत्म होने तक प्रक्रिया खत्म नहीं होगी।

+1

इसका उल्लेख करने के लिए धन्यवाद। मैं इसके बारे में भूल गया, और ठीक उसी तरह किया जो मुझे एक ऐसी स्थिति में नहीं करना चाहिए जिसमें एक ट्रिगर है जिसे मैं तैनात करने वाला हूं। मैंने हाल ही में आईडी के बजाय डालने से पूरे सम्मिलित सेट को संभालने के लिए इसे फिर से लिखा है। Eek! एक हेलुवा बग हो सकता था। ;) –

+0

अरे खुश मैं मदद कर सकता था! –

1

ट्रिगर कॉल असीमित नहीं है। आपकी डालने की प्रक्रिया के लिए प्रत्येक कॉल के परिणामस्वरूप ट्रिगर निकाल दिया जाएगा, और प्रक्रिया ट्रिगर खत्म होने तक वापस नहीं आएगी।

को देखने के लिए यह कैसे काम करता क्वेरी योजना पर एक नजर डालें। आप देखेंगे कि ट्रिगर में बयान प्रत्येक कॉल के लिए प्रक्रिया के लिए बुलाया जाएगा।

6

ट्रिगर्स लेनदेन का हिस्सा हैं जिन्हें उन्हें बुलाया जाता है।

ट्रिगर के बारे में एक महत्वपूर्ण बात यह है कि आप के बारे में पता होना चाहिए कि एसक्यूएल सर्वर में kleast पर प्रत्येक लेनदेन (के लिए ट्रिगर आग एक बार, आप अन्य डीबीएस जाँच shoudl, लेकिन तो भी यह पंक्ति दर पंक्ति पर कार्रवाई करेंगे, कि आम तौर पर होता है एक गरीब विचार), इसलिए यदि आप 6000 रिकॉर्ड डालते हैं तो ट्रिगर 6000 बार नहीं होता है। बहुत से लोग इस बारे में अवगत नहीं हैं और ट्रिगर लिखते हैं जैसे कि वे एक समय में एक रिकॉर्ड कई रिकॉर्ड प्रविष्टियां संसाधित करेंगे। यह सच नहीं है और आपके ट्रिगर को एकाधिक रिकॉर्ड डालने के लिए जिम्मेदार होना चाहिए।

+1

यह ट्रिगर परिभाषा पर निर्भर करता है। ओरेकल में उदाहरण के लिए हम प्रत्येक पंक्ति के लिए हर पंक्ति के लिए ट्रिगर निष्पादन की मांग कर सकते हैं। http://docs.oracle.com/cd/A97630_01/appdev.920/a96590/adg13trg.htm#431 –

1

बात है,, ट्रिगर आग है हर बार TRIGGER मानदंडों को पूरा कर रहा है। यह बैच प्रसंस्करण या लेनदेन में एक बार आग लगती है। मेरी lesson 101 TRIGGER

-1

पर आप ट्रिगर पंक्ति कार्रवाई करने के लिए डालने बयान में कर्सर का उपयोग करना चाहिए देखें। क्योंकि प्रति पंक्ति एक बार SQL सर्वर में ट्रिगर्स एक बार प्रति पंक्ति नहीं।

+0

कोई परिस्थिति नहीं है जहां आपको एक एसक्यूएल सर्वर ट्रिगर में कर्सर का उपयोग करना चाहिए। आपको कर्ताओं को ईमानदारी से पहले और जितनी जल्दी हो सके चलाने के लिए लिखने की जरूरत है। जबकि एक कर्सर पहले कर सकता है, यह आखिरी बार बुरी तरह विफल रहता है। आपको सेट आधारित प्रसंस्करण का उपयोग करना चाहिए। मैं अपने टेबल को घंटों तक लॉक नहीं करना चाहता, जबकि यह एक कर्सर के माध्यम से प्रक्रिया करता है जो सेकंड या मिलीसेकंड ले सकता है। हमने उसे 45 मिनट से 40,000 रिकॉर्ड 40 सेकंड तक संसाधित करने के लिए हटा दिया। ट्रिगर में कर्सर का उपयोग करना गैर जिम्मेदार है। – HLGEM

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