2011-10-05 12 views
28

मैं एसक्यूएल में अपग्रेड और बैकआउट स्क्रिप्ट बनाने की कोशिश कर रहा हूं।SQL सर्वर एक डीएफ बाधा क्यों बना रहा है?

IF NOT EXISTS (SELECT * FROM sys.columns WHERE Name = N'ColumnName' 
    AND object_id = OBJECT_ID(N'[dbo].[TableName]')) 

ALTER TABLE TableName 
    ADD ColumnName bit NOT NULL DEFAULT(0) 

backout स्क्रिप्ट इतनी तरह स्तंभ निकालता है:: उन्नयन स्क्रिप्ट इतनी तरह एक कॉलम जोड़ने पर

Msg 5074, Level 16, State 1, Line 5 
    The object 'DF__TableName__ColumnName__1BF3D5BD' is dependent on column 'ColumnName'. 
Msg 4922, Level 16, State 9, Line 5 
    ALTER TABLE DROP COLUMN ColumnName failed because one or more objects access this column. 

मुझे पता है:

IF EXISTS (SELECT * FROM sys.columns WHERE Name = N'ColumnName' 
    AND object_id = OBJECT_ID(N'[dbo].[TableName]')) 

ALTER TABLE TableName 
    DROP COLUMN ColumnName 

हालांकि, backout स्क्रिप्ट इस त्रुटि फेंकता बाधा को कैसे छोड़ें, लेकिन बाधा का नाम हर बार बदलता है (प्रत्यय परिवर्तन)। मुझे या तो यादृच्छिक रूप से नामित बाधा उत्पन्न करने के लिए SQL सर्वर की आवश्यकता है या नाम बदलने के बाद, मुझे जंगली-कार्ड वर्णों का उपयोग करके मेरी स्क्रिप्ट में बाधा को दूर करने में सक्षम होना चाहिए।

उत्तर

58

यह default बाधा है जो आपके नए जोड़े गए कॉलम में DEFAULT(0) के कारण जोड़ा गया है।

आप इसे स्वयं नाम दे सकते हैं ताकि ऑटो नाम पीढ़ी पर निर्भर होने के बजाय इसका एक ज्ञात निश्चित नाम हो।

ALTER TABLE TableName 
    ADD ColumnName bit NOT NULL CONSTRAINT DF_Some_Fixed_Name DEFAULT(0) 

फिर कॉलम हटाकर एक साथ में रोके

ALTER TABLE dbo.TableName 
DROP CONSTRAINT DF_Some_Fixed_Name, COLUMN ColumnName 
+2

+1 यह आम तौर पर स्पष्ट रूप से कमी नाम के लिए सिफारिश की है। –

+0

धन्यवाद मार्टिन। साथ ही, यह जांचने के लिए कि क्या बाधा मौजूद है (इसे छोड़ने से पहले), मैंने वर्णित विधि का उपयोग किया ** [यहां] (http://stackoverflow.com/questions/2499332/how-to-check-if-a-constraint- मौजूद-इन-एसक्यूएल-सर्वर/6839547 # 6839547) ** – WEFX

+0

@ अलवारो। वीकरियो - हाँ। मार्टिन का जवाब आपको एक उदाहरण देता है। –

0

भागो यह करने के लिए:

declare @name as nvarchar(255); 
SELECT @name = name FROM dbo.sysobjects 
WHERE name like 'DF__XXX__YYY__%' and type = 'D' 

IF @name is not null BEGIN 
    EXEC('ALTER TABLE XXX] DROP CONSTRAINT ' + @name); 
END 
संबंधित मुद्दे