SQL ट्रिगर और जब या जब उनका उपयोग नहीं करना है।


43

जब मैं मूल रूप से एसक्यूएल के बारे में सीख रहा था, तो मुझे हमेशा बताया गया था, केवल ट्रिगर का उपयोग करें यदि आपको वास्तव में ज़रूरत है और यदि संभव हो तो इसके बजाय संग्रहीत प्रक्रियाओं का उपयोग करने का विकल्प चुनें।

अब दुर्भाग्य से उस समय (कुछ साल पहले) मैं उतना उत्सुक नहीं था और बुनियादी बातों की परवाह कर रहा था क्योंकि अब मैं ऐसा कभी नहीं कर पाया हूं।

इसमें समुदायों की क्या राय है? क्या यह केवल किसी की व्यक्तिगत पसंद है, या ट्रिगर को टाला जाना चाहिए (बस अभिशापों की तरह) जब तक कि उनके लिए कोई अच्छा कारण न हो।


जवाबों:


32

डेटाबेस ट्रिगर्स पर विकिपीडिया लेख प्रस्तुत करता है क्या चलाता हैं का एक अच्छा सिंहावलोकन और जब उन्हें विभिन्न डेटाबेस में उपयोग करने के लिए।

निम्न चर्चा केवल SQL सर्वर पर आधारित है।

ट्रिगर्स का उपयोग करना काफी मान्य है जब उनका उपयोग उचित है। उदाहरण के लिए, उनके पास हर टेबल पर CRUD कमांड के साथ स्पष्ट प्रक्रियात्मक कोड की आवश्यकता के बिना ऑडिटिंग (डेटा का इतिहास रखने) में अच्छा मूल्य है।

ट्रिगर डेटा बदलने से ठीक पहले और डेटा बदलने के ठीक बाद आपको नियंत्रण देते हैं। इसके लिए अनुमति देता है:

  • जैसा कि पहले उल्लेख किया गया है
  • वांछित होने पर वैधता और व्यावसायिक सुरक्षा जाँच। इस प्रकार के नियंत्रण के कारण, आप डेटाबेस में आवेषण से पहले और बाद में स्तंभ स्वरूपण जैसे कार्य कर सकते हैं।

मुझे हमेशा कहा गया था, केवल ट्रिगर्स का उपयोग करें यदि आपको वास्तव में ज़रूरत है और यदि संभव हो तो इसके बजाय संग्रहीत प्रक्रियाओं का उपयोग करें।

इसके कुछ कारण हो सकते हैं:

  1. पुराने दिनों में ट्रिगर करने वाले कुछ फ़ंक्शंस अब अन्य तरीकों से किए जा सकते हैं जैसे किसी कॉलम पर कुल योग और स्वचालित गणना को अपडेट करना।
  2. आप यह नहीं देखते हैं कि जहां वे मौजूद हैं, बिना कोड को जांचे ही ट्रिगर को लागू कर दिया जाता है। जब आप डेटा में परिवर्तन देखते हैं तो आप उनका प्रभाव देखते हैं और यह पता लगाने के लिए कभी-कभी हैरान हो जाते हैं कि परिवर्तन तब तक क्यों हुआ जब तक आपको पता नहीं है कि टेबल पर एक ट्रिगर या अधिक अभिनय है।
  3. यदि आप कई डेटाबेस नियंत्रणों जैसे कि CHECK, RI, ट्रिगर का उपयोग कई टेबल पर करते हैं, तो आपका लेनदेन विस्तृत प्रवाह समझने और बनाए रखने के लिए जटिल हो जाता है। आपको यह जानना होगा कि वास्तव में क्या होता है। फिर, आपको इसके लिए अच्छे प्रलेखन की आवश्यकता होगी।

ट्रिगर और गैर-ट्रिगर संग्रहीत प्रक्रियाओं के बीच कुछ अंतर हैं (दूसरों के बीच):

  • एक गैर-ट्रिगर संग्रहित प्रक्रिया एक प्रोग्राम की तरह होती है जिसे अपना काम करने के लिए कोड या किसी शेड्यूलर से या किसी बैच की नौकरी आदि से स्पष्ट रूप से आमंत्रित करना पड़ता है, जबकि ए ट्रिगर एक विशेष प्रकार की संग्रहित प्रक्रिया है जो एक फायरिंग के रूप में होती है उपयोगकर्ता द्वारा सीधे निष्पादित किए जाने के बजाय एक घटना की प्रतिक्रिया। घटना उदाहरण के लिए डेटा कॉलम में डेटा का परिवर्तन हो सकता है।
  • ट्रिगर के प्रकार हैं। DDL ट्रिगर और DML ट्रिगर (प्रकार: INSTEAD OF, For, और AFTER)
  • गैर-ट्रिगर संग्रहित प्रक्रियाएं किसी भी प्रकार की वस्तु को संदर्भित कर सकती हैं, हालांकि, एक दृश्य को संदर्भित करने के लिए, आपको इनस्टार्स ऑफ ट्रिगर्स का उपयोग करना चाहिए।
  • SQLServer में, आप गैर-ट्रिगर संग्रहीत प्रक्रियाओं पर कोई भी संख्या रख सकते हैं लेकिन प्रति तालिका ट्रिगर के केवल 1 INSTEAD।

8

ट्रिगर किसी भी जटिल डेटा अखंडता नियमों के लिए एक आवश्यकता है। इन्हें डेटाबेस के अलावा कहीं भी लागू नहीं किया जा सकता है या आपको डेटा अखंडता की समस्या होगी।

जब तक आप डेटाबेस के सभी परिवर्तनों (जो अनुप्रयोग से ऑडिटिंग की समस्या है) पर कब्जा नहीं करना चाहते, वे ऑडिटिंग के लिए सबसे अच्छी जगह हैं।

यदि प्रदर्शन सावधानी से नहीं लिखे गए हैं तो ट्रिगर प्रदर्शन के मुद्दों का कारण बन सकते हैं और पर्याप्त डेवलपर्स उन्हें अच्छी तरह से लिखने के लिए पर्याप्त जानकार नहीं हैं। यह एक हिस्सा है जहां उन्हें अपना बुरा रैप मिलता है।

ट्रिगर अक्सर डेटा अखंडता को बनाए रखने के अन्य साधनों की तुलना में धीमा होते हैं, इसलिए यदि आप एक चेक बाधा का उपयोग कर सकते हैं, तो ट्रिगर के बजाय इसका उपयोग करें।

खराब ट्रिगर को लिखना आसान है जो ईमेल भेजने की कोशिश जैसी बेवकूफ चीजें करते हैं। क्या आप वास्तव में db में रिकॉर्ड्स बदलने में असमर्थ होना चाहते हैं अगर ईमेल सर्वर नीचे चला जाता है?

SQL सर्वर में, ट्रिगर्स रिकॉर्ड के एक बैच पर काम करते हैं। सभी अक्सर डेवलपर्स को लगता है कि उन्हें केवल एक रिकॉर्ड आवेषण, अपडेट या हटाने की आवश्यकता है। यह एक प्रकार का डेटा परिवर्तन नहीं है जो एक डेटाबेस में होता है और सभी ट्रिगर्स को 1 रिकॉर्ड परिवर्तन और कई रिकॉर्ड परिवर्तनों की शर्तों के तहत परीक्षण किया जाना चाहिए। दूसरा परीक्षण करने के लिए भूल जाने से बहुत खराब प्रदर्शन करने वाले ट्रिगर या डेटा अखंडता का नुकसान हो सकता है।


3

डेटाबेस ट्रिगर्स का उपयोग

  1. कॉलम मानों को स्वचालित रूप से चलाने के लिए।
  2. जटिल अखंडता बाधाओं को लागू करने के लिए।
  3. जटिल व्यावसायिक नियमों को लागू करने के लिए।
  4. जटिल सुरक्षा प्राधिकरणों को अनुकूलित करने के लिए।
  5. प्रतिकृति तालिकाओं को बनाए रखने के लिए।
  6. डेटा संशोधन का ऑडिट करना।

2

एक अन्य उपयोग का मामला जो मैंने व्यक्तिगत रूप से सामने आया है वह उन डेटाबेसों के लिए है जो एक से अधिक प्रोग्राम द्वारा एक्सेस किए जाते हैं। यदि आप कार्यक्षमता को लागू करना चाहते हैं, लेकिन इसके लिए सभी प्रणालियों को नया स्वरूप नहीं देते हैं, तो एक ट्रिगर एक समझदार समाधान बनाता है।

उदाहरण के लिए, मैंने हाल ही में एक डेटाबेस पर काम किया है जो पहले केवल एक कार्यालय प्रणाली के रूप में मौजूद था। जब एक वेबऐप को इसके साथ इंटरफेस करने के लिए लिखा गया था, तो हम एक अधिसूचना प्रणाली (उदाहरण के लिए स्टैकएक्सचेंज के समान) को लागू करना चाहते थे, जिसे कई घटनाओं द्वारा निकाल दिया जाएगा, जैसे कि लेनदेन को संसाधित करना, और इसके बाद। हम एक ट्रिगर को लागू करने में सक्षम थे ताकि कार्यालय बैकएंड में अपडेट ने फ्रंटएंड के लिए अधिसूचना बनाने के लिए ट्रिगर को निकाल दिया और उपयोगकर्ता को बताए कि उनके लेनदेन को कार्यालय द्वारा संसाधित किया गया था।


1

ट्रिगर का उपयोग डेटाबेस पर बाधाओं को लागू करने के लिए किया जा सकता है जो डेटाबेस स्कीमा निर्माण और किसी भी डीएमएल स्टेटमेंट के दौरान लागू नहीं किया जा सकता है।


0

कहते हैं कि आपको वास्तविक समय के पास डेटा को तीसरे पक्ष की प्रणाली में धकेलने की आवश्यकता है। आपकी तालिका में 950 गीगाबाइट डेटा है, इसलिए यह केवल 3 पार्टी ऐप पर संपूर्ण तालिका को पुश करने के लिए बहुत बड़ा है।

इसके बजाय आप एक कतार में परिवर्तन जमा करते हैं। कुछ बाहरी कार्यक्रम समय-समय पर कतारबद्ध डेटा के छोटे बैचों को बाहर कर देंगे।

प्रणाली में 2000 से अधिक संग्रहीत कार्यविधियाँ हैं। आपको यह भी पता है कि स्रोत कोड में टन का एसक्यूएल मौजूद है। यह सुनिश्चित करने के लिए कि कतार सही ढंग से आबाद है, आपको सभी संग्रहीत प्रोक्स और कोड के माध्यम से खोजना होगा और आशा है कि आप कुछ भी याद नहीं करेंगे।

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

इस परिदृश्य में मैं कहूंगा कि ट्रिगर का उपयोग नहीं करना एक बुरा डिजाइन विकल्प है। यदि बाद में आप डेटा को पुश करने की एक नई विधि का उपयोग करना चाहते हैं (जैसे कतार बाहर काम नहीं कर रही है) और यदि आप ट्रिगर का उपयोग करते हैं तो इंटरफ़ेस परिवर्तन आपके द्वारा सुरक्षित हैं। ट्रिगर अक्सर सबसे अच्छा विकल्प हैं। हठधर्मिता विरोधी ट्रिगर प्रशंसकों के लिए मत सुनो।


लेकिन निश्चित रूप से कई चीजें हैं जिन्हें ट्रिगर के साथ लागू नहीं किया जाना चाहिए।
लॉर्ड टाइडस

-6

एक ट्रिगर जो ईमेल भेजता है जरूरी नहीं कि वह 'बेवकूफ' विचार हो। क्या बेवकूफी है डिजाइन में ईमेल आउटेज की आशंका नहीं है और इसे सुंदर ढंग से w / o डेटा हानि से निपटना है। इसका 'बेवकूफ' हिस्सा आलसी डेवलपर्स द्वारा गैर-मौजूदगी वाली त्रुटि से निपटने के लिए वास्तव में खराब है, जो महसूस करते हैं कि वे गलतियां करने के लिए प्रतिरक्षा हैं।

मैं यह अवलोकन भी प्रस्तुत करूंगा कि एक संग्रहीत प्रक्रिया / फ़ंक्शन को लागू करके एक ट्रिगर को सरल रखा जा सकता है जो मनमाने ढंग से जटिल हो सकता है और कई ट्रिगर या अन्य संग्रहीत प्रक्रियाओं द्वारा पुन: प्रयोज्य हो सकता है। यही कारण है कि पैकेज और पुस्तकालय हैं।

बिगोट्री वास्तव में अपंग है।


1
मुझे इस प्रश्न में कहीं भी नहीं दिखता कि "ईमेल" शब्द का उल्लेख कहाँ है। क्या आप शायद एक और जवाब देने की कोशिश कर रहे थे? स्टैक एक्सचेंज एक मंच नहीं है
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.