जब आप एक CHECK
. बनाते हैं SQL सर्वर में बाधा है, तो आप इस बारे में सोच भी नहीं सकते हैं कि यह तालिका-स्तर की बाधा है या स्तंभ-स्तर की बाधा है।
एक टेबल-लेवल CHECK
बाधा तालिका पर लागू होती है, जबकि स्तंभ-स्तर की बाधा किसी विशिष्ट स्तंभ पर लागू होती है। तालिका-स्तर के साथ CHECK
बाधा, यह वह पंक्ति है जिसे डेटा की जाँच करते समय जाँचा जाता है। कॉलम-स्तर के साथ CHECK
बाधा, यह विशिष्ट कॉलम है जिसे चेक किया गया है।
आम तौर पर आपको पता चल जाएगा कि आप जो बाधा बना रहे हैं, वह आपके द्वारा दी गई परिभाषा के अनुसार तालिका-स्तर या स्तंभ-स्तर की बाधा है या नहीं। यदि व्यंजक में केवल एक स्तंभ की जाँच की जा रही है, तो यह एक स्तंभ-स्तर की बाधा होगी। अन्यथा यह एक टेबल-स्तरीय बाधा होगी।
लेकिन आपको कैसे पता चलेगा कि आपकी मौजूदा बाधाएं स्तंभ-स्तर या तालिका-स्तर की हैं?
आप यह निर्धारित करने के लिए नीचे दिए गए कोड उदाहरणों में से कोई भी चला सकते हैं कि आपकी मौजूदा बाधाएं कॉलम-स्तर या तालिका-स्तर हैं या नहीं। ये सभी CHECK
. को पुनः प्राप्त करते हैं वर्तमान डेटाबेस के लिए बाधाएं, लेकिन आप हमेशा WHERE
. का उपयोग कर सकते हैं इसे एक विशिष्ट बाधा तक सीमित करने के लिए खंड।
उदाहरण 1 - मूल प्रश्न
यहां एक आसान सी क्वेरी है जो सभी CHECK
. के बारे में बुनियादी जानकारी लौटाती है वर्तमान डेटाबेस में बाधाएं।
यहां, मैं sys.check_constraints
. को क्वेरी करता हूं सिस्टम व्यू (जो प्रत्येक ऑब्जेक्ट के लिए एक पंक्ति देता है जो एक CHECK
. है बाधा, sys.objects.type = 'C'
. के साथ ) मैं केवल चार कॉलम लौटाता हूं (लेकिन जितने चाहें उतने कॉलम वापस करने के लिए स्वतंत्र महसूस करें)।
SELECT Name, OBJECT_NAME(parent_object_id) AS 'Table', parent_column_id, Definition FROM sys.check_constraints;
परिणाम:
+-----------------+----------------+--------------------+----------------------------------------+ | Name | Table | parent_column_id | Definition | |-----------------+----------------+--------------------+----------------------------------------| | chkPrice | ConstraintTest | 2 | ([Price]>(0)) | | chkValidEndDate | ConstraintTest | 0 | ([EndDate]>=[StartDate]) | | chkTeamSize | ConstraintTest | 3 | ([TeamSize]>=(5) AND [TeamSize]<=(20)) | | chkJobTitle | Occupation | 3 | ([JobTitle]<>'Digital Nomad') | +-----------------+----------------+--------------------+----------------------------------------+
यह निर्धारित करने का सबसे तेज़ तरीका है कि कौन सी बाधाएँ तालिका-स्तर की बाधाएँ हैं, शून्य की तलाश करना है (
0
)
parent_column_id
. में कॉलम। शून्य वाली कोई भी चीज़ एक टेबल-लेवल है CHECK
बाधा एक गैर-शून्य मान इंगित करता है कि यह एक स्तंभ-स्तर है CHECK
निर्दिष्ट आईडी मान वाले कॉलम पर परिभाषित बाधा।
तो इस उदाहरण में तीन स्तंभ-स्तर की बाधाएँ और एक तालिका-स्तरीय बाधा है।
ध्यान दें कि समान parent_column_id . के साथ दो बाधाएं हैं (3) हालाँकि, ये दो बाधाएँ अलग-अलग तालिकाओं से हैं। 3 उनकी संबंधित तालिकाओं के तीसरे स्तंभ को संदर्भित करता है।
जैसा कि उल्लेख किया गया है, यदि आप केवल एक विशिष्ट बाधा के बारे में जानकारी चाहते हैं, तो WHERE
. का उपयोग करें खंड:
SELECT Name, OBJECT_NAME(parent_object_id) AS 'Table', parent_column_id, Definition FROM sys.check_constraints WHERE name = 'chkPrice';
परिणाम:
+----------+----------------+--------------------+---------------+ | Name | Table | parent_column_id | Definition | |----------+----------------+--------------------+---------------| | chkPrice | ConstraintTest | 2 | ([Price]>(0)) | +----------+----------------+--------------------+---------------+
उदाहरण 2 - क्वेरी में सुधार करें
हम केवल आईडी के बजाय पैरेंट कॉलम नाम लौटाकर पिछले उदाहरण में सुधार कर सकते हैं। बेशक, यह केवल स्तंभ-स्तर की बाधाओं के लिए स्तंभ नाम लौटाएगा। तालिका-स्तर की बाधाओं के लिए NULL लौटाया जाएगा।
SELECT cc.name AS 'Constraint', o.name AS 'Table', ac.name AS 'Column', cc.Definition AS 'Constraint Definition' FROM sys.check_constraints cc LEFT OUTER JOIN sys.objects o ON cc.parent_object_id = o.object_id LEFT OUTER JOIN sys.all_columns ac ON cc.parent_column_id = ac.column_id AND cc.parent_object_id = ac.object_id;
परिणाम:
+-----------------+----------------+----------+----------------------------------------+ | Constraint | Table | Column | Constraint Definition | |-----------------+----------------+----------+----------------------------------------| | chkPrice | ConstraintTest | Price | ([Price]>(0)) | | chkValidEndDate | ConstraintTest | NULL | ([EndDate]>=[StartDate]) | | chkTeamSize | ConstraintTest | TeamSize | ([TeamSize]>=(5) AND [TeamSize]<=(20)) | | chkJobTitle | Occupation | JobTitle | ([JobTitle]<>'Digital Nomad') | +-----------------+----------------+----------+----------------------------------------+
उदाहरण 3 - और सुधार
आइए क्वेरी में कुछ और बदलाव करें:
SELECT cc.name AS 'Constraint', cc.is_disabled AS 'Disabled?', CASE WHEN cc.parent_column_id = 0 THEN 'Table-level' ELSE 'Column-level' END AS 'Table/Column', o.name AS 'Table', ISNULL(ac.name, '(n/a)') AS 'Column', cc.Definition AS 'Constraint Definition' FROM sys.check_constraints cc LEFT OUTER JOIN sys.objects o ON cc.parent_object_id = o.object_id LEFT OUTER JOIN sys.all_columns ac ON cc.parent_column_id = ac.column_id AND cc.parent_object_id = ac.object_id;
परिणाम:
+-----------------+-------------+----------------+----------------+----------+----------------------------------------+ | Constraint | Disabled? | Table/Column | Table | Column | Constraint Definition | |-----------------+-------------+----------------+----------------+----------+----------------------------------------| | chkPrice | 0 | Column-level | ConstraintTest | Price | ([Price]>(0)) | | chkValidEndDate | 0 | Table-level | ConstraintTest | (n/a) | ([EndDate]>=[StartDate]) | | chkTeamSize | 0 | Column-level | ConstraintTest | TeamSize | ([TeamSize]>=(5) AND [TeamSize]<=(20)) | | chkJobTitle | 0 | Column-level | Occupation | JobTitle | ([JobTitle]<>'Digital Nomad') | +-----------------+-------------+----------------+----------------+----------+----------------------------------------+
इसलिए अब मेरे पास टेक्स्ट "कॉलम-लेवल" या "टेबल-लेवल" लौटाया जा रहा है, जो इस पर निर्भर करता है कि यह कौन सा है।
मैं ISNULL()
. का भी उपयोग करता हूं किसी भी NULL मान को "(n/a)" में बदलने के लिए कार्य करता है।
और मैंने is_disabled . भी जोड़ा है सूची में कॉलम, बस अगर किसी भी बाधा को अक्षम कर दिया गया है। आप इस कॉलम को हमेशा parent_column_id . के समान व्यवहार दे सकते हैं कॉलम और "हां" या "नहीं" या "सक्षम" या "अक्षम" या इसी तरह का प्रस्तुत करें।