क्या डेटाबेस ट्रिगर बुराई है? [बन्द है]


186

क्या डेटाबेस ट्रिगर एक बुरा विचार है?

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

दूसरी ओर, ऐसा लगता है कि अगर आपके पास तर्क है कि एक बार नया होना चाहिए FOOडेटाबेस में बनाया गया है तो सबसे मूर्ख जगह यह FOO तालिका पर एक सम्मिलित ट्रिगर है।

ट्रिगर्स का उपयोग करने का एकमात्र समय वास्तव में सरल चीज़ों के लिए है जैसे कि सेटिंग करना ModifiedDate


30
यह पूरी तरह से वैध सवाल है, लेकिन मुझे सनसनीखेज शीर्षक पसंद नहीं है। मुझे लगता है कि "डेटाबेस ट्रिगर करने पर विचार करने के लिए सबसे महत्वपूर्ण मुद्दे क्या हैं?" ज्यादा बेहतर होगा।
तमस Czinege

2
प्रश्न उत्तर जोड़ने के लिए बंद है, लेकिन यह भी देखें कि क्या डेटाबेस ट्रिगर क्रॉस टेबल अखंडता बाधाओं के लिए सुरक्षित हैं? । (Spoiler: नहीं, वे नहीं हैं)
Mifeet

16
यह साइट मुझे बहुत परेशान करती है। यह एक है महान कई अन्य लोगों की तरह अभी तक सवाल अपने आप बंद हो क्योंकि लोगों को कल्पना की कमी है सवाल है कि कुछ विदेशी कारण पालन करने के लिए मजबूर महसूस के लिए क्यू एंड ए वे के आदिम द्विपदीय प्रारूप में फिट नहीं बैठते स्वीकार करने के लिए।
Quibblesome

1
एक ट्रिगर में व्यापार तर्क समस्याग्रस्त है (बुराई, यदि आप करेंगे)। एक ट्रिगर में डेटाबेस तर्क समस्याग्रस्त नहीं है (अखंडता, लॉगिंग)।
ग्रेग गम

1
मुझे कोड नेविगेशन और समझने के लिए आईडीई पर निर्भर रहना पसंद है। मैं ऐसा नहीं कर सकता, यदि आधा तर्क डेटाबेस में और अन्य आधा विकल्प की प्रोग्रामिंग भाषा में है। ट्रिगर्स के बजाय मुझे एक नियंत्रक बनाना आसान लगता है जिसे हर अनुरोध से गुजरना पड़ता है। इसके बजाय सभी 'ट्रिगर्स' को वहां लागू किया जा सकता है।
मुहम्मद उमर

जवाबों:


147

ट्रिगर्स के साथ मुख्य समस्याएं हैं

  • वे पूरी तरह से वैश्विक हैं - वे टेबल गतिविधि के संदर्भ में कोई फर्क नहीं पड़ता कि क्या लागू होता है;
  • वे चोरी-छिपे होते हैं; यह भूल जाना आसान है कि वे वहां हैं जब तक कि वे आपको अनजाने (और बहुत रहस्यमय) परिणामों से चोट नहीं पहुंचाते।

इसका मतलब यह है कि उन्हें उचित परिस्थितियों के लिए सावधानीपूर्वक उपयोग करने की आवश्यकता है; जो कि मेरे अनुभव में संबंधपरक अखंडता के मुद्दों तक सीमित है (कभी-कभी आप बेहतर तरीके से प्राप्त कर सकते हैं) और आमतौर पर व्यापार या लेन-देन के उद्देश्यों के लिए नहीं। YMMV।


20
वे 2 फायदे हैं, कुछ मामलों में।
जॉननो नोलन

18
"चुपके" एक महान शब्द है, हाँ - अच्छी तरह से कहा। यही कारण है कि मैं उनसे दूर भागता हूं: अक्सर वे भूल जाते हैं या नजरअंदाज कर दिए जाते हैं। मेरे व्यक्तिगत अनुभव में, ट्रिगर्स को फिर से देखना अक्सर मेरे खुद के माथे पर एक स्मैक के साथ होता है।
क्रिश्चियन नूनतो

5
वैश्विक इसलिए वे डेटा अखंडता और ऑडिटिंग जैसी चीजों के लिए अच्छे और आवश्यक हैं। यह माइनस नहीं है, यह एक प्लस है।
HLGEM

4
तो @ Robert ,evčík-Robajz, आप कह रहे हैं सभी डेवलपर्स आप जानते हैं कि अधूरे हैं?
एचएलजीईएम

3
@HGLEM, सहमत हैं कि ट्रिगर्स को काम करने के लिए एक विशेषज्ञ होना चाहिए। वास्तविक जीवन परिदृश्य - वहाँ नहीं है। वास्तविक जीवन परिदृश्य - दिन एक भूल ट्रिगर से संबंधित बग की पहचान करने की कोशिश कर रहे हैं। वास्तविक जीवन परिदृश्य - ट्रिगर लॉजिक को काफी आसानी से एप्लिकेशन लॉजिक में धकेला जा रहा है जहां इसे आसानी से रिफैक्ट किया जा सकता है और यूनिट-टेस्ट किया जा सकता है। यह वास्तविक जीवन है जिससे मैं निपटता हूं, मुझे कहता है कि "ट्रिगर से दूर रहें" ... यह ट्रिगर का दोष नहीं है क्योंकि यह पत्थरों का दोष नहीं है कि खिड़कियां टूट जाती हैं।
Rbjz

80

नहीं, वे वास्तव में एक अच्छे विचार हैं। यदि आपके विशिष्ट ट्रिगर्स के साथ कोई समस्या है, तो आप उन्हें सही नहीं कर रहे हैं, लेकिन इसका मतलब है कि आमतौर पर आपके कार्यान्वयन में समस्या है, कि स्वयं ट्रिगर्स की अवधारणा :-)।

हम एक महान सौदे का उपयोग करते हैं क्योंकि यह DBMS- विशिष्ट गतिविधि को डेटाबेस के नियंत्रण में रखता है जहां यह है। DBMS के उपयोगकर्ताओं को उस तरह के सामान के बारे में चिंता करने की आवश्यकता नहीं होनी चाहिए। डेटा की अखंडता डेटाबेस के साथ निहित है, कि उन अनुप्रयोगों या उपयोगकर्ताओं के लिए जो इसका उपयोग करते हैं। डेटाबेस में बाधाओं और ट्रिगर और अन्य सुविधाओं के बिना, यह नियमों को लागू करने के लिए अनुप्रयोगों पर छोड़ दिया जाता है और यह डेटा को नष्ट करने के लिए केवल एक दुष्ट या छोटी गाड़ी एप्लिकेशन / उपयोगकर्ता लेता है।

उदाहरण के लिए, ट्रिगर्स के बिना, ऑटो-जनरेटेड कॉलम जैसी अद्भुत चीजें मौजूद नहीं होंगी और आपको उनका चयन करते समय प्रत्येक पंक्ति पर एक फ़ंक्शन को संसाधित करना होगा। डीबीएमएस प्रदर्शन को मारने की संभावना है, सम्मिलित / अपडेट समय पर ऑटो-जनरेट किए गए कॉलम को बनाने के लिए बेहतर है क्योंकि यह एकमात्र समय बदलता है।

इसके अलावा, ट्रिगर्स की कमी से डेटा नियमों को DBMS पर लागू होने से रोका जा सकेगा, जैसे कि कॉलम एक विशिष्ट प्रारूप है यह सुनिश्चित करने के लिए प्री-ट्रिगर्स। ध्यान दें कि यह डेटा अखंडता नियमों से अलग है जो आम तौर पर सिर्फ विदेशी कुंजी लुक अप होते हैं।


9
"उन्हें चुनते समय प्रत्येक पंक्ति पर एक फ़ंक्शन को संसाधित करें"। ट्रिगर के बजाय इस उद्देश्य के लिए फ़ंक्शन आधारित इंडेक्स का उपयोग करना बेहतर है।
11

10
जरूरी नहीं है, ट्रिगर शायद तभी चलेगा जब पंक्ति डाली जाए या अपडेट की जाए। फ़ंक्शन-आधारित इंडेक्स प्रत्येक चयन के लिए चलेगा। उपयोग पैटर्न के आधार पर एक शायद दूसरे से बेहतर है। लेकिन न तो हमेशा अन्य की तुलना में बेहतर है।
jmucchiello

@tuinstoel: मुझे कुछ समय आपके कथन से सहमत होना होगा। उदाहरण के लिए, ओरेकल केवल फ़ंक्शन-आधारित इंडेक्स बनाएगा यदि यह साबित कर सकता है कि फ़ंक्शन नियतात्मक है। कभी-कभी यह साबित नहीं किया जा सकता है (उदाहरण के लिए, यदि फ़ंक्शन में तालिका से लुक-अप शामिल है, भले ही आपको पता हो कि तालिका का डेटा कभी नहीं बदलता है)।
एडम पेन्न्टर

50

उपकरण कभी बुरे नहीं होते। उन उपकरणों के अनुप्रयोग बुराई हो सकते हैं।


11
मैंने एक टिप्पणी पढ़ने के बाद कभी अधिक विरोध नहीं किया। एक तरफ, मैं दूसरा संशोधन कर रहा हूं और मानता हूं कि बंदूकें स्वाभाविक रूप से बुराई नहीं हैं: यह उनका उपयोग करने वाला व्यक्ति है। दूसरी ओर, मेरा मानना ​​है कि ट्रिगर बुरे हैं ... मुझे लगता है कि मैं एक अस्तित्वहीन
मेलोडाउन

37
@vbullinger बंदूकें दुष्ट नहीं हैं, लेकिन उनके ट्रिगर हैं;)
दारोगा एनराइट

2
: डी सामान्यकरण खतरनाक (पुनरावर्ती) हैं। क्या आप एक कबूलनामे को 'ट्रिगर' करने के लिए जिज्ञासुओं द्वारा इस्तेमाल किए जाने वाले अत्याचार 'टूल्स' से आए हैं? वैसे भी परिप्रेक्ष्य के लिए +1।
Rbjz

22

मैं सहमत हूँ। ट्रिगर्स के साथ समस्या लोग हैं, ट्रिगर्स नहीं। हालाँकि यह देखने के लिए अधिक है, विचार करने के लिए अधिक है और कोडर्स पर चीजों को सही ढंग से जांचने पर बढ़ता है, हम अपने अनुक्रम को सरल बनाने के लिए अनुक्रमित नहीं छोड़ते हैं। (खराब इंडेक्स खराब ट्रिगर्स की तरह खराब हो सकते हैं)

ट्रिगर्स (मेरे दिमाग में) का महत्व यह है कि ...
- किसी भी प्रणाली को हमेशा एक वैध स्थिति में होना चाहिए
- इस वैध राज्य को लागू करने के लिए कोड को केंद्रीकृत किया जाना चाहिए (प्रत्येक एसपी में नहीं लिखा गया है)

रखरखाव के दृष्टिकोण से, प्रतिस्पर्धी कॉडर्स और अधिक जूनियर / शौकिया लोगों के लिए समस्याओं के लिए एक ट्रिगर बहुत उपयोगी है। फिर भी, इन लोगों को किसी तरह सीखने और बढ़ने की जरूरत है।

मुझे लगता है कि यह आपके काम के माहौल के लिए नीचे आता है। क्या आपके पास विश्वसनीय लोग हैं जो अच्छी तरह से सीखते हैं और व्यवस्थित होने के लिए विश्वसनीय हो सकते हैं? यदि आपको प्रतीत नहीं होता है
कि आपके पास दो विकल्प हैं: - स्वीकार करें कि आपको क्षतिपूर्ति करने के लिए कार्यक्षमता खोनी होगी
- स्वीकार करें कि आपको अलग-अलग लोगों या बेहतर प्रशिक्षण और प्रबंधन की आवश्यकता है

वे कठोर ध्वनि करते हैं, और मुझे लगता है कि वे हैं। लेकिन यह मूल सत्य है, मेरे दिमाग में ...


3
>>> ट्रिगर्स के साथ समस्या लोग हैं। हाँ, अगर केवल लोग असेंबली में कोड कर सकते हैं, गंदे जीयूआई के साथ काम करते हैं, सही ढंग से अनुमान लगाते हैं कि क्या बुरी तरह से डिज़ाइन किए गए दरवाजे को धक्का देना या खींचना है ... कोई भी "सुविधा" लोगों को बार-बार गलत होती है "बुराई"।
फकरुद्दीन

1
@ फक्रूडेन, कोई भी डेवलपर जो ट्रिगर हो जाता है गलत है एक डेटाबेस तक पहुँचने के लिए अक्षम है।
HLGEM

20

मुझे लगता है कि ट्रिगर न केवल बुराई हैं, बल्कि अच्छे डेटाबेस डिजाइन के लिए आवश्यक हैं। एप्लिकेशन प्रोग्रामर सोचते हैं कि डेटाबेस केवल उनके आवेदन से प्रभावित हैं। वे अक्सर गलत होते हैं। यदि डेटा अखंडता को बनाए रखना है, तो कोई फर्क नहीं पड़ता कि डेटा परिवर्तन कहां से आया है, ट्रिगर एक आवश्यकता है और उनसे बचना मूर्खतापूर्ण है क्योंकि कुछ प्रोग्रामर यह मानने के लिए बहुत ही निरंकुश हैं कि उनके बेशकीमती एप्लिकेशन के अलावा कुछ चीजों को प्रभावित कर रहे हैं। यदि आप एक सक्षम डेटाबेस डेवलपर हैं तो ट्रिगर को डिज़ाइन या परीक्षण या समस्या निवारण करना मुश्किल नहीं है। न ही यह निर्धारित करना मुश्किल है कि ट्रिगर एक अप्रत्याशित परिणाम पैदा कर रहा है यदि यह आपके लिए होता है (जैसा कि यह मेरे लिए होता है) वहां देखने के लिए। यदि मुझे एक त्रुटि यह कहते हुए मिलती है कि मैं अपने संदर्भ में एक FK त्रुटि नहीं कर रहा हूँ, मैं इसके बारे में सोचे बिना भी जानता हूं कि ट्रिगर समस्या का कारण है और इसलिए किसी भी सक्षम डेटाबेस डेवलपर को चाहिए। केवल व्यावसायिक नियमों को लागू करना ही नंबर एक कारण है क्योंकि मैंने खराब डेटा पाया है क्योंकि दूसरों को यह पता नहीं है कि नियम भी मौजूद है और उनकी प्रक्रियाओं में इसका उल्लंघन होता है। डेटा-केंद्रित नियम डेटाबेस में हैं और ट्रिगर अधिक जटिल लोगों को लागू करने के लिए महत्वपूर्ण हैं।


डेटा-केंद्रित नियम डेटाबेस में हैं
अनुपस्थित

मेरे पास थाsome programmers are too ethnocentric to consider that something other than their prized application may be affecting things
किड्स 101

13

ज्यादातर, हाँ।

ट्रिगर के साथ कठिनाई यह है कि यह "आपकी पीठ के पीछे" सामान करता है; एप्लिकेशन को बनाए रखने वाले डेवलपर आसानी से महसूस नहीं कर सकते कि यह वहां है और बदलाव करें जो बिना किसी सूचना के चीजों को पेंच करते हैं।

यह जटिलता की एक परत बनाता है जो सिर्फ रखरखाव कार्य जोड़ता है।

ट्रिगर का उपयोग करने के बजाय, एक संग्रहीत प्रक्रिया / दिनचर्या, आमतौर पर एक ही काम करने के लिए बनाई जा सकती है, लेकिन एक स्पष्ट और बनाए रखने के तरीके में - एक संग्रहीत दिनचर्या को कॉल करने का मतलब है कि डेवलपर अपने स्रोत कोड को देख सकता है और वास्तव में वही देख सकता है जो हो रहा है।


12
यह एक ट्रिगर का लाभ है न कि असमानता! डेटा में हर बदलाव के लिए स्टोर किए गए प्रोक्स की गारंटी नहीं दी जा सकती। थे कई तरीके जीयूआई के अलावा डेटा बदला जा सकता है।
एचएलजीईएम

2
HLGEM, जो आपके अभिगम नियंत्रण पर निर्भर करता है। आप संग्रहीत कार्यविधि को छोड़कर सीधे तालिकाओं के किसी भी संशोधन से इनकार कर सकते हैं।
Rbjz

1
मुझे लगता है कि बिंदु यह है कि यदि, उदाहरण के लिए, दो तालिकाओं में रिकॉर्ड हमेशा बनाया जाना चाहिए और एक साथ नष्ट हो जाना चाहिए, चाहे आप डेटाबेस तक कैसे पहुंचें, और कोई फर्क नहीं पड़ता कि आप कौन हैं या आपके पास क्या अनुमति है, तो ट्रिगर एकमात्र वैध समाधान हैं । मात्र तथ्य यह है कि यह और भी है संभव भी कई या गलत अनुमतियां देने और लोगों को पता करने के लिए जो संग्रहित प्रक्रियाओं इस्तेमाल किया जाएगा उम्मीद करना है, जिसका अर्थ डेटाबेस इसकी अखंडता को खोने का खतरा है। यह वास्तव में विदेशी कुंजी रिश्तों के समान है। यह डेटाबेस इंजन द्वारा लागू किया गया केवल BEST और MOST RELIABLY है।
त्रिकोको

2
यदि रिकॉर्ड को हमेशा एक साथ बनाया / नष्ट किया जाना चाहिए, तो एक चेक बाधा बनाएं जो यह सुनिश्चित करता है कि वे हैं। इस तरह से नियमों को तोड़ने वाले को एक छिपे हुए व्यवहार के बजाय एक त्रुटि मिलती है, जो जादुई रूप से चीजों को उनके ज्ञान या सहमति के बिना सही बनाता है।
MarkR

9

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

वे एक बहुत अच्छा "हैक" उपकरण भी हैं। अक्सर ऐसी परिस्थितियां होती हैं, जहां आप कोड और डेटाबेस दोनों के तत्काल नियंत्रण में नहीं होते हैं। यदि आपको अपने कोड के अगले प्रमुख रिलीज के लिए 2 महीने इंतजार करना पड़ता है, फिर भी आप तुरंत अपने डेटाबेस में एक पैच लागू कर सकते हैं तो आप कुछ अतिरिक्त कार्यक्षमता प्रदर्शन करने के लिए एक मेज पर ट्रिगर लगा सकते हैं। फिर जब कोड रिलीज़ संभव हो तो आप इस ट्रिगर को उसी कार्यक्षमता के अपने कोडित संस्करण से बदल सकते हैं।

दिन के अंत में, सब कुछ "बुराई" है यदि आप नहीं जानते कि यह क्या कर रहा है। यह निर्णय लेना कि ट्रिगर हैं क्योंकि डेवलपर्स हैं जो उन्हें नहीं समझते हैं यह तर्क देने के समान है कि कारें बुराई हैं क्योंकि कुछ लोग ड्राइव नहीं कर सकते हैं ...


7

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

हालांकि, अच्छे डिजाइन के मूल सिद्धांतों में से एक यह है कि व्यावसायिक नियम / व्यावसायिक तर्क / जिसे आप कॉल करना चाहते हैं, उसे एक ही स्थान पर केंद्रित किया जाना चाहिए। डेटाबेस में कुछ तर्क रखना (ट्रिगर्स या संग्रहीत प्रॉक्सेस के माध्यम से) और कुछ एप्लिकेशन उस सिद्धांत का उल्लंघन करते हैं। दोनों स्थानों में तर्क की नकल करना और भी बुरा है, क्योंकि वे हमेशा एक-दूसरे के साथ सिंक से बाहर निकल जाएंगे।

"कम से कम आश्चर्य की बात" सिद्धांत भी है जिसका उल्लेख पहले ही किया जा चुका है।


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

1
@ एचएलजीईएम: यह इस बात पर निर्भर करता है कि क्या डेटाबेस में संभवत: जानकारी तक पहुंच हो सकती है जो यह बताने की अनुमति देती है कि डेटा वैध है या नहीं। यह हमेशा ऐसा नहीं होता है; जब सत्यापनकर्ता किसी अन्य संगठन में होता है (उदाहरण के लिए, क्रेडिट कार्ड या बैंक खाते के विवरण के लिए) तो DB यह नहीं जान सकता है कि क्या यह सही है - यह मानते हुए कि यह बैंक का DB नहीं है! - और यह प्रवर्तन के लिए आवेदन पर भरोसा करना होगा। आप जो नहीं चाहते हैं, वह है कि डेटाबेस को तृतीय-पक्ष सेवाओं के लिए यादृच्छिक कनेक्शन बनाने के लिए, क्योंकि यह सर्वर परिनियोजन के लिए बुरा है।
डोनल फेलो

@HLGEM: जबकि मैं पूरी तरह से डेटाबेस में सभी एप्लिकेशन लॉजिक को डालने के विकल्प के बारे में बताने के लिए तैयार नहीं हूं, मुझे लगता है कि इसे कहीं और लगाने के लिए बेहतर काम करना पड़ता है, आमतौर पर एक पुन: प्रयोज्य ओओ परत जिसे सभी एप्लिकेशन एक्सेस करने के लिए उपयोग किया जा सकता है डेटाबेस। जब तक आपका ऐप केवल ऑब्जेक्ट लेयर के माध्यम से डेटाबेस तक पहुंचता है, तब तक हमेशा कहा जाने वाला लॉजिक की समान गारंटी अभी भी लागू होगी।
डेव शेरोहमान

2
कभी भी एक व्यावसायिक अनुप्रयोग पर काम नहीं किया जो केवल ऑब्जेक्ट परत के माध्यम से डेटाबेस में डेटा सम्मिलित करता है और मैं एक पर काम करना चाहता हूं। यह केवल एक रिकॉर्ड अता समय को संभालने के लिए डिज़ाइन की गई प्रक्रिया के माध्यम से मिलियन रिकॉर्ड आयात या सभी कीमतों के अपडेट को बेवकूफ बनाने के लिए है। THe ऑब्जेक्ट परत डेटा अखंडता को लागू करने के लिए बिल्कुल गलत जगह है यही वजह है कि इतने सारे डेटाबेस में अखंडता समस्याएं हैं।
एचएलजीईएम

@HLGEM उसी कारण से मैं अपने ORM के विस्तार पर काम कर रहा हूं जो किसी लेन-देन के भीतर हर चीज के बदलाव का उपयोग करके ट्रिगर की तरह काम करता है। यह थोड़ा मूर्खतापूर्ण लगता है, लेकिन एप्लिकेशन में हमारे सभी व्यावसायिक तर्क होने से रोक देगा, कुछ समय को छोड़कर यह नहीं है (केवल कुछ तालिकाओं को कभी बल्क अपडेटिंग की आवश्यकता होती है)। यह सभी डेवलपर्स को लिखने और उन्हें उस भाषा में उपयोग करने की अनुमति देगा, जिसमें वे सबसे अधिक आरामदायक हैं और जहां हमारे द्वारा बनाए गए सभी ऑब्जेक्ट एब्स्ट्रक्शन तक पहुंच है।
Adamantish

6

ट्रिगर ठीक से उपयोग किए जाने पर एक अच्छा उपकरण है। स्पष्ट रूप से ऑडिटिंग परिवर्तन, संक्षेपण सारणी, आदि जैसी चीजों के लिए।

अब वे "दुष्ट" हो सकते हैं यदि आप "ट्रिगर नरक" में एक ट्रिगर के साथ समाप्त होते हैं जो अन्य ट्रिगर को बंद कर देता है। मैंने एक बार एक COTS उत्पाद पर काम किया था, जहाँ उन्हें "फ्लेक्स ट्रिगर्स" कहा जाता था। इन ट्रिगर्स को एक तालिका में संग्रहीत किया गया था क्योंकि गतिशील एसक्यूएल स्टिंग हर बार संकलित किए गए थे। संकलित ट्रिगर एक नज़र उठाते हैं और देखेंगे कि क्या उस तालिका में कोई फ्लेक्स ट्रिगर है और फिर "फ्लेक्स" ट्रिगर को संकलित और चलाने के लिए। सिद्धांत रूप में यह वास्तव में एक शांत विचार की तरह लग रहा था क्योंकि उत्पाद को आसानी से अनुकूलित किया गया था, लेकिन वास्तविकता यह थी कि सभी संकलन के कारण डेटाबेस में बहुत विस्फोट हो गया था ...

तो हाँ, वे महान हैं यदि आप रखते हैं कि आप परिप्रेक्ष्य में क्या कर रहे हैं। अगर यह ऑडिटिंग, सारांश, ऑटो-सीक्वेंसिंग आदि जैसे कुछ सरल है, तो कोई संभावना नहीं है। बस तालिका की वृद्धि दर को ध्यान में रखें और ट्रिगर प्रदर्शन को कैसे प्रभावित करेगा।


6

उच्च स्तर पर ट्रिगर्स 1 के लिए दो उपयोग-मामले हैं

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

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

2) डेटा अखंडता नियमों को लागू करने के लिए, अन्य लोगों के अलावा, जो हम घोषित रूप से (CHECK, प्राथमिक कुंजी, अद्वितीय कुंजी और विदेशी कुंजी का उपयोग करके) सौदा कर सकते हैं। इस उपयोग-मामले में सभी ट्रिगर करते हैं कि क्या INSERT / UPDATE / DELETE द्वारा किए जा रहे परिवर्तन की अनुमति है या नहीं, यह सत्यापित करने के लिए QUERY (SELECT) डेटा है। ठीक उसी तरह जैसे हमारे लिए घोषणापत्र बाधाएं हैं। केवल इस मामले में हमने (डेवलपर्स) प्रवर्तन को प्रोग्राम किया है।

बाद के उपयोग-मामले के लिए ट्रिगर का उपयोग करना हानिकारक नहीं है।

मैं उस पर ब्लॉगिंग कर रहा हूं: http://harmfultriggers.blogspot.com


संदर्भात्मक अखंडता के लिए ट्रिगर्स का उपयोग करते समय यह संगामिति मुद्दों को संभालने की तुलना में कठिन है।
डब्ल्यूडब्ल्यू।

2
माना। लेकिन क्या कुछ अन्य साधनों का उपयोग करना आसान है?
तून कोप्पेलार्स 6

यदि आपके पास अक्षम डेवलपर्स हैं तो मैं केवल एक नंबर का तर्क दूंगा कि यह हानिकारक है।
HLGEM

हालांकि योग्य डेवलपर्स के बहुत सारे हैं।
हैशटेबल

5

मुझे पता है कि ट्रिगर्स जो सोचते हैं कि हमेशा उपयोग किया जाना चाहिए जहां यह उन कार्यक्षमता को प्राप्त करने का सबसे सीधा तरीका है, और डेवलपर्स जो कभी नहीं करेंगे। यह लगभग दो शिविरों के बीच हठधर्मिता की तरह है।

हालाँकि मैं व्यक्तिगत रूप से MarkR से पूरी तरह सहमत हूँ - आप (लगभग) हमेशा ट्रिगर के बराबर कार्यात्मक रूप से कोड लिख सकते हैं जो अधिक सुस्पष्ट और इसलिए बनाए रखना आसान होगा।


एक डेटाबेस हिट करने के लिए सभी काम को छोड़कर आवेदन कोड के माध्यम से बहती नहीं है।
HLGEM

5

बुराई नहीं। वे वास्तव में चीजों को सरल बनाते हैं

1. रिकॉर्ड्स या यहां तक ​​कि डेटाबेस स्कीमा में परिवर्तन / ऑडिटिंग

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


2. कई डेटाबेस में संदर्भात्मक अंतरंगता (प्राथमिक / विदेशी कुंजी संबंधों आदि) को लागू करना


आप DDL स्टेटमेंट वापस ले सकते हैं?
एंड्रयू स्वान

आम तौर पर नहीं। इसे रोकने का एकमात्र तरीका उपयोगकर्ताओं के लॉगिन से उस अनुमति को हटाना है।
jmucchiello

कुछ डेटाबेस इंजन में आप कर सकते हैं (जैसे। PostgreSQL)।
निकोलस

@Andrew - SQL Server में आप कर सकते हैं। SQL Server 2005+ में DDL ट्रिगर्स भी है, जैसे कि घटनाओं पर आग ALTER TABLE
मार्टिन स्मिथ

4

नहीं, वे बुराई नहीं कर रहे हैं - वे सिर्फ गलत समझा रहे हैं: - डी

ट्रिगर का एक वैध उपयोग है, लेकिन अब तक अक्सर एक रेट्रो-हैक के रूप में जो अंततः चीजों को बदतर बनाता है।

यदि आप किसी एप्लिकेशन के भाग के रूप में DB का विकास कर रहे हैं, तो तर्क हमेशा कोड या कॉल करने वाले स्पोक्स में होना चाहिए। ट्रिगर केवल बाद में डिबग-दर्द का कारण बनेंगे।

यदि आप समझते हैं कि लॉकिंग, डेडलॉकिंग और डीबी डिस्क पर फ़ाइलों तक कैसे पहुंचते हैं तो ट्रिगर्स का सही तरीके से उपयोग करना (उदाहरण के लिए ऑडिटिंग या डायरेक्ट डीबी एक्सेस को संग्रहीत करना) वास्तव में मूल्यवान हो सकता है।


4

यह कहना कि वे दुष्ट हैं एक अतिशयोक्ति है, लेकिन वे मेष का कारण बन सकते हैं। जब एक ट्रिगर की फायरिंग से दूसरे ट्रिगर्स फायर होते हैं तो यह वास्तव में जटिल हो जाता है। मान लीजिए कि वे परेशान हैं: http://www.oracle.com/technology/oramag/oracle/08-sep/o58askt.net.html

ट्रिगर के साथ ओरेकल में व्यापार तर्क करना कठिन है क्योंकि यह बहु-संगणक मुद्दों के कारण लगता है। जब तक दूसरे सत्र शुरू नहीं होते तब तक आप दूसरे सत्र में बदलाव नहीं देखते।


4

वे निश्चित रूप से दुष्ट नहीं हैं। मैंने एक डेटाबेस का नाम बदलने के दौरान या दो स्तंभों में एक स्तंभ को विभाजित करते हुए या इसके विपरीत (उदाहरण: नाम / उपनाम मामले) में एक कॉलम को विभाजित करते हुए और संक्रमण की सहायता करते हुए मुझे कीमती कीमती चीजें मिलीं।

वे ऑडिटिंग के लिए भी बहुत उपयोगी हैं।


4

यह उत्तर विशेष रूप से SQL सर्वर पर लागू होता है। (हालांकि यह अन्य आरडीबीएमएस पर भी लागू हो सकता है, जिसका मुझे कोई अंदाजा नहीं है। मैं इसे यहां एक उत्तर के रूप में देना पसंद करूंगा, लेकिन इसे इस बात के लिए बंद कर दिया गया।)

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

" प्रबंध ट्रिगर सुरक्षा " शीर्षक के तहत BOL में दिया गया उदाहरण एक उपयोगकर्ता का है जो GRANT CONTROL SERVER TO JohnDoe ;अपनी स्वयं की अनुमतियों को बढ़ाने के लिए कोड युक्त ट्रिगर बनाता है ।


3

यदि साइड इफेक्ट होते हैं, तो यह डिजाइन द्वारा एक समस्या है। कुछ डेटाबेस सिस्टम में, एक प्राथमिक कुंजी आईडी फ़ील्ड के लिए एक स्वत: अंकन फ़ील्ड सेट करने की कोई अन्य संभावना नहीं है।


3

मुझे लगता है कि वे बुराई हो सकते हैं, लेकिन केवल विकास में कुछ भी बुराई के रूप में।

हालाँकि मुझे वास्तव में उनके साथ इतना अनुभव नहीं है कि मैंने उन्हें एक हालिया प्रोजेक्ट पर काम किया है, जिस पर मैंने काम किया है। उनके पास जो समस्या है, वह यह है कि वे दो स्थानों, एक कोड लाइब्रेरी और डेटाबेस में व्यावसायिक तर्क को समाप्त कर सकते हैं ।

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

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


1

वास्तव में, अक्सर ट्रिगर्स का दुरुपयोग किया जा रहा है। वास्तव में ज्यादातर मामलों में आपको उनकी आवश्यकता भी नहीं होती है। लेकिन यह उन्हें जरूरी बुरा नहीं बनाता है।

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


1

ट्रिगर्स का आइडिया बुराई नहीं है, ट्रिगर्स के नेस्टिंग को सीमित करना बुराई है।

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