2011-10-05 13 views
28

Sto cercando di creare script di aggiornamento e backout in SQL. Lo script di aggiornamento aggiunge una colonna in questo modo:Perché SQL Server continua a creare un vincolo DF?

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) 

Lo script backout rimuove la colonna in questo modo:

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

ALTER TABLE TableName 
    DROP COLUMN ColumnName 

Tuttavia, lo script backout getta questo errore:

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. 

lo so come eliminare il vincolo, ma il nome del vincolo cambia ogni volta (il suffisso cambia). Ho bisogno che SQL Server interrompa la creazione di questo vincolo con nomi casuali O devo essere in grado di rimuovere il vincolo nel mio script utilizzando caratteri jolly, poiché il nome cambia.

risposta

58

Questo è il vincolo default aggiunto a causa dello DEFAULT(0) nella colonna appena aggiunta.

È possibile denominare questo voi stessi in modo che abbia un nome fisso noto piuttosto che fare affidamento sulla generazione automatica nome.

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

poi per rimuovere la colonna e vincolo insieme

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

+1 si raccomanda di solito di nominare esplicitamente vincoli. –

+0

Grazie Martin. Inoltre, per verificare correttamente se il vincolo esistente (prima cadere), ho usato il metodo descritto ** [qui] (http://stackoverflow.com/questions/2499332/how-to-check-if-a-constraint- esiste-in-sql server/6839547 # 6839547) ** – WEFX

+0

@ ÁlvaroG.Vicario - sì. La risposta di Martin ti offre un esempio. –

0

Esegui questo:

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 
Problemi correlati