2010-06-08 11 views
9

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

यह SQL Server 2000 और बाद में है। 2000/2005/2008 को काम करने वाला कुछ सबसे अच्छा होगा!

उत्तर

5

यह स्क्रिप्ट ALTER TABLE..... DROP CONSTRAINT.... की एक सूची उत्पन्न होगा आदेशों, जो है तो उन्हें कॉपी कर सकते हैं + पेस्ट और निष्पादित (या क्रियान्वित करने की जरूरत से पहले tweak) सभी अद्वितीय की कमी/अद्वितीय सूचकांक ड्रॉप करने:

SELECT 
    'ALTER TABLE ' + OBJECT_NAME(so.parent_obj) + ' DROP CONSTRAINT ' + so.name 
FROM sysobjects so 
WHERE so.xtype = 'UQ' 

मुझे आशा है कि यह 2000 से 2008 तक सभी एसक्यूएल सर्वर संस्करण पर काम करना चाहिए आर 2।

+0

यह बहुत करीब है, लेकिन मुझे कॉलम के नाम से फ़िल्टर करने की अनुमति नहीं देता है जहां बाधा लागू होती है। मैं क्वेरी को ट्विक करने का प्रयास करने में कुछ समय बिताऊंगा, धन्यवाद! – Bill

+1

दरअसल, उन लोगों के अलावा बहुत कम बाधाएं हैं जिन्हें मैं छोड़ना चाहता हूं। मैं बस उन सभी को छोड़ने के लिए इसका उपयोग करने जा रहा हूं और मुझे जो कुछ चाहिए उसे दोबारा बनाने के लिए। आपका बहुत बहुत धन्यवाद! – Bill

+0

sysobjects तालिका –

0

This page डेटाबेस में सभी CONSTRAINT रों बाहर निकलने के लिए एक त्वरित और गंदा तरीका है, और वहाँ से आप उन्हें ड्रॉप करने गतिशील एसक्यूएल का निर्माण कर सकते हैं:

SELECT OBJECT_NAME(OBJECT_ID) AS NameofConstraint, 
SCHEMA_NAME(schema_id) AS SchemaName, 
OBJECT_NAME(parent_object_id) AS TableName, 
type_desc AS ConstraintType 
FROM sys.objects 
WHERE type_desc LIKE '%CONSTRAINT'; 
+0

"sys.objects" केवल 2005 और ऊपर काम करेगा ..... –

2

यह ऐसा लगता है कि यह मेरे जैसा काम करता है, मुझे लगता है कि यह मेरे लिए काम करता है - मुझे विश्वास है कि यह केवल SQL Server 2005 या ऊपर काम करेगा। यहाँ पूर्ण परिदृश्य है:

CREATE TABLE table_name (
    id bigint identity not null, 
    column_name varchar(255) not null, 
    primary key(id), 
    unique (column_name) 
); 

कुछ समय बाद, यह पता चलता है कि इस अनूठी बाधा भी आवश्यक न हो:

टेबल एक स्तंभ पर एक अद्वितीय बाधा, पूर्व के साथ बनाया गया है।

INSERT INTO table_name(column_name) VALUES('col1'); 

परिणामों में: अद्वितीय कुंजी शर्त 'UQ__table_na__9FA0BA59160F4887' का उल्लंघन। ऑब्जेक्ट 'dbo.table_name' में डुप्लिकेट कुंजी सम्मिलित नहीं कर सकता।

आप इस डाटाबेस के मैनुअल नियंत्रण है और एसक्यूएल चल सकते हैं सीधे पर यह संभव है, बस कार्य करें:

ALTER TABLE table_name DROP CONSTRAINT UQ__table_na__9FA0BA59160F4887; 

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

DECLARE @table_name nvarchar(256) 
DECLARE @col_name nvarchar(256) 
DECLARE @Command nvarchar(1000) 

-- set your table and column name here: 
SET @table_name = N'table_name' 
SET @col_name = N'column_name' 

SELECT @Command = 'ALTER TABLE ' + @table_name + ' DROP CONSTRAINT ' + d.name 
    FROM sys.tables t 
    JOIN sys.indexes d ON d.object_id = t.object_id AND d.type=2 and d.is_unique=1 
    JOIN sys.index_columns ic on d.index_id=ic.index_id and ic.object_id=t.object_id 
    JOIN sys.columns c on ic.column_id = c.column_id and c.object_id=t.object_id 
    WHERE t.name = @table_name and [email protected]_name 

--if you want to preview the generated command before running 
SELECT @Command 

EXEC sp_executesql @Command; 

जो कॉलम पर अद्वितीय बाधा को हटा देता है और डालने की अनुमति देता है।

+0

के लिए नया होना चाहिए कि आखिरी बिट सही है, धन्यवाद! –

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

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