Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर में डेटाबेस में सभी CHECK और विदेशी कुंजी बाधाओं को कैसे सक्षम करें (T-SQL उदाहरण)

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

जब आप CHECK . को सक्षम करते हैं या विदेशी कुंजी बाधा, आपके पास बाधा सक्षम होने से पहले तालिका में मौजूदा डेटा की जांच करने का विकल्प है। ऐसा करने से आप यह सत्यापित कर सकते हैं कि कोई मौजूदा बाधा का उल्लंघन करता है या नहीं। इस जांच को करने के लिए, WITH CHECK का उपयोग करें कोड के भीतर, अन्यथा WITH NOCHECK का उपयोग करें ।

नमूना कोड

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

चेक के साथ (अनुशंसित):

EXEC sp_MSforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL"

बिना जांच के:

EXEC sp_MSforeachtable "ALTER TABLE ? WITH NOCHECK CHECK CONSTRAINT ALL"

आप तर्क का नाम भी स्पष्ट रूप से प्रदान कर सकते हैं (@command1 ) यदि आप चाहें तो (आपको किसी भी तरह से वही परिणाम मिलेगा)।

चेक के साथ:

EXEC sp_MSforeachtable @command1="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL"

बिना जांच के:

EXEC sp_MSforeachtable @command1="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL"

ये उदाहरण (अनियंत्रित) sp_MSforeachtable . का उपयोग करते हैं संग्रहीत प्रक्रिया। यह प्रक्रिया आपको डेटाबेस में प्रत्येक तालिका के विरुद्ध कार्य करने की अनुमति देती है। तो यह यहां हमारे कार्य के लिए एकदम सही है - सभी CHECK . को सक्षम करने के लिए और वर्तमान डेटाबेस के भीतर विदेशी कुंजी बाधाएं।

नीचे एक उदाहरण दिया गया है जहां मैं यह करता हूं और फिर परिणाम की जांच करता हूं।

उदाहरण 1 - बाधाओं की समीक्षा करें

सबसे पहले, मैं वर्तमान CHECK . पर एक नज़र डालूँगा और डेटाबेस में विदेशी कुंजी बाधाएं, यह देखने के लिए कि वे सक्षम या अक्षम हैं या नहीं।

SELECT
  OBJECT_NAME(parent_object_id) AS 'Table',
  name AS 'Constraint',
  is_disabled, 
  is_not_trusted
FROM sys.foreign_keys
UNION
SELECT 
  OBJECT_NAME(parent_object_id),
  name,
  is_disabled, 
  is_not_trusted
FROM sys.check_constraints;

परिणाम:

+----------------+-----------------+---------------+------------------+
| Table          | Constraint      | is_disabled   | is_not_trusted   |
|----------------+-----------------+---------------+------------------|
| ConstraintTest | chkPrice        | 1             | 1                |
| ConstraintTest | chkValidEndDate | 1             | 1                |
| ConstraintTest | chkTeamSize     | 1             | 1                |
| Occupation     | chkJobTitle     | 1             | 1                |
+----------------+-----------------+---------------+------------------+

तो वर्तमान में चार हैं CHECK डेटाबेस में दो अलग-अलग तालिकाओं के लिए बाधाएं।

हम देख सकते हैं कि सभी बाधाएं अक्षम हैं, क्योंकि is_disabled 1 . पर सेट है ।

साथ ही, वे सभी अविश्वसनीय हैं, क्योंकि is_not_trusted 1 . पर भी सेट है ।

उदाहरण 2 - चेक के साथ उपयोग कर बाधाओं को सक्षम करें

अब मैं WITH CHECK . का उपयोग करके सभी बाधाओं को सक्षम कर दूंगा तर्क:

EXEC sp_MSforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL"

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

USE Test;
EXEC sp_MSforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL"

इस मामले में मैं Test . नामक डेटाबेस पर स्विच करता हूं संग्रहित प्रक्रिया को क्रियान्वित करने से पहले।

उदाहरण 3 - परिणाम जांचें

उपरोक्त कोड चलाने के बाद, अब मैं परिणाम देखने के लिए पहले उदाहरण से वही क्वेरी चलाऊंगा।

SELECT
  OBJECT_NAME(parent_object_id) AS 'Table',
  name AS 'Constraint',
  is_disabled, 
  is_not_trusted
FROM sys.foreign_keys
UNION
SELECT 
  OBJECT_NAME(parent_object_id),
  name,
  is_disabled, 
  is_not_trusted
FROM sys.check_constraints;

परिणाम:

+----------------+-----------------+---------------+------------------+
| Table          | Constraint      | is_disabled   | is_not_trusted   |
|----------------+-----------------+---------------+------------------|
| ConstraintTest | chkPrice        | 0             | 0                |
| ConstraintTest | chkValidEndDate | 0             | 0                |
| ConstraintTest | chkTeamSize     | 0             | 0                |
| Occupation     | chkJobTitle     | 0             | 0                |
+----------------+-----------------+---------------+------------------+

इसलिए डेटाबेस में सभी बाधाओं को अब सक्षम कर दिया गया है (क्योंकि is_disabled कॉलम 0 . पर सेट है सभी बाधाओं के लिए)।

हम यह भी देख सकते हैं कि is_not_trusted कॉलम 0 . पर भी सेट है . इसका मतलब है कि बाधा पर भरोसा किया जाता है। यह विश्वसनीय है, क्योंकि हमने इसे सक्षम होने से पहले सभी मौजूदा डेटा की जांच करने के लिए प्राप्त किया है।

अगर मैं WITH NOCHECK का उपयोग करता , बाधाएं अविश्वसनीय बनी रहेंगी (अर्थात उनकी is_not_trusted ध्वज को 1 . पर सेट किया जाएगा ) ऐसा इसलिए है क्योंकि डेटाबेस में संभावित रूप से डेटा हो सकता है जो बाधाओं में से एक (या अधिक) का उल्लंघन करता है (बाधाओं के अक्षम होने पर अमान्य डेटा डेटाबेस में प्रवेश कर सकता था)।

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

किसी बाधा को अक्षम और पुन:सक्षम करते समय विश्वसनीय और अविश्वसनीय के बीच स्विच करने के विस्तृत उदाहरण के लिए SQL सर्वर में CHECK बाधा को सक्षम करते समय आपको NOCHECK के बारे में क्या पता होना चाहिए देखें।

प्रतिबंधों को व्यक्तिगत रूप से सक्षम करें

यदि आप केवल एक-एक करके बाधाओं को सक्षम करना चाहते हैं, तो देखें कि SQL सर्वर में एक CHECK बाधा कैसे सक्षम करें और SQL सर्वर में एक विदेशी कुंजी कैसे सक्षम करें।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. क्या मुझे वास्तव में SET XACT_ABORT ON का उपयोग करने की आवश्यकता है?

  2. Microsoft SQL सर्वर में केवल दिनांक का उपयोग करके DATETIME फ़ील्ड को कैसे क्वेरी करें?

  3. एसक्यूएल-सर्वर के लिए एक चर में गतिशील एसक्यूएल का परिणाम प्राप्त करना

  4. अल्पविराम सीमांकित सूची SQL सर्वर बनाने के लिए यह क्वेरी क्या करती है?

  5. एसक्यूएल सर्वर - सम्मिलित पंक्ति की पहचान पाने का सबसे अच्छा तरीका?