इस लेख में, हम CHECK बाधाओं के बारे में बात करेंगे। हम देखेंगे कि SQL सर्वर तालिका कॉलम में CHECK बाधाओं को कैसे जोड़ा जाए और इस प्रकार के SQL सर्वर बाधाओं का उपयोग करते समय आपके सामने आने वाली समस्याओं पर चर्चा करें।
बाधा मूल बातें जांचें
CHECK बाधाएँ केवल सशर्त कथन हैं (भविष्यवाणी करता है कि TRUE या FALSE लौटाता है) जो डेटा अखंडता को बनाए रखने के लिए तालिका कॉलम को संदर्भित करता है। जब कोई एक कॉलम या एक ही पंक्ति में कई कॉलम में डेटा सम्मिलित करता है, तो CHECK बाधाएँ क्रिया में आ जाती हैं। वे सम्मिलित किए जाने वाले डेटा का मूल्यांकन करते हैं। यदि डेटा CHECK बाधा में निर्दिष्ट शर्तों को पूरा नहीं करता है, तो प्रविष्टि विफल हो जाती है।
निम्न उदाहरण पर विचार करें:
सैलरी कॉलम पर एक प्रतिबंध सेट करना आवश्यक है ताकि यह केवल सकारात्मक मानों को संग्रहीत करे जो $150,000 से अधिक न हो। सशर्त विवरण इस प्रकार दिखेगा:(वेतन>=0 और वेतन <=150000)। नकारात्मक मान डालने का प्रयास करते समय, विधेय का परिणाम FALSE होगा, और सम्मिलन विफल हो जाएगा।
एक या एक से अधिक कॉलम में CHECK बाधा जोड़ना संभव है। एक बहु-स्तंभ CHECK बाधा जोड़ना तालिका स्तर पर लागू किया जा सकता है।
CHECK बाधाओं के साथ काम करना
SSMS में CHECK बाधाओं को कैसे बनाएं
ऑब्जेक्ट एक्सप्लोरर में , आवश्यक तालिका पर नेविगेट करें।
बाधाओं पर राइट-क्लिक करें फ़ोल्डर और फिर c चाटना नई बाधा…
बाधाओं की जाँच करें के दाएँ फलक में संवाद बॉक्स में, अभिव्यक्तिक्लिक करें और फिर इलिप्सिस बटन पर क्लिक करें।
जांच बाधा अभिव्यक्ति के टेक्स्ट फील्ड में CHECK बाधा एक्सप्रेशन टाइप करें संवाद बकस। उदाहरण के लिए, ज़िप कॉलम में केवल सात-अंकीय ज़िप कोड की अनुमति देने के लिए, अभिव्यक्ति इस प्रकार दिख सकती है:
टेबल डिज़ाइनर . में अनुभाग, आप बाधा को लागू करने के लिए नियम स्थापित कर सकते हैं।
टेबल बनाने पर प्रतिबंध की जांच करें
निम्न उदाहरण पर विचार करें:
एक तालिका बनाने की आवश्यकता है जो बैंक ग्राहकों के बारे में डेटा संग्रहीत करती है और इसे परीक्षण डेटा से भरती है। तालिका में निम्नलिखित कॉलम शामिल होंगे:ग्राहक आईडी, प्रथम नाम, उपनाम, स्थिति, फोन, शहर, राज्य और ज़िप।
तालिका विकसित करते समय, हमें निम्नलिखित तथ्यों को ध्यान में रखना चाहिए:
मूल ज़िप प्रारूप में पांच संख्यात्मक अंक होते हैं।
मानक अमेरिकी टेलीफोन नंबर दस अंकों का होता है, जैसे (555) 555-1234
दो अक्षरों वाले संक्षिप्ताक्षरों का उपयोग संयुक्त राज्य के राजनीतिक प्रभागों को डाक पते, डेटा संसाधन, सामान्य संक्षिप्ताक्षरों और अन्य उद्देश्यों के लिए प्रतिनिधित्व करने के लिए किया जाता है।
कार्य तालिका के लिए डेटा स्थिरता प्रदान करना है। 12-अंकीय फ़ोन नंबर और 6-अंकीय ज़िप आदि डालने से मना करना आवश्यक है। ऐसा करने के लिए, SQL सर्वर हमें प्रत्येक तालिका कॉलम के लिए एक या अधिक CHECK बाधाओं को जोड़ने की अनुमति देता है।
पिछले अनुभाग में, हमने SSMS में CHECK बाधा उत्पन्न करने के एक तरीके की जांच की है। अब, हम चर्चा करेंगे कि टी-एसक्यूएल की मदद से बाधा कैसे बनाई जाए।
निम्न स्क्रिप्ट से पता चलता है कि ज़िप कॉलम पर CHECK बाधा कैसे बनाई जाती है:
CREATE TABLE Customers ( Customer_Id tinyint NOT NULL, [First Name] varchar(50), [Last Name] varchar(50), Status varchar(50), Phone tinyint, Address varchar(50), State varchar(50), Zip tinyint, Email varchar(50), [Credit Limit] INT NULL, CONSTRAINT CK_Zip CHECK (Zip LIKE REPLICATE ('[0-9]', 5)) --Check Constraint Condition )
अब, देखते हैं कि Zip कॉलम में 6-अंकीय मान डालने का प्रयास करते समय हमें क्या मिलता है:
INSERT INTO dbo.Customers (Customer_Id, [First Name], [Last Name], Status, Phone, Address, State, Zip, Email) SELECT 1, 'James', 'Madison', 'Mr', 555-555-1234, 'Madison street, 12', 'LA', 123456, NULL GO
सम्मिलन विफल रहता है, और SQL सर्वर निम्न रोकथाम प्रदर्शित करता है:
अब तक, बहुत अच्छा।
CHECK बाधा में केस एक्सप्रेशन
मान लें कि लुइसियाना राज्य के निवासियों के लिए 150,000 डॉलर से कम की क्रेडिट सीमा निर्धारित करने के लिए बैंक का व्यवसाय नियम है। हम क्रेडिट लिमिट कॉलम में CHECK बाधा जोड़कर इस आवश्यकता को लागू करेंगे:
ALTER TABLE dbo.Customers ADD CONSTRAINT CK_Credit_Limit CHECK (State='LA' AND [Credit Limit] <= 150000) GO INSERT INTO Customers (Customer_Id, Name, Status, Phone, State, Zip, Email, [Credit Limit]) VALUES (1, 'James Black', 'Mr', 5558787, 'LA', 46853, '[email protected]', 120000); GO INSERT INTO Customers (Customer_Id, Name, Status, Phone, State, Zip, Email, [Credit Limit]) VALUES (2, 'Mark Spencer', 'Mr', 3332244, 'NY', 23487, '[email protected]', 200000); GO
जैसा कि हम उपरोक्त कथन को निष्पादित करते हैं, हमें निम्न त्रुटि मिलती है:
INSERT कथन CHECK बाधा के विपरीत है। क्या गलत हुआ?
आइए क्वेरी पर करीब से नज़र डालते हैं। ध्यान दें कि CHECK बाधा केवल State कॉलम के लिए 'LA' मानों की अनुमति देती है। साथ ही, क्रेडिट कॉलम में मान 150000 से अधिक नहीं होने चाहिए।
इसी तरह, CHECK बाधा कॉलम में अन्य राज्य कोड लिखने की अनुमति नहीं देगी।
इस प्रकार, हमें शर्त को संशोधित करने की आवश्यकता है। व्यावसायिक तर्क के अनुसार, बैंक लुइसियाना के निवासियों के लिए $150000 की क्रेडिट सीमा प्रदान करता है। साथ ही, यह मान अन्य निवासियों के लिए भिन्न हो सकता है।
इस मामले को लागू करने के लिए, हम CHECK बाधा के अंदर CASE क्लॉज का उपयोग करेंगे:
ALTER TABLE dbo.Customers ADD CONSTRAINT CK_Credit_Limit CHECK (CASE WHEN State='LA' AND [Credit Limit] <= 150000 THEN 1 ELSE 0 END = 1) GO
यह अभिव्यक्ति पूरी तरह से व्यावसायिक तर्क से मेल खाती है।
चेक बाधा में NULL मान
बैंक अपने ग्राहकों को खंडों में विभाजित करता है। स्थिति कॉलम में वह डेटा होता है जो यह निर्धारित करता है कि क्लाइंट वीआईपी है या नियमित। नियमित ग्राहकों के लिए क्रेडिट सीमा की अधिकतम राशि $200,000 है। वीआईपी $500,000 पर आकर्षित कर सकते हैं।
CHECK बाधा इस प्रकार दिख सकती है:
ALTER TABLE dbo.Customers ADD CONSTRAINT CK_Status_Credit_Limit CHECK (Status = 'VIP' OR Status = 'Regular') GO
ध्यान दें कि CHECK बाधा स्टेट कॉलम में NULLs डालने की अनुमति देती है (बशर्ते कि कोई NULL बाधा स्पष्ट रूप से परिभाषित न हो)। CHECK बाधा मानों का मूल्यांकन करती है और TRUE या FALSE लौटाती है। यह NULL को UNKNOWN के रूप में मूल्यांकन करता है। इसलिए, एनयूएलएल त्रुटियों का कारण नहीं बनेंगे। यह SELECT या UPDATE स्टेटमेंट में WHERE क्लॉज में विधेय के विपरीत है।
चेक और नोचेक
समय-समय पर व्यावसायिक तर्क बदलते रहते हैं। यह डेटाबेस ऑब्जेक्ट संशोधनों का कारण बनता है। कल्पना कीजिए कि कोई देश ज़िप-कोड आधार का विस्तार करता है और 6-अंकीय मान जोड़ता है।
5 अंकों के पुराने मान अब क्षेत्रों को असाइन नहीं किए जाएंगे। हालांकि, वे अभी भी मौजूदा लोगों के लिए मान्य हैं। इस प्रकार, CHECK बाधा को पुराने प्रारूप में मौजूदा डेटा को ध्यान में रखना चाहिए, और नए प्रारूप में डेटा को मान्य करना चाहिए।
NOCHECK क्लॉज इस समस्या का समाधान करता है:
ALTER TABLE Customers WITH NOCHECK ADD CONSTRAINT CK_Zip_Code CHECK (Zip LIKE REPLICATE('[0-9]', 6)); GO
निम्नलिखित प्रविष्टि सफल हुई:
INSERT INTO Customers (Customer_Id, Name, Status, Phone, State, Zip, Email, [Credit Limit]) VALUES (102, 'Jake Harrison', 'VIP', 555-555-1234, 'NY', 123456, '[email protected]', 100000); GO
पांच अंकों की ज़िप डालने का प्रयास करते समय, इंजन त्रुटि देता है:
DBCC CHECKCONSTRAINTS
SQL सर्वर डेटा की खोज के लिए DBCC CHECKCONSTRAINTS प्रदान करता है जो बाधाओं से मेल नहीं खाता।
यदि कोई डेटाबेस अखंडता समस्या है, तो यह सुनिश्चित करने के लिए कि कोई समस्या नहीं है, संपूर्ण डेटाबेस के लिए DBCC CHECKCONSTRAINTS चलाएँ।
ध्यान दें कि यह आदेश प्रदर्शन को प्रभावित करता है। इसलिए, इसे निर्धारित आधार पर नहीं चलाना चाहिए।
DBCC CHECKCONSTRAINTS को एक ही बाधा, एक टेबल या पूरे डेटाबेस के लिए चलाना संभव है।
अन्य चेक कमांड की तुलना में, DBCC CHECKCONSTRAINTS सिस्टम संसाधनों को पूरा करने और खपत करने में पर्याप्त समय लेता है। अन्य आदेशों के विपरीत, CHECKCONSTRAINTS डेटाबेस स्नैपशॉट का उपयोग नहीं करता है।
निष्कर्ष
CHECK बाधा डालने से पहले डेटा के मूल्यांकन के लिए तंत्र प्रदान करती है। CHECK बाधाएँ एकल स्तंभ या एकाधिक तालिका स्तंभों को संदर्भित कर सकती हैं।
बाधाएं केवल विधेय हैं जो TRUE, FALSE, या UNKNOWN में परिणामित होती हैं। यदि तालिका में NULL डाला जाता है, तो बाधा का उल्लंघन नहीं होता है।