ALTER TABLE DROP COLUMN失败,因为一个或多个对象访问此列

Cas*_*ton 49 c# sql sql-server code-first

我想这样做:

ALTER TABLE CompanyTransactions DROP COLUMN Created
Run Code Online (Sandbox Code Playgroud)

但我明白了:

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

这是代码第一表.不知怎的,迁移已经变得混乱,我试图手动回滚一些变化.

知道这是什么:

DF__CompanyTr__Creat__0CDAE408
Run Code Online (Sandbox Code Playgroud)

Sql*_*Zim 91

在删除constraints列之前,必须从列中删除它.您引用的名称是default constraint.

例如

alter table CompanyTransactions drop constraint [df__CompanyTr__Creat__0cdae408];
alter table CompanyTransactions drop column [Created];
Run Code Online (Sandbox Code Playgroud)

  • 令人沮丧的是,Entity Framework并没有为我们解决这个问题. (11认同)
  • @MantasDaškevičius 最好的选择是命名约束,而不是使用自动生成的名称。 (2认同)

mal*_*c4k 15

@ SqlZim的答案是正确的,但只是为了解释为什么会发生这种情况.我有类似的问题,这是由非常无辜的事情引起的:为列添加默认值

ALTER TABLE MySchema.MyTable ADD 
  MyColumn int DEFAULT NULL;
Run Code Online (Sandbox Code Playgroud)

但在MS SQL Server领域,colum上的默认值是CONSTRAINT.和每个约束一样,它有一个标识符.如果在CONSTRAINT中使用它,则不能删除列.

所以你实际上可以做的就是避免这种问题总是给你的默认约束一个明确的名字,例如:

ALTER TABLE MySchema.MyTable ADD 
  MyColumn int NULL,
  CONSTRAINT DF_MyTable_MyColumn DEFAULT NULL FOR MyColumn;
Run Code Online (Sandbox Code Playgroud)

在删除列之前,您仍然必须删除约束,但您至少会事先知道它的名称.


vib*_*006 9

正如答案中已经写的那样,您需要删除与您尝试删除的所有列相关的约束(由 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. 删除约束后,您可以使用传统方法即Alter table <YourTableName> Drop column column1, column2等删除 1 个或多个列


Aka*_*ppa 7

您需要做几件事:

  1. 您首先需要检查信息模式中是否存在约束
  2. 那么你需要通过连接 sys.default_constraints 和 sys.columns 来查询列和 default_constraints 是否具有相同的对象 id
  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
Run Code Online (Sandbox Code Playgroud)


小智 5

当您更改列时,datatype您需要constraint key为每个数据库进行更改

  alter table CompanyTransactions drop constraint [df__CompanyTr__Creat__0cdae408];
Run Code Online (Sandbox Code Playgroud)