Почему SQL Server продолжает создавать ограничение DF? - PullRequest
38 голосов
/ 05 октября 2011

Я пытаюсь создать сценарии обновления и возврата в 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) 

Сценарий возврата удаляет столбец следующим образом:

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

ALTER TABLE TableName
    DROP COLUMN ColumnName

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

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, чтобы прекратить создавать это ограничение с произвольным именем, ИЛИ мне нужно иметь возможность удалить ограничение в моем скрипте, используя символы подстановки, так как имя меняется.

Ответы [ 2 ]

72 голосов
/ 05 октября 2011

Это ограничение 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
3 голосов
/ 10 ноября 2017

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...