मैं सभी तालिकाओं से सभी बाधाओं को कैसे छोड़ूं?


30

मैं सभी डिफ़ॉल्ट बाधाओं, चेक बाधाओं, अद्वितीय बाधाओं, प्राथमिक कुंजियों और विदेशी कुंजियों को SQL सर्वर डेटाबेस में सभी तालिकाओं से ड्रॉप करना चाहता हूं। मुझे पता है कि सभी बाधा नाम sys.objectsकैसे मिलते हैं , लेकिन मैं इस ALTER TABLEहिस्से को कैसे आबाद करूं ?


जिज्ञासा से बाहर, इस तरह के अनुरोध का संदर्भ क्या है? सोच रहा था कि कार्यात्मक निर्भरता कैसे संबोधित की जाती है (यानी अनुक्रमित विचार, FKs पर कैस्केड इवेंट, और UQs जो IGNORE_DUP_KEY = ON था)।
सोलोमन रटज़की

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

जवाबों:


36

आप sys.tables.object_id = sys.objects.parent_object_idउन ऑब्जेक्ट प्रकारों में शामिल होकर इस जानकारी को आसानी से प्राप्त कर सकते हैं ।

DECLARE @sql NVARCHAR(MAX);
SET @sql = N'';

SELECT @sql = @sql + N'
  ALTER TABLE ' + QUOTENAME(s.name) + N'.'
  + QUOTENAME(t.name) + N' DROP CONSTRAINT '
  + QUOTENAME(c.name) + ';'
FROM sys.objects AS c
INNER JOIN sys.tables AS t
ON c.parent_object_id = t.[object_id]
INNER JOIN sys.schemas AS s 
ON t.[schema_id] = s.[schema_id]
WHERE c.[type] IN ('D','C','F','PK','UQ')
ORDER BY c.[type];

PRINT @sql;
--EXEC sys.sp_executesql @sql;

PRINTबस वहाँ है नेत्रगोलक के लिए - यदि आपके पास बहुत सारी बाधाएं हैं, तो यह पूरी स्क्रिप्ट नहीं दिखा सकता है क्योंकि यह 8K तक सीमित है। उन मामलों में, चलने से पहले स्क्रिप्ट को मान्य करने के अन्य तरीकों के लिए इस टिप को देखें ।

एक बार जब आप आउटपुट से खुश हो जाते हैं, तो असहज हो जाते हैं EXEC


3
आप प्राथमिक कुंजी से पहले विदेशी कुंजी बाधाओं को छोड़ना भी सुनिश्चित कर सकते हैं; ORDER BY (CASE WHEN c.[type] IN ('PK', 'UQ') THEN 1 ELSE 0 END)
डैनियल हतमाकर

1
@Daniel अच्छा बिंदु, ORDER प्रकार संभवतः तब तक पर्याप्त होता है जब तक SQL सर्वर नए बाधा प्रकारों का परिचय नहीं देता।
हारून बर्ट्रेंड

6

मैंने स्वीकृत उत्तर के साथ शुरुआत की और गतिशील sql में पूर्ण sql स्टेटमेंट बनाने के बजाय थोड़ी देर के लूप का उपयोग करने के लिए संरचना को संशोधित किया। मुझे यह कई कारणों से बेहतर लगता है।

क्वेरी बड़े @sql चर में संग्रहीत नहीं है। यह कार्यान्वयन आउटपुट में लॉगिंग उद्देश्यों के लिए हटाए गए प्रत्येक बाधा के लिए एक प्रिंट की अनुमति देता है। निष्पादन मेरी इकाई परीक्षण में थोड़ा तेज़ लग रहा था।

Set NoCount ON

Declare @schemaName varchar(200)
set @schemaName=''
Declare @constraintName varchar(200)
set @constraintName=''
Declare @tableName varchar(200)
set @tableName=''

While exists
(   
    SELECT c.name
    FROM sys.objects AS c
    INNER JOIN sys.tables AS t
    ON c.parent_object_id = t.[object_id]
    INNER JOIN sys.schemas AS s 
    ON t.[schema_id] = s.[schema_id]
    WHERE c.[type] IN ('D','C','F','PK','UQ')
    and t.[name] NOT IN ('__RefactorLog', 'sysdiagrams')
    and c.name > @constraintName
)

Begin   
    -- First get the Constraint
    SELECT 
        @constraintName=min(c.name)
    FROM sys.objects AS c
    INNER JOIN sys.tables AS t
    ON c.parent_object_id = t.[object_id]
    INNER JOIN sys.schemas AS s 
    ON t.[schema_id] = s.[schema_id]
    WHERE c.[type] IN ('D','C','F','PK','UQ')
    and t.[name] NOT IN ('__RefactorLog', 'sysdiagrams')
    and c.name > @constraintName

    -- Then select the Table and Schema associated to the current constraint
    SELECT 
        @tableName = t.name,
        @schemaName = s.name
    FROM sys.objects AS c
    INNER JOIN sys.tables AS t
    ON c.parent_object_id = t.[object_id]
    INNER JOIN sys.schemas AS s 
    ON t.[schema_id] = s.[schema_id]
    WHERE c.name = @constraintName

    -- Then Print to the output and drop the constraint
    Print 'Dropping constraint ' + @constraintName + '...'
    Exec('ALTER TABLE [' + @schemaName + N'].[' + @tableName + N'] DROP CONSTRAINT [' + @constraintName + ']')
End

Set NoCount OFF
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.