2017-04-21 1184 views
13

我试图做到这一点:ALTER TABLE DROP COLUMN失败,因为一个或多个对象访问此列

ALTER TABLE CompanyTransactions DROP COLUMN Created 

但我得到这个:

消息5074,级别16,状态1,第2行 对象'DF__CompanyTr__Creat__0CDAE408'依赖于'Created'列。 消息4922,级别16,状态9,行2 ALTER TABLE DROP COLUMN创建失败,因为一个或多个对象访问此列。

这是代码第一个表。不知怎的,迁移已经全部搞砸了,我正在尝试手动回滚一些已更改的内容。

没有知道这是什么:

DF__CompanyTr__Creat__0CDAE408 

回答

24

您必须在删除列之前从列constraints。您引用的名称是default constraint

例如

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

令人沮丧的是Entity Framework没有为我们处理这个问题。 – chakeda

+0

@ chakeda我同意 – SqlZim

2

@ SqlZim的答案是正确的,只是为了解释为什么可能发生这种情况。我有类似的问题,这是由很无辜的事情引起的:将默认值列

ALTER TABLE MySchema.MyTable ADD 
    MyColumn int DEFAULT NULL; 

但在MS SQL服务器的境界上科拉姆的默认值是一种约束。像每个约束都有一个标识符。如果它在CONSTRAINT中使用,则不能删除列。

那么你实际上可以做避免这种问题总是给你的默认约束明确的名称,例如:

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

你仍然有下探的列之前删除约束,但你至少会知道它的名字

相关问题