ALTER TABLE DROP COLUMN не удалось, так как один или несколько объектов попадают в этот столбец

Я пытаюсь сделать это:

ALTER TABLE CompanyTransactions DROP COLUMN Created

Но я получаю это:

Msg 5074, уровень 16, состояние 1, строка 2 Объект "DF__CompanyTr__Creat__0CDAE408" зависит от столбца "Создано". Msg 4922, уровень 16, состояние 9, строка 2 ALTER TABLE DROP COLUMN Создан неудачно, потому что один или несколько объектов обращаются к этому столбцу.

Это первая таблица кода. Как-то миграции перепутались, и я пытаюсь вручную отменить некоторые измененные.

Я понятия не имею, что это такое:

DF__CompanyTr__Creat__0CDAE408

Ответ 1

Вы должны удалить constraints из столбца перед удалением столбца. Имя, на которое вы ссылаетесь, - default constraint.

например.

alter table CompanyTransactions drop constraint [df__CompanyTr__Creat__0cdae408];
alter table CompanyTransactions drop column [Created];

Ответ 2

Ответ @SqlZim верен, но только для того, чтобы объяснить, почему это произошло. У меня была аналогичная проблема, и это было вызвано очень невинной вещью: добавление значения по умолчанию в столбец

ALTER TABLE MySchema.MyTable ADD 
  MyColumn int DEFAULT NULL;

Но в области MS SQL Server значением по умолчанию для colum является CONSTRAINT. И, как и каждое ограничение, он имеет идентификатор. И вы не можете удалить столбец, если он используется в CONSTRAINT.

Так что вы действительно можете избежать подобных проблем, всегда указывать ограничения по умолчанию явное имя, например:

ALTER TABLE MySchema.MyTable ADD 
  MyColumn int NULL,
  CONSTRAINT DF_MyTable_MyColumn DEFAULT NULL FOR MyColumn;

Вам все равно придется отказаться от ограничения, прежде чем отбрасывать столбец, но вы по крайней мере знаете его имя спереди.

Ответ 3

Как уже написано в ответах, вам нужно удалить ограничения (созданные автоматически sql), относящиеся ко всем столбцам, которые вы пытаетесь удалить.

Выполните следующие шаги, чтобы сделать все необходимое.

  1. Получить имя всех ограничений, используя sp_helpconstraint, которая является системной утилитой хранимой процедуры - выполнить после exec sp_helpconstraint '<your table name>'
  2. Как только вы получите имя ограничения, скопируйте это имя ограничения и выполните следующую инструкцию, т. alter table <your_table_name> drop constraint <constraint_name_that_you_copied_in_1> (это будет что-то вроде этого только или подобный формат)
  3. После того как вы удалите ограничение, вы можете удалить 1 или более столбцов, используя обычный метод, т. Alter table <YourTableName> Drop column column1, column2 т.д.

Ответ 4

Вам нужно сделать несколько вещей:

  1. Сначала вам нужно проверить, выходит ли ограничение в информационной схеме
  2. тогда вам нужно сделать запрос, соединив sys.default_constraints и sys.columns если столбцы и default_constraints имеют одинаковые идентификаторы объектов
  3. Когда вы присоединитесь к шагу 2, вы получите имя ограничения из default_constraints. Вы отбрасываете это ограничение. Вот пример одной такой капли, которую я сделал.
-- 1. Remove constraint and drop column
IF EXISTS(SELECT *
          FROM INFORMATION_SCHEMA.COLUMNS
          WHERE TABLE_NAME = N'TABLE_NAME'
            AND COLUMN_NAME = N'LOWER_LIMIT')
   BEGIN
    DECLARE @sql NVARCHAR(MAX)
    WHILE 1=1
        BEGIN
            SELECT TOP 1 @sql = N'alter table [TABLE_NAME] drop constraint ['+dc.name+N']'
            FROM sys.default_constraints dc
            JOIN sys.columns c
            ON c.default_object_id = dc.object_id
            WHERE dc.parent_object_id = OBJECT_ID('[TABLE_NAME]') AND c.name = N'LOWER_LIMIT'
            IF @@ROWCOUNT = 0
                BEGIN
                    PRINT 'DELETED Constraint on column LOWER_LIMIT'
                    BREAK
                END
        EXEC (@sql)
    END;
    ALTER TABLE TABLE_NAME DROP COLUMN LOWER_LIMIT;
    PRINT 'DELETED column LOWER_LIMIT'
   END
ELSE
   PRINT 'Column LOWER_LIMIT does not exist'
GO

Ответ 5

Когда вы изменяете datatype столбца, вам нужно изменить constraint key для каждой базы данных

  alter table CompanyTransactions drop constraint [df__CompanyTr__Creat__0cdae408];