यदि आप स्वयं को ऐसी स्थिति में पाते हैं जहां आपको SQL सर्वर में एक विदेशी कुंजी बाधा को अक्षम करने की आवश्यकता है, तो यहां ट्रांजैक्ट-एसक्यूएल का उपयोग करके ऐसा कैसे करें।
यह आपको विदेशी कुंजी द्वारा प्रतिबंधित किए बिना डेटा दर्ज करने की अनुमति देगा। जाहिर है, आप ऐसा तब तक नहीं करेंगे जब तक आपके पास ऐसा करने का बहुत अच्छा कारण न हो। विदेशी कुंजियाँ रेफ़रेंशियल अखंडता को लागू करती हैं, इसलिए उन्हें अक्षम करने से सभी प्रकार के मुद्दे पैदा करने की क्षमता होती है।
उदाहरण 1 - विदेशी कुंजी प्रतिबंध अक्षम करें
किसी विदेशी कुंजी बाधा को अक्षम करने के लिए, NOCHECK
. का उपयोग करें ALTER TABLE
. के भीतर तर्क बयान।
इस तरह:
ALTER TABLE BandMember NOCHECK CONSTRAINT FK_BandMember_Musician;
यह कोड FK_BandMember_Musician नामक एक विदेशी कुंजी बाधा को अक्षम करता है .
उदाहरण 2 - प्रतिबंध की समीक्षा करें
हम sys.foreign_keys
. को क्वेरी कर सकते हैं सिस्टम दृश्य यह सत्यापित करने के लिए कि हमारी बाधा अक्षम कर दी गई है:
SELECT name AS 'Constraint', is_disabled, is_not_trusted FROM sys.foreign_keys;
परिणाम:
+--------------------------------+---------------+------------------+ | Constraint | is_disabled | is_not_trusted | |--------------------------------+---------------+------------------| | FK_BandMember_Band | 0 | 0 | | FK_BandMember_Musician | 1 | 1 | | FK_MembershipPeriod_BandMember | 0 | 0 | +--------------------------------+---------------+------------------+
इस मामले में मैंने वर्तमान डेटाबेस से सभी विदेशी कुंजी बाधाओं का चयन किया है।
हम देख सकते हैं कि केवल यही अक्षम है (क्योंकि इसका is_disabled कॉलम 1 . पर सेट है )।
आप देख सकते हैं कि is_not_trusted कॉलम 1 . पर भी सेट है . यह इंगित करता है कि बाधा को सिस्टम द्वारा सत्यापित नहीं किया गया है।
यह समझ में आता है, क्योंकि अब हम यह नहीं मान सकते हैं कि बाधा ने सभी डेटा की जाँच कर ली है। तथ्य यह है कि बाधा अक्षम है इसका मतलब है कि डेटा अब बाधा द्वारा जांचे बिना डेटाबेस में प्रवेश करने में सक्षम है। इसलिए, डेटाबेस में अमान्य डेटा मौजूद होने की संभावना मौजूद है।
यदि आपको कभी भी बाधा को फिर से सक्षम करने की आवश्यकता होती है, तो आपके पास बाधा के विश्वास को पुनर्स्थापित करने का अवसर होगा (WITH CHECK
का उपयोग करके) विकल्प)। यह बाधा को सक्षम करने से पहले सभी मौजूदा पंक्तियों की जाँच करेगा।
आपके पास नहीं . का विकल्प भी होगा मौजूदा डेटा की जाँच कर रहा है, लेकिन यह केवल दुर्लभ मामलों में ही किया जाना चाहिए।
यहाँ फिर से वही प्रश्न है, लेकिन तालिकाओं और संदर्भित तालिकाओं को दिखाने के लिए कुछ अतिरिक्त स्तंभों के साथ:
SELECT name AS 'Constraint', OBJECT_NAME(parent_object_id) AS 'Table', OBJECT_NAME(referenced_object_id) AS 'Referenced Table', is_disabled, is_not_trusted FROM sys.foreign_keys;
परिणाम:
+--------------------------------+------------------+---------------------+---------------+------------------+ | Constraint | Table | Referenced Table | is_disabled | is_not_trusted | |--------------------------------+------------------+---------------------+---------------+------------------| | FK_BandMember_Band | BandMember | Band | 0 | 0 | | FK_BandMember_Musician | BandMember | Musician | 1 | 1 | | FK_MembershipPeriod_BandMember | MembershipPeriod | BandMember | 0 | 0 | +--------------------------------+------------------+---------------------+---------------+------------------+