2010-04-29 11 views
6

मेरे पास कुछ टेबल हैं जहां विदेशी कुंजी बाधाओं को जोड़ा जाता है। जेनरेट की गई प्रक्रियाओं में विशिष्ट जुड़ने के लिए इन्हें कोड जनरेशन के साथ उपयोग किया जाता है।एसक्यूएल सर्वर: विदेशी कुंजी बाधाओं के साथ पंक्तियों को हटाने: लेनदेन बाधाओं को ओवरराइड कर सकते हैं?

क्या लेन-देन के भीतर कई डिलीटों को कॉल करके इन बाधाओं को ओवरराइड करना संभव है, विशेष रूप से "ट्रांसएक्शनस्कोप" सी # में या पूरी तरह से आवश्यक कैस्केड कैस्केड किया गया है?

उत्तर

13

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

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

+0

ओपी कहता है: '... विदेशी कुंजी बाधाओं को जोड़ा जाता है। इन्हें जेनरेट की गई प्रक्रियाओं में विशिष्ट जुड़ने के लिए कोड जनरेशन के साथ उपयोग किया जाता है। –

+0

@HLGEM : मैं इस बात से सहमत हूं कि इस स्थिति में (किसी अन्य उत्तर पर मेरी टिप्पणियों में से एक में वर्णित) सबसे कम बच्चे के क्रम में सावधानीपूर्वक हटाना संभवतः सबसे अच्छा विकल्प है। –

+5

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

2

आप एफके बाधाओं को ओवरराइड नहीं कर सकते हैं, अगर आप उन्हें पहले स्थान पर बनाने का मुद्दा क्या कर सकते हैं?

+1

सच है, मेरा मतलब है, मुझे लगता है: यह है कि लेनदेन के अंत तक विदेशी कुंजी बाधा/संदर्भ पंक्तियों पर मान्य/चेक नहीं किए जाएंगे, इसलिए कैस्केडिंग डिलीटों की आवश्यकता नहीं होगी। –

+2

मुझे विश्वास नहीं है; एक लेनदेन के अंदर भी संबंधपरक अखंडता लागू की जाती है। आप एफके को ओएमजी पॉइंट्स के रूप में अक्षम कर सकते हैं। –

+1

एक दयालुता है जो एक लेनदेन के अंत में अखंडता की जांच नहीं करता है (या ऐसा करने के लिए सक्षम/कॉन्फ़िगर किया गया है), इससे मदद मिलेगी। –

7

एक ही रास्ता "ओवरराइड" एक foreign key constraint उसे निष्क्रिय करने के लिए है:

एक विदेशी कुंजी बाधा को अक्षम करने के लिए सक्षम बनाता तालिका में डेटा की कमी से सत्यापित किया जा रहा बिना संशोधित करने की। INSERT और UPDATE स्टेटमेंट के दौरान एक विदेशी कुंजी बाधा को अक्षम करें यदि नया डेटा बाधा का उल्लंघन करेगा या यदि बाधा केवल डेटाबेस में पहले से ही डेटा पर लागू होनी चाहिए।

आप एक बाधा को निष्क्रिय करने के ALTER TABLE आदेश का उपयोग करने के लिए NOCHECK कीवर्ड का उपयोग की जरूरत है। आईई:

ALTER TABLE dbo.cnst_example NOCHECK CONSTRAINT salary_cap; 

एकमात्र अन्य विकल्प बाधा को छोड़ना और आवश्यक होने पर फिर से जोड़ना है।

ऐसा करने की आवश्यकता से तालिकाओं को मॉडल करने के बारे में चर्चा होनी चाहिए, इसलिए यह आवश्यक नहीं है।

+1

+1, ठीक वही मैं क्या सोच रहा था, अगर एफके केवल कुछ कोड प्रक्रियाओं के लिए कोड जेन यूटिलिटी के लिए मौजूद है, तो उन्हें छोड़ना वास्तव में एक समस्या नहीं होगी। –

+0

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

+0

@ मार्क रेडमैन: यदि कोई बाधा नहीं है तो डेटा अखंडता अत्यधिक संदिग्ध है। –

1

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

+0

उनका उपयोग कोड पीढ़ी (चयन आदि) में कुछ जुड़ने के लिए किया जाता है, लेकिन अगर एफके को छोड़ दिया जाता है तो डिज़ाइन के रूप में काम करें। –

1

बाधाओं को तत्काल या किसी लेनदेन के अंत में देरी हो सकती है। लेनदेन के अंत में देरी से आप लेनदेन के निर्माण के दौरान बाधाओं का उल्लंघन कर सकते हैं, लेकिन लेनदेन के अंत में उन्हें लागू कर सकते हैं। जो मैं समझता हूं, लेनदेन के अंत में देरी वह है जो आप शायद बाद में कर रहे हैं।

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