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

问题描述 投票:0回答:12

我正在尝试这样做:

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
    
c# sql sql-server code-first
12个回答
210
投票
在移除色谱柱之前,您必须先从色谱柱上移除

constraints

。您引用的名称是 
default constraint

例如

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

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

ALTER TABLE MySchema.MyTable ADD MyColumn int DEFAULT NULL;

但在 MS SQL Server 领域,列上的默认值是 CONSTRAINT。与每个约束一样,它也有一个标识符。如果列在 CONSTRAINT 中使用,则无法删除该列。

因此,您实际上可以避免此类问题的方法是始终为默认约束指定一个

显式名称,例如:

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

您仍然需要在删除列之前删除约束,但您将

至少预先知道它的名称


11
投票
正如答案中已经写的那样,您需要删除与您尝试删除的所有列相关的约束(由 sql 自动创建)。

执行以下步骤来执行必要的操作。

    使用系统存储过程实用程序
  1. sp_helpconstraint获取所有约束的名称 - 执行以下操作exec sp_helpconstraint '<your table name>'
    
    
  2. 一旦获得约束的名称,然后复制该约束名称并执行下一条语句,即
  3. alter table <your_table_name> drop constraint <constraint_name_that_you_copied_in_1>
    (它将仅是这样或类似的格式)
  4. 一旦删除约束,您就可以使用传统方法删除 1 列或多列,即
  5. Alter table <YourTableName> Drop column column1, column2

7
投票
当您更改列

datatype

 时,您需要为每个数据库更改 
constraint key
 

alter table CompanyTransactions drop constraint [df__CompanyTr__Creat__0cdae408];
    

7
投票
您需要做几件事:

    首先需要检查信息模式中是否存在约束
  1. 然后需要通过加入sys.default_constraints和sys.columns来查询 如果列和 default_constraints 具有相同的对象 ID
  2. 当您在步骤 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
    

4
投票
除了接受的答案之外,如果您使用

Entity Migrations 来更新数据库,您应该在迁移文件中的 Up()

 函数的开头添加此行:

Sql("alter table dbo.CompanyTransactions drop constraint [df__CompanyTr__Creat__0cdae408];");
您可以在 nuget 数据包管理器控制台的错误中找到以 

FK_dbo.

 开头的约束名称
    


3
投票
我遇到了同样的问题,这是适合我的脚本,该脚本的表由两部分组成,名称由句点“.”分隔。

使用[数据库名称] 去 更改表 [TableNamePart1].[TableNamePart2] 删除约束 [DF__ TableNamePart1D__ColumnName__5AEE82B9] 去 ALTER TABLE [TableNamePart1].[ TableNamePart1] 删除列 [ColumnName] 去吧


2
投票
我需要用 Guid 替换 INT 主键。经过几次失败的尝试后,下面的 EF 代码对我有用。如果您设置了 defaultValue...您最终会得到一个 Guid,即现有记录的键。

protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.DropUniqueConstraint("PK_Payments", "Payments"); migrationBuilder.DropColumn( name: "PaymentId", table: "Payments"); migrationBuilder.AddColumn<Guid>( name: "PaymentId", table: "Payments", type: "uniqueidentifier", defaultValueSql: "NewId()", nullable: false); }
    

0
投票
从错误消息中复制默认约束名称,并以与要删除的列相同的方式键入它。


0
投票
我遇到了同样的问题,我无法删除迁移,它会显示已应用某些内容的错误,因此我在应用程序设置中更改了我的数据库名称,删除了所有迁移,然后添加了新的迁移,它起作用了。不完全理解问题,但它有效


0
投票
我通过在迁移中添加删除约束来修复。

migrationBuilder.DropForeignKey( name: "FK_XX", table: "TableX").
下面重新创建约束。

migrationBuilder.AddForeignKey( name: "FK_XX", table: "TableX", column: "ColumnX", onDelete: ReferentialAction.Restrict);
    

0
投票
如果您需要查找约束的名称:

SELECT d.name FROM sys.default_constraints d INNER JOIN sys.columns c ON d.parent_column_id = c.column_id WHERE d.parent_object_id = OBJECT_ID(N'HumanResources.Employee', N'U') AND c.name = 'VacationHours';
更改表名称“HumanResources.Employee”和“VacationHours”。

修改自

https://learn.microsoft.com/en-us/previous-versions/sql/sql-server-2005/ms173758(v=sql.90)

© www.soinside.com 2019 - 2024. All rights reserved.