2010-03-09 8 views
10

के साथ ड्रॉप टेबल तालिका "ए" पर एफके के माध्यम से 30 अन्य टेबलों को "एआईडी" पर निर्भर करता है।एसक्यूएल सर्वर: एफके

एकीकरण परीक्षण के लिए मुझे तालिका छोड़नी है और परिभाषित स्थिति बनाने के लिए इसे फिर से बनाना है। आश्रित वस्तुओं की वजह से वे तालिका को हटाने और फिर से बनाने का कोई तरीका नहीं लगते हैं। त्रुटि संदेश है:

नहीं छोड़ सका वस्तु 'dbo.A' क्योंकि यह एक विदेशी प्रमुख बाधा

प्रश्न (ओं) द्वारा संदर्भित है:

  • मैं तालिका "ए" कैसे छोड़ सकता हूं और फिर से बना सकता हूं?
  • (या) क्या वैश्विक स्तर पर स्कीमा निर्भरताओं को बंद करने का कोई तरीका है?
  • (या) तालिका "ए" को हटाने और पुनर्स्थापित करने से पहले बैकअप (सभी!) निर्भरताओं का कोई तरीका है और बाद में सभी निर्भरताओं को पुनर्स्थापित करें?
+0

आप एकीकरण परीक्षण के लिए एक अलग डीबी का उपयोग क्यों नहीं करते हैं जहां पूरे राज्य को हर बार खरोंच से उत्पन्न किया जाता है? – dbemerlin

+0

डेटाबेस बस बड़ा है (कई आश्रित वस्तुओं के साथ कुछ सौ टेबल)। इस तरह से जाकर, प्रत्येक एकीकरण परीक्षण में स्टार्टअप समय के लिए और बिना किसी वास्तविक परीक्षण के 45 सेकंड + x लगेंगे। इसके अतिरिक्त कुछ तालिकाओं में डेटा होता है। (किसी भी कस्टम डेटा के बिना कुल डेटाबेस डंप लगभग 35 एमबी है)। हमारे पास _many_ एकीकरण परीक्षण होगा, जिसे हम एकीकरण सर्वर का उपयोग करके प्रत्येक चेक पर निष्पादित करना चाहते हैं। – Robert

+0

क्या प्रत्येक एकीकरण स्थिति को डीबी की प्रारंभिक स्थिति की आवश्यकता होती है, या क्या आप एक बार स्टार्टअप पेनल्टी का भुगतान कर सकते हैं और प्रत्येक टेस्ट को राज्य में जो भी क्षणिक परिवर्तन हो सकता है उसे पूर्ववत कर सकते हैं? – Mikeb

उत्तर

3

एसएसएमएस में डेटाबेस पर जाएं और राइट क्लिक करें। कार्य चुनें, स्क्रिप्ट उत्पन्न करें। फिर विकल्पों के माध्यम से जाएं और उन्हें जिस तरह से आप चाहते हैं सेट करें (केवल तालिका में विदेशी कुंजी चुनने और निर्भर वस्तुओं को बनाने और ड्रॉप करने और पुन: बनाने के लिए समस्या, मेरे सामने विकल्प नहीं है लेकिन आप उन्हें देखेंगे।फिर उन तालिकाओं को चुनें जिन्हें आप एफके को स्क्रिप्ट करना चाहते हैं और उन्हें एक फ़ाइल में स्क्रिप्ट करना चाहते हैं। फ़ाइल खोलें और ड्रॉप स्टेटमेंट को एक फ़ाइल में अलग करें और अन्य में स्टेटमेंट बनाएं। अब आपके पास चलने वाली tweo फ़ाइलें हैं जो आप चला सकते हैं जब आप कभी भी परीक्षण चलाते हैं तो आप जो चाहते हैं उसे स्वचालित रूप से करें। मैं पहले टेस्ट चलाने से पहले फाइलों को दोबारा बनाने का सुझाव दूंगा (अगर वे आखिरी बार परीक्षण चलाए गए थे) लेकिन प्रत्येक व्यक्तिगत परीक्षण के लिए नहीं।

+0

धन्यवाद, मैं बहुत आभारी हूं। यही वह है जो मेरे लिए सबसे अच्छा काम करता है! – Robert

4

प्रबंधन स्टूडियो में, आप तालिका और स्क्रिप्ट पर राइट-क्लिक कर सकते हैं क्रिएट और डीआरओपी जिसमें सभी विदेशी कुंजी शामिल होंगी।


अधिक विशिष्ट होने के लिए, यह आपको उन सभी बाधाओं को देगा जिन पर आपकी तालिका निर्भर करती है। हालांकि, यह आपको इस तालिका पर निर्भर विदेशी कुंजी की सूची नहीं देता है। इसलिए, स्क्रिप्ट के अलावा आप एसएमएस में तालिका पर राइट-क्लिक करके उत्पन्न करेंगे, आपको सभी विदेशी कुंजी ढूंढने और स्क्रिप्ट करने की आवश्यकता है। उनमें से एक सूची प्राप्त करने के लिए, तुम इतनी तरह एक प्रश्न चला सकते हैं:

select FKConstraint.TABLE_NAME, FKConstraint.CONSTRAINT_NAME 
from INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS 
    Join INFORMATION_SCHEMA.TABLE_CONSTRAINTS As UniqueConstraint 
     On UniqueConstraint.CONSTRAINT_NAME = INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS.UNIQUE_CONSTRAINT_NAME 
    Join INFORMATION_SCHEMA.TABLE_CONSTRAINTS As FKConstraint 
     On FKConstraint.CONSTRAINT_NAME = INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS.CONSTRAINT_NAME   
Where UniqueConstraint.TABLE_NAME = 'TableA' 

इन में से हर एक के लिए, आप स्क्रिप्ट बनाने और ड्रॉप करने की आवश्यकता होगी। आप बूंदों को अपनी ड्रॉप स्क्रिप्ट के शीर्ष पर जोड़ देंगे और आपकी निर्माण स्क्रिप्ट के अंत में बनेंगे।

+0

इसमें संदर्भ संदर्भ निर्भरताएं नहीं हैं, जो समस्या है। – Robert

+1

आपका क्या मतलब है? एसएमएस एक स्क्रिप्ट तैयार करेगा जो सभी विदेशी कुंजियों को तालिका में गिराएगा और फिर अंत में, तालिका छोड़ दें। इसके अलावा, निर्माण सभी विदेशी कुंजी बना देगा। – Thomas

+0

हम्म, मैंने यह कोशिश की है .. और कई लोगों के साथ एक स्क्रिप्ट प्राप्त की है: "अगर EXISTS (चयन करें * sys.check_constraints से चुनें" ... लेकिन जब मैं इसे निष्पादित करता हूं, तब भी मुझे मिलता है: "ऑब्जेक्ट ड्रॉप नहीं कर सका" dbo.A 'क्योंकि यह एक विदेशी कुंजी बाधा द्वारा संदर्भित है। "यह वास्तव में, वास्तव में अजीब है! – Robert

2

एसक्यूएल सर्वर प्रबंधन स्टूडियो में तालिका का विस्तार करें, बाधाओं का विस्तार करें फ़ोल्डर।

आपके पास होने वाली किसी भी बाधा को लिखें ताकि आप उन्हें फिर से बना सकें। बाधाओं को हटाएं और तालिका छोड़ दें। तालिका को पुनर्निर्माण करें और अपनी बाधाओं को दोबारा बनाएं।

+0

मैंने इसके बारे में भी सोचा था, लेकिन चूंकि कई तालिकाओं में कई बाधाएं और निर्भरताएं हैं, यह बहुत काम करेगा। (और बहुत सारे काम हैं, मैं जो बचने की कोशिश करता हूं :-)) – Robert

+0

हां, मेरी इच्छा है कि मिर्कोसॉफ्ट इस कार्य को निष्पादित करना आसान बनाएं। हर बार मुझे यह करना है, मैं जोर से शिकायत करता हूं। ;-) –

2

लेनदेन का उपयोग करें। परीक्षण के अंत में - इसे रोलबैक करें।

+0

अच्छा विचार है, लेकिन मैं एसक्यूएल-कनेक्शन को पकड़ नहीं सकता - इसलिए लेनदेन को नियंत्रित करने का कोई तरीका नहीं है (?)। – Robert

5

sys.foreign_key_columns सिस्टम तालिका का अन्वेषण करें। यहाँ एक उदाहरण है कि मुझे लगता है कि होगा, एक मेज दिया आसपास बिछाने था है, आपको यह बताती है इसके बारे में है कॉलम एक और मेज पर keyed रहे हैं:

DECLARE @tableName VARCHAR(255) 
SET @tableName = 'YourTableName' 

SELECT OBJECT_NAME(fkc.constraint_object_id) AS 'FKName', OBJECT_NAME(fkc.[referenced_object_id]) AS 'FKTable', c2.[name] AS 'FKTableColumn', @tableName AS 'Table', c1.[name] AS 'TableColumn' 
    FROM sys.foreign_key_columns as fkc 
     JOIN sys.columns AS c1 ON c1.[object_id] = fkc.[parent_object_id] AND c1.[column_id] = fkc.[parent_column_id] 
     JOIN sys.columns AS c2 ON c2.[object_id] = fkc.[referenced_object_id] AND c2.[column_id] = fkc.[referenced_column_id] 
    WHERE fkc.[parent_object_id] = OBJECT_ID(@tableName) 
    ORDER BY OBJECT_NAME(fkc.constraint_object_id) 
इस के साथ

, या कुछ अधिक अंतर-की, आप विदेशी बाहर मिल सकता है चाबियाँ, उन्हें छोड़ दो, अपनी सामग्री करें, और फिर विदेशी कुंजी दोबारा बनाएं।

मुझे यह जोड़ना चाहिए कि मुझे यह पता चलता है कि यह SQL2005 और SQL2008 पर काम करता है। मुझे वास्तव में पता नहीं है कि यह SQL2000/MSDE पर काम करेगा या नहीं।

0

शायद अपने डेटाबेस के साथ वर्चुअल सर्वर को प्रारंभिक परीक्षण सेटअप में बनाए रखने पर विचार करें। वीएम बूट करें, अपना परीक्षण करें, फिर बदले गए वीएम को फेंक दें।

+0

मुझे लगता है कि डेटाबेस को पुनर्स्थापित करने के लिए एक वीएम बहाल करने से तेज़ होगा .. – Robert

+0

नहीं, बिल्कुल कोई बहाल नहीं है। जब आप चाहते थे तो वीएम को बूट करने में एक या दो मिनट लगेंगे, बस इतना ही। –

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