2010-08-09 13 views
18

मैं एसक्यूएल सर्वर 2008जाँच प्रतिबंध

का उपयोग मैं एक ही तालिका में एकाधिक स्तंभों पर एक जाँच प्रतिबंध का उपयोग डेटा इनपुट को मान्य करने की कोशिश करने के लिए।

मैं एक त्रुटि प्राप्त:

Column CHECK constraint for column 'AAAA' references another column, table 'XXXX'.

जाँच प्रतिबंध इस तरह से काम नहीं करता।

एफके का उपयोग किये बिना एक ही टेबल पर इसे लागू करने का कोई और तरीका?

धन्यवाद

यहाँ मेरी कोड का एक उदाहरण

CREATE TABLE dbo.Test 
( 
EffectiveStartDate dateTime2(2)  NOT NULL, 
EffectiveEndDate dateTime2(2)  NOT NULL 
    CONSTRAINT CK_CmsSponsoredContents_EffectiveEndDate CHECK (EffectiveEndDate > EffectiveStartDate), 
); 
+2

क्यों "एफके के बिना" ?? विदेशी कुंजी ** ** दो टेबल को जोड़ने के लिए डिज़ाइन की गई हैं - यह उनकी मुख्य योग्यता, उनका काम, उनका कारण है - एफके का उपयोग क्यों नहीं करते जब यह वास्तव में एफके का काम है ??? –

+0

मैंने अपने प्रश्न में अपना कोड जोड़ा, आशा है कि अब और अधिक समझदारी होगी। – GibboK

उत्तर

40

हाँ, तालिका स्तर पर जाँच प्रतिबंध को परिभाषित

CREATE TABLE foo (
    bar int NOT NULL, 
    fred varchar(50) NOT NULL, 

    CONSTRAINT CK_foo_stuff CHECK (bar = 1 AND fred ='fish') 
) 

आप इसे इनलाइन एक स्तंभ के रूप में घोषित करने कर रहे हैं बाधा

... 
fred varchar(50) NOT NULL CONSTRAINT CK_foo_fred CHECK (...) 
... 

संपादित करें, वर्णन से पोस्ट करना आसान है। अपने अल्पविराम फिक्स्ड।

CREATE TABLE dbo.Test 
( 
    EffectiveStartDate dateTime2(2)  NOT NULL, 
    EffectiveEndDate dateTime2(2)  NOT NULL, --need comma 
    CONSTRAINT CK_CmsSponsoredContents_EffectiveEndDate CHECK (EffectiveEndDate > EffectiveStartDate) --no comma 
); 
बेशक

, सवाल बनी हुई है आप एक चेक बाधा जहां यह एक FK बाधा होना चाहिए का उपयोग कर रहे हैं ...?

+0

नमस्ते मैंने आपके कोड और उसके कामकाज का परीक्षण किया, मैंने अपने मूल प्रश्न पर पोस्ट किया क्योंकि यह बहुत समान है लेकिन काम नहीं करता है। कोई विचार? आपके समय – GibboK

+0

+1 के लिए धन्यवाद हालांकि मैं तर्क दूंगा कि तार्किक रूप से बाधा पंक्ति स्तर पर परिभाषित की गई है। एक टेबल-स्तरीय जांच बाधा एक ही तालिका में विभिन्न पंक्तियों में डेटा का संदर्भ देने में सक्षम होगी, कुछ SQL सर्वर सीधे समर्थन नहीं करता है। – onedaywhen

+0

@onedaywhen: एक सीके बाधा * हमेशा * प्रति पंक्ति है। "टेबल लेवल" का मतलब तालिका से जुड़ा हुआ है, बल्कि कॉलम से जुड़ा हुआ है। – gbn

2

चेक बाधाएं एक कॉलम या पूरे रिकॉर्ड को संदर्भित कर सकती हैं।

रिकार्ड स्तर की कमी के लिए इस वाक्य रचना का उपयोग करें:

ALTER TABLE MyTable 
ADD CONSTRAINT MyCheck 
CHECK (...your check expression...) 
1

आप बस मेज पर एक ट्रिगर में अपनी मान्यता आवेदन कर सकते हैं विशेष रूप से किसी भी तरह से आपरेशन वापस लुढ़का किया जाएगा यदि जांच में विफल है।

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