2009-11-12 10 views
12

मेरे पास आधे दर्जन MSSQL 2008 टेबल की एक सूची है जिसे मैं अपने डेटाबेस से एक बार में हटाना चाहता हूं। डेटा पूरी तरह से नई तालिकाओं में स्थानांतरित कर दिया गया है। नई तालिकाओं में पुरानी तालिकाओं में कोई संदर्भ नहीं है।बाधाओं को अनदेखा करते हुए SQL सर्वर तालिकाओं की एक सूची कैसे छोड़ें?

समस्या यह है कि पुरानी तालिकाएं आंतरिक एफके बाधाओं के भार के साथ आती हैं जिन्हें एक उपकरण (aspnet_regsql वास्तव में) द्वारा स्वत: उत्पन्न किया गया है। इसलिए मैन्युअल रूप से सभी बाधाओं को छोड़ना एक वास्तविक दर्द है।

मैं सभी आंतरिक बाधाओं को अनदेखा करने वाली पुरानी तालिकाओं को कैसे छोड़ सकता हूं?

उत्तर

3

एक साधारण DROP TABLE dbo.MyTable विदेशी कुंजी को छोड़ कर सभी बाधाओं (और ट्रिगर) पर ध्यान नहीं देगा (जब तक आप बच्चे/संदर्भित तालिका ड्रॉप पहले) आप इन पहले ड्रॉप करना पड़ सकता है जहां।

संपादित करें: टिप्पणी के बाद:

कोई स्वचालित तरीका है। आपको sys.foreign_keys के माध्यम से फिर से शुरू करना होगा और कुछ वैकल्पिक तालिका विवरण उत्पन्न करना होगा।

+0

धन्यवाद, लेकिन मेरी समस्या यह है कि ठीक से उत्पन्न एफके के भार हैं। –

-1

मुझे संदेह है कि आपको फोर्जिन कुंजी बाधाओं को हटाने के लिए ड्रॉप से ​​पहले आपत्तिजनक तालिकाओं पर 'परिवर्तन' कमांड करना होगा।

ALTER TABLE Orders DROP FOREIGN KEY fk_PerOrders; 
DROP TABLE Orders; 

बेशक यदि आप पहले बच्चे की टेबल छोड़ देते हैं, तो आपको यह समस्या नहीं होगी। (जब तक आपके पास तालिका बी और तालिका बी बाधा के लिए कोई बाधा नहीं है, तो आपको तालिकाओं में से एक को बदलने की आवश्यकता होगी, उदाहरण के लिए बाधा को दूर करने के लिए ए)

उदा। यह WONT काम, ऑर्डर के ऑर्डर_लाइन

DROP TABLE Orders; 
DROP TABLE Order_lines; 

उदा। इस

DROP TABLE Order_lines; 
DROP TABLE Orders; 
+0

क्षमा करें, लेकिन बहुत से ऑटो-जेनरेट की गई बाधाएं हैं, मैन्युअल रूप से बाधाओं को सूचीबद्ध नहीं कर सकती हैं। –

+0

टेबल कैसे बनाए गए हैं? मुझे लगता है कि आपको केवल एक स्क्रिप्ट बनाने की आवश्यकता होगी जो बिना किसी बाधा वाले तालिकाओं को हटा देता है और फिर उन्हें हटाने से पहले अन्य तालिकाओं को बदल देता है। मैं इसे वह जवाब नहीं जानता जिसे आप ढूंढ रहे हैं, लेकिन यह सबसे अच्छा तरीका है जिसे मैं पेश कर सकता हूं। मेरे पास मेरे प्रोजेक्ट में कुछ सिमुलीयर है, एक 40 लाइन एसक्यूएल स्टेटमेंट जो पंक्तियों को बदलता है और फिर उन्हें छोड़ देता है (मेरे मामले में टेबल नहीं)। –

0

मैं अंत में script provided by Jason Presley के आधार पर समाधान नहीं मिला काम करेंगे। यह स्क्रिप्ट स्वचालित रूप से डीबी में सभी बाधाओं को हटा देती है। WHERE क्लॉज जोड़ना आसान है ताकि यह केवल संबंधित तालिकाओं के सेट पर लागू हो। उसके बाद, सभी तालिकाओं को छोड़ना एक सीधा है। आपकी आवश्यकताओं के अनुरूप करने के लिए

select concat("alter table ", table_name, " drop ", constraint_type ," ", constraint_name, ";") 
    from information_schema.table_constraints 
    where table_name like 'somefoo_%' 
     and 
     constraint_type <> "PRIMARY KEY"; 

आप तालिका नाम संशोधित करना चाहते हैं जाएगा या संभवतः के खिलाफ का चयन करें:

+5

लिंक अब काम नहीं करता है और Google कैश में नहीं दिखता है या वेबैक –

1

मैं एक उचित (ish) जिस तरह से एसक्यूएल बाधाओं ड्रॉप करने एसक्यूएल लिखने बनाकर यह करने के लिए मिल गया अन्य कॉलम/मूल्य।

इसके अलावा, यह किसी भी गैर प्राथमिक कुंजी बाधा का चयन करेगा, जो एक स्लेजहैमर का बहुत बड़ा हो सकता है। शायद आपको बस इसे = = सेट करने की आवश्यकता है?

मैं डीबीए नहीं हूं। ऐसा करने के बेहतर तरीके हो सकते हैं, लेकिन यह मेरे उद्देश्यों के लिए काफी अच्छा काम करता है।

+2

'concat' एक मान्यता प्राप्त अंतर्निहित फ़ंक्शन नाम नहीं है। यह 2012+ है –

6

यह इस बात पर निर्भर करता है कि आप टेबल को कैसे छोड़ना चाहते हैं। यदि तालिकाओं की सूची आपके डीबी के तहत लगभग 20% तालिकाओं को कवर करने की आवश्यकता है।

फिर मैं अपनी स्क्रिप्ट के नीचे उस डीबी में सभी बाधाओं को अक्षम कर दूंगा और तालिकाओं को छोड़ दूंगा और उसी स्क्रिप्ट के नीचे बाधाओं को सक्षम कर दूंगा।

--To Disable a Constraint at DB level 

EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL' 

--Write the code to DROP tables 

DROP TABLE TABLENAME 

DROP TABLE TABLENAME 

DROP TABLE TABLENAME 

--To Enable a Constraint at DB level 

EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL' 

अंत में आपकी बाधाओं की स्थिति की जांच करने के लिए इस क्वेरी को आग लगाना।

--Checks the Status of Constraints 

SELECT (CASE 
    WHEN OBJECTPROPERTY(CONSTID, 'CNSTISDISABLED') = 0 THEN 'ENABLED' 
    ELSE 'DISABLED' 
    END) AS STATUS, 
    OBJECT_NAME(CONSTID) AS CONSTRAINT_NAME, 
    OBJECT_NAME(FKEYID) AS TABLE_NAME, 
    COL_NAME(FKEYID, FKEY) AS COLUMN_NAME, 
    OBJECT_NAME(RKEYID) AS REFERENCED_TABLE_NAME, 
    COL_NAME(RKEYID, RKEY) AS REFERENCED_COLUMN_NAME 
FROM SYSFOREIGNKEYS 
ORDER BY TABLE_NAME, CONSTRAINT_NAME,REFERENCED_TABLE_NAME, KEYNO 

आप तो टेबल जो आप ड्रॉप करना चाहते हैं की एक सूची बनाने डाटाबेस स्तर पर बाधाओं को निष्क्रिय करना चाहते न तो।

Step1: thos तालिकाओं

SELECT * 
FROM sys.foreign_keys 
WHERE referenced_object_id = object_id('dbo.Tablename') 

के साथ जुड़े प्रतिबन्ध की जाँच करें चरण 2: प्रतिबन्ध जो इन तालिकाओं के साथ जुड़े रहे अक्षम करें।

ALTER TABLE MyTable NOCHECK CONSTRAINT MyConstraint 

चरण 3: टेबल

DROP TABLE TABLENAME 
1

भागो वर्तमान डीबी के तहत सभी तालिकाओं में सभी बाधाओं को हटा सकते हैं और फिर ड्रॉप तालिका बयान को चलाने के लिए निम्न स्क्रिप्ट ड्रॉप।

DECLARE @dropAllConstraints NVARCHAR(MAX) = N''; 

SELECT @dropAllConstraints += N' 
ALTER TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME(parent_object_id)) 
    + '.' + QUOTENAME(OBJECT_NAME(parent_object_id)) + 
    ' DROP CONSTRAINT ' + QUOTENAME(name) + ';' 
FROM sys.foreign_keys; 
EXEC sp_executesql @dropAllConstraints