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

时间:2017-04-21 18:11:29

标签: c# sql sql-server code-first

我正在尝试这样做:

ALTER TABLE CompanyTransactions DROP COLUMN Created

但我明白了:

  

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

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

没有知道这是什么:

DF__CompanyTr__Creat__0CDAE408

8 个答案:

答案 0 :(得分:71)

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

e.g。

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

答案 1 :(得分:13)

@ 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;

在删除列之前,您仍然必须放弃约束,但是至少会先知道其名称

答案 2 :(得分:3)

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

答案 3 :(得分:2)

除了可接受的答案,如果您使用实体迁移来更新数据库,则应在迁移文件中Up()函数的开头添加以下行:

Sql("alter table dbo.CompanyTransactions drop constraint [df__CompanyTr__Creat__0cdae408];");

您可以在以FK_dbo.开头的nuget数据包管理器控制台的错误中找到约束名称。

答案 4 :(得分:1)

您需要做一些事情:

  1. 您首先需要检查约束是否在信息模式中退出
  2. 然后您需要通过加入sys.default_constraints和sys.columns进行查询 如果列和default_constraints具有相同的对象ID
  3. 在第2步中加入时,将从default_constraints获得约束名称。您删除该约束。这是我做过的一滴这样的例子。
for filename in os.listdir(config.Total2):
    if filename.endswith(".pdf"):
        First_Name, Last_Name, Zip = filename.replace(".pdf",'').split()
        Name = First_Name + " " + Last_Name

        print(Name)
        print(Zip)

        matches2 = df2[df['Member Name'].str.contains(Name) & df2['Member Address Line 3'].str.contains(Zip)]

        if len(matches2) == 1:
            row_index = matches2.iloc[0]['ID']
            print("Match Found in DF2")
            print(row_index)

            # MemberID = df2.loc[row_index, 'ID']
            MemberI = str(row_index)

            os.rename(config.Total2+filename, config.ID+MemberI+'.pdf')
        else: 
            print("Match not Found in DF2")
            # os.rename(config.Total+filename, config.ManualCheck+filename+'.pdf')
            matches1 = df[df['Member Name'].str.contains(Name) & df['Member Address Line 3'].str.contains(Zip)]

            if len(matches1) == 1:
                row_index = matches1.iloc[0]['ID']
                print("Match Found in DF1")
                print(row_index)

                # MemberID = df.loc[row_index, 'ID']
                MemberI = str(row_index)

                os.rename(config.Total2+filename, config.ID+MemberI+'.pdf')
            else:
                print("Match not Found in DF1")
                # print("No Match Found in DF1, Search Df2")

答案 5 :(得分:1)

我遇到了同样的问题,这是一个对我有用的脚本,它的表名由两部分组成,中间用句号“。”隔开。

使用[数据库名称] 走 ALTER TABLE [TableNamePart1]。[TableNamePart2]删除约束[DF__ TableNamePart1D__ColumnName__5AEE82B9] 走 ALTER TABLE [TableNamePart1]。[TableNamePart1] DROP COLUMN [ColumnName] 开始

答案 6 :(得分:1)

我需要用 Guid 替换 INT 主键。经过几次失败的尝试后,下面的 EF 代码对我有用。如果你 hyst 设置了 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);
}

答案 7 :(得分:0)

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

  alter table CompanyTransactions drop constraint [df__CompanyTr__Creat__0cdae408];