5

निम्न उदाहरण तालिका लें:चेक बाधा - केवल एक स्तंभ सच होने की अनुमति है, तो एक और स्तंभ सच है

CREATE TABLE [dbo].[tbl_Example](
    [PageID] [int] IDENTITY(1,1) NOT NULL, 
    [RequireLogin] [bit] NOT NULL, 
    [RequireAdmin] [bit] NOT NULL, 
    [HideIfLoggedIn] [bit] NOT NULL 
) 

कैसे एक पुनर्लेखन था जिसके ऊपर जाँच की कमी शामिल करने के लिए इस प्रकार है:

  • सेना [RequireAdmin]झूठी होने के लिए अगर [RequireLogin]झूठी (यानी केवल [RequireAdmin] होने की सच 0 यदि अनुमति देते हैंहै सच[RequireLogin] की इजाजत दी सच और [RequireAdmin]झूठी
  • होने के लिए केवल [HideIfLoggedIn] होने की सच अगर [RequireLogin]झूठी में नेस्टेड मामले बयान
+0

(1) [RequAdmin] <= [RequLogin]? (2) [RequLogin] = 0 या [HideIfLoggedIn] = 1? – wqw

उत्तर

6

आप आमतौर पर करते हैं की अनुमति देते हैं करने के लिए, जबकि उस प्रकार के तर्क को काम करने के लिए चेक करें। याद रखें कि एक जांच में एक मामला अभी भी एक मूल्यांकन होना चाहिए, तो यह रूप

CHECK (case when <exp> then 1 end = 1). 

ले अपने सटीक आवश्यकताओं से अधिक खोज रहे हैं हैं लेकिन ऐसा लगता है कि यह भी काम करेगा और पढ़ने के लिए शायद आसान है:

CREATE TABLE [dbo].[tbl_Example] 
(
    [PageID] [int] IDENTITY(1,1) NOT NULL, 
    [RequireLogin] [bit] NOT NULL, 
    [RequireAdmin] [bit] NOT NULL, 
    [HideIfLoggedIn] [bit] NOT NULL 
) 

ALTER TABLE [dbo].[tbl_Example] ADD CONSTRAINT 
    [RequireAdmin] CHECK 
     ((RequireAdmin = RequireLogin) OR 
     (RequireLogin=1)); 

ALTER TABLE [dbo].[tbl_Example] ADD CONSTRAINT 
     [HideIfLoggedIn] CHECK 
     ((RequireLogin=1 AND HideIfLoggedIn=0) OR 
     (RequireLogin=0 AND HideIfLoggedIn=1) OR 
     (RequireLogin=0 AND HideIfLoggedIn=0)) 
+1

को उस अंतिम को '((RequLogin = 1 और HideIfLoggedIn = 0) में बदलना था या (RequLogin = 0 और HideIfLoggedIn = 1) या (RequLogin = 0 और HideIfLoggedIn = 0)) - लेकिन हाँ, बहुत अच्छा काम करता है - चीयर्स – HeavenCore

+0

अच्छा, संयुक्त बुलियन तर्क हमेशा पीछे की ओर आसान है। – RThomas

2

अगर मैं बीजगणित सही है:

alter table dbo.Example 
add constraint RequireAdmin_RequireLogin_ck 
check (not (RequireAdmin = 'true' and RequireLogin = 'false')) ; 
alter table dbo.Example 
add constraint HideIfLoggedIn_RequireLogin_ck 
check (not (HideIfLoggedIn = 'true' and RequireLogin = 'true')) ; 

ध्यान दें कि इन जांच की कमी तालिका स्तर नहीं स्तंभ स्तर पर परिभाषित कर रहे हैं, के रूप में वे चाहिए क्योंकि वे कई colum संदर्भ एनएस। इस कारण से RThomas का जवाब मान्य ट्रांजैक्ट-एसक्यूएल नहीं है!

+0

मैं दो चीजों की अनुशंसा करता हूं: (1) 'NOT' का उपयोग करके बाधाओं को लागू करने की कोशिश नहीं करना - यह केवल बीआईटी तुलना के लिए बूलियन-शैली स्ट्रिंग अक्षर के बजाय मानसिक रूप से (2) 0 और 1 का उपयोग करके प्रक्रियाओं को संसाधित करने के तरीके को उलट देता है। –

+0

मैं उन दोनों पर, हारून से असहमत हूं। सबसे पहले, संगठनात्मक नीतियों को आमतौर पर नकारात्मक के रूप में व्यक्त किया जाता है (उदाहरण के लिए "कर्मचारियों को कार्य के घंटों के दौरान ईबे सर्फ करने की अनुमति नहीं है") ताकि एक ही शब्द का उपयोग करके बाधाओं को बेहतर पढ़ने की समझ मिल सके। दूसरा, ये बूलियन हैं - वे केवल थोड़े क्षेत्र हैं क्योंकि एमएसएसक्यूएल में बुलियन डेटा प्रकार नहीं है। समझने के लिए 'सत्य' का उपयोग करना बेहतर है क्योंकि यह पाठक को स्पष्ट रूप से "सत्य" बताता है। इसके विपरीत, 0 और 1 को पाठक को यह याद रखने की आवश्यकता है कि 0 इस विशेष भाषा में गलत या सत्य का प्रतिनिधित्व करता है या नहीं। –

+3

ठीक है, आप जो चाहते हैं वह करो। मैं आपको SQL सर्वर में 16 वर्षों के अनुभव से बता सकता हूं कि मैंने जिन दो चीजों का उल्लेख किया है, वे * अधिकांश उपयोगकर्ताओं को भ्रमित कर देंगे, भले ही वे आपको कितना समझ सकें। –

संबंधित मुद्दे