sql - unico - restricción de tipo check
¿Por qué SQL Server sigue creando una restricción de DF? (2)
Estoy tratando de crear scripts de actualización y retroceso en SQL. El script de actualización agrega una columna como esta:
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)
El script de retroceso elimina la columna de esta manera:
IF EXISTS (SELECT * FROM sys.columns WHERE Name = N''ColumnName''
AND object_id = OBJECT_ID(N''[dbo].[TableName]''))
ALTER TABLE TableName
DROP COLUMN ColumnName
Sin embargo, la secuencia de comandos de retroceso produce este error:
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.
Sé cómo eliminar la restricción, pero el nombre de la restricción cambia cada vez (el sufijo cambia). O bien necesito que SQL Server deje de crear esta restricción aleatoria de nombre O necesito poder eliminar la restricción en mi script usando caracteres comodín, ya que el nombre cambia.
Ejecuta esto:
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
Esta es la restricción default
que se agrega debido a la DEFAULT(0)
en la columna que acaba de agregar.
Puede nombrarlo usted mismo para que tenga un nombre fijo conocido en lugar de confiar en la generación automática de nombres.
ALTER TABLE TableName
ADD ColumnName bit NOT NULL CONSTRAINT DF_Some_Fixed_Name DEFAULT(0)
A continuación, para eliminar la columna y la restricción juntos
ALTER TABLE dbo.TableName
DROP CONSTRAINT DF_Some_Fixed_Name, COLUMN ColumnName