Подтвердить что ты не робот

Почему SQL Server продолжает создавать ограничение DF?

Я пытаюсь создать сценарии обновления и резервного копирования в SQL. Обновление script добавляет такой столбец:

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) 

Резервная копия script удаляет столбец так:

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

ALTER TABLE TableName
    DROP COLUMN ColumnName

Однако резервная копия script вызывает эту ошибку:

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.

Я знаю, как удалить ограничение, но имя ограничения меняется каждый раз (суффикс изменяется). Мне либо нужен SQL Server, чтобы прекратить создавать это случайное имя, либо мне нужно удалить ограничение в моем script, используя символы wild-card, так как имя изменяется.

4b9b3361

Ответ 1

Это ограничение 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

Запустите это:

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

Ответ 3

Запустите это, если вы хотите удалить ограничение:

DECLARE @tableName NVARCHAR(255) = '[INSERT]';
DECLARE @first5CharsFromColumnName NVARCHAR(255) = '[INSERT]';
DECLARE @name NVARCHAR(255);
SELECT @name = d.name FROM dbo.sysobjects d
INNER JOIN dbo.sysobjects t ON t.id = d.parent_obj
WHERE d.name LIKE '%'[email protected]+'%' AND d.type = 'D' AND t.name = @tableName

IF @name IS NOT NULL BEGIN
    EXEC('ALTER TABLE '[email protected]+' DROP CONSTRAINT ' + @name);
END