2009-08-26 11 views
15

मैं विभिन्न डेटाबेस के बीच स्कीमा को सिंक करने की कोशिश कर रहा हूं। असल में, मैंने कार्यों को चलाया-> दोनों डेटाबेस पर SQL सर्वर प्रबंधन स्टूडियो (2005) के साथ स्क्रिप्ट जेनरेट करें और आउटपुट को एक diff टूल के साथ तुलना कर रहा हूं।जेनरेट स्क्रिप्ट में SQL सर्वर चेक/नो चेक अंतर

किसी कारण से, एक स्क्रिप्ट कोई चेक, दोनों की कमी के बाद फिर से सक्षम किया जा रहा के साथ जांच और एक के साथ बाधा कहते हैं।

मैं पहली बार डेटाबेस के लिए मैं:

ALTER TABLE [dbo].[Profile] WITH CHECK ADD CONSTRAINT [FK_Profile_OrganizationID] FOREIGN KEY([OrganizationID]) 
REFERENCES [dbo].[Organization] ([OrganizationID]) 
GO 
ALTER TABLE [dbo].[Profile] CHECK CONSTRAINT [FK_Profile_OrganizationID] 
GO 

दूसरा डेटाबेस उत्पन्न

ALTER TABLE [dbo].[Profile] WITH NOCHECK ADD CONSTRAINT [FK_Profile_OrganizationID] FOREIGN KEY([OrganizationID]) 
REFERENCES [dbo].[Organization] ([OrganizationID]) 
GO 
ALTER TABLE [dbo].[Profile] CHECK CONSTRAINT [FK_Profile_OrganizationID] 
GO 

के रूप में तो मैं दो प्रश्न हैं:

  1. अंत में एक ही परिणाम है ? (संपादित करें: ऐसा लगता है कि बहुत से लोगों को केवल दो लिपियों के पहले बयान मैं दोनों लिपियों की सम्पूर्णता के अंतिम परिणाम में दिलचस्पी है पर उठा रहे हैं।।)

  2. अंत तो नतीजा वही है, प्रबंधन स्टूडियो अलग-अलग डेटाबेस के लिए उन्हें अलग-अलग क्यों उत्पन्न करता है?

उत्तर

16

के विभिन्न संस्करणों के आधार पर अलग-अलग दिनचर्या का उपयोग कर सकता है, अंतिम परिणाम समान नहीं है!

एसक्यूएल सर्वर एफके की विशिष्टता पर भरोसा नहीं करेगा यह जांच नहीं है। इसका अर्थ यह है कि यदि आप किसी क्वेरी में कॉलम का उपयोग करते हैं तो अतिरिक्त प्रसंस्करण की आवश्यकता होती है।
लंबी कहानी छोटी है कि आपको कॉलम जांचने के लिए SQL सर्वर प्राप्त करना चाहिए ताकि इसे विश्वसनीय माना जा सके।

क्यों वे विभिन्न सर्वरों से अलग हैं, sys.foreign_keys में isnottrusted कॉलम की जांच करें। एसएसएमएस क्या उत्पन्न कर रहा है इससे प्रभावित हो सकता है?

इस पर अधिक रेंट के लिए, my other answer देखें जो FK & से संबंधित कोई चेक/चेक विकल्प नहीं है।

+0

नहीं है, हालांकि, यदि आप दो स्क्रिप्ट स्क्रिप्ट को देखते हैं, तो बाधा जोड़ने के तुरंत बाद, वैकल्पिक तालिका है [ डीबीओ]। [प्रोफाइल] कंसस्ट्रेंट की जांच करें [FK_Profile_OrganizationID] जाओ क्या उस बिंदु पर बाधाओं की जांच नहीं है? – Nathan

+0

आपके उत्तर के दूसरे भाग के लिए, आप वास्तव में सही हैं कि is_not_trusted डेटाबेस में से किसी एक पर सेट है, न कि दूसरे पर। इसका क्या असर पड़ता है? – Nathan

+2

इस आलेख को मिला: http://sqlblog.com/blogs/tibor_karaszi/archive/2008/01/12/non-trusted-constraints.aspx तो ऐसा लगता है कि बैच में दूसरा कथन केवल यह सुनिश्चित करता है कि बाधा सक्षम है, यह वास्तव में मौजूदा डेटा की जांच नहीं करता है। वास्तव में मौजूदा डेटा की जांच करने के लिए, मुझे तालिका बदलने की आवश्यकता है? चेक जांच के साथ सभी – Nathan

11

हाँ वे दो स्क्रिप्ट अलग

जांच नई बाधा के खिलाफ मौजूदा डेटा की जाँच करेगा के साथ कर रहे हैं।
NOCHECK नई बाधा के खिलाफ मौजूदा डेटा की जांच नहीं करेगा। इससे आपको संबंधित माता-पिता के बिना बाल रिकॉर्ड प्राप्त करने की अनुमति मिल जाएगी।

संपादित करें: क्यों SSMS यह कर रहा है के रूप में मुझे पता नहीं

+1

हालांकि, यदि आप दो स्क्रिप्ट्स स्क्रिप्ट को देखते हैं, तो बाधा जोड़ने के तुरंत बाद, वैकल्पिक तालिका [डीबीओ] होती है। [प्रोफ़ाइल] कंसस्ट्रेंट जांचें [FK_Profile_OrganizationID] जाओ क्या उस बिंदु पर बाधाओं की जांच नहीं होती है? – Nathan

0

है दोनों SQL सर्वर 2005 सर्वर कर रहे हैं? परिणामस्वरूप वही है, कोड जनरेशन टूल उत्पाद

+0

वास्तव में, समय पर इस विशेष बिंदु पर, दोनों डेटाबेस एक ही सर्वर पर हैं - इसलिए निश्चित रूप से कोई एसक्यूएल सर्वर संस्करण अंतर – Nathan

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