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), относящиеся ко всем столбцам, которые вы пытаетесь удалить.
Выполните следующие шаги, чтобы сделать все необходимое.
- Получить имя всех ограничений, используя sp_helpconstraint, которая является системной утилитой хранимой процедуры - выполнить после
exec sp_helpconstraint '<your table name>'
- Как только вы получите имя ограничения, скопируйте это имя ограничения и выполните следующую инструкцию, т.
alter table <your_table_name> drop constraint <constraint_name_that_you_copied_in_1>
(это будет что-то вроде этого только или подобный формат) - После того как вы удалите ограничение, вы можете удалить 1 или более столбцов, используя обычный метод, т.
Alter table <YourTableName> Drop column column1, column2
т.д.
Ответ 4
Вам нужно сделать несколько вещей:
- Сначала вам нужно проверить, выходит ли ограничение в информационной схеме
- тогда вам нужно сделать запрос, соединив sys.default_constraints и sys.columns
если столбцы и default_constraints имеют одинаковые идентификаторы объектов
- Когда вы присоединитесь к шагу 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];