कैस्केड हटाएं MSSQL सर्वर में केवल एक ही टेबल पर कैस्केड किया जा सकता है। यदि आपके पास आयाम तालिका में विदेशी कुंजी संबंधों वाली दो तालिकाएं हैं, तो आप उनमें से केवल एक को कैस्केड हटा सकते हैं। (यह एकाधिक पथों के माध्यम से हटाए गए कैस्केडिंग को रोकने और संघर्ष पैदा करने के लिए है, जितना सी ++ एकाधिक विरासत की अनुमति देता है लेकिन सी # केवल एकल विरासत की अनुमति देता है)
जब ऐसा होता है, तो आपको ट्रिगर का उपयोग करने या विशेष रूप से अपने कोड में मामले को संभालने के लिए मजबूर किया जाता है।
इस कारण से मैंने देखा है कि बहुत से लोग सभी मामलों में ट्रिगर का उपयोग करने का विकल्प चुनते हैं। यहां तक कि जब केवल एक विदेशी तालिका होती है। यह एकरूपता सुनिश्चित करता है और इसलिए लोग जानते हैं कि डेटाबेस को बनाए रखते समय क्या देखना है।
यदि कोई डिलीट को एक से अधिक टेबल पर कैस्केड कर सकता है तो मैं कहूंगा कि यह सबसे बेहतर विकल्प होगा। हालाँकि, यह सीमा पानी को खराब कर देती है और मैं वर्तमान में ऐसे सभी व्यवहारों के लिए ट्रिगर के पक्ष में हूं। कैस्केड डिलीट और अपडेट के लिए ट्रिगर्स का उपयोग करने में ओवरहेड कोडिंग के मामले में केवल मामूली है, लेकिन मानक प्रथाओं की अनुमति देता है जो वास्तव में सामान्य हैं।
संपादित करें:
हो सकता है कि आप 'स्वीकृत उत्तर' को किसी और के पास ले जाना चाहें, मैंने यह पता लगा लिया है कि मैं उपरोक्त में गलत था।
आपके पास एक से अधिक तथ्य तालिकाएं हो सकती हैं, एक संकेत आयाम तालिका में ON DELETE CASCADE विदेशी कुंजी बाधाएं हो सकती हैं।
आप यह नहीं कर सकते कि एक फैक्ट टेबल में कई डायमेंशन टेबल्स के लिए ON DELETE CASCADE विदेशी कुंजी बाधाएं हैं।
तो उदाहरण के लिए...
- आयाम तालिका [व्यक्ति] (आईडी INT पहचान, )
- आयाम तालिका [परीक्षा] (आईडी INT पहचान, )
- चेहरा तालिका [परीक्षा_स्कोर] (person_id INT, exam_id INT, स्कोर INT)
यदि या तो व्यक्ति या परीक्षा को हटा दिया जाता है, तो आप चाहते हैं कि संबंधित Exam_Score रिकॉर्ड भी हटा दिए जाएं।
MS SQL सर्वर में ON DELETE CASCADE का उपयोग करना संभव नहीं है, इस प्रकार ट्रिगर्स की आवश्यकता है।
(मेहरदाद से क्षमा याचना जिन्होंने मुझे यह समझाने की कोशिश की लेकिन मैं उनकी बात से पूरी तरह चूक गया।)