简体   繁体   English

删除一个 SQL Table Column give Constraint dependency error

[英]Delete a SQL Table Column give Constraint dependency error

I try to drop a column in SQL but I am getting this error:我尝试在 SQL 中删除一列,但出现此错误:

The object 'DF__...'is dependent on column ... 

I found a lot of solutions that need to drop the Constraint first, so I ran this and worked:我发现很多解决方案都需要先删除约束,所以我运行了这个并开始工作:

ALTER TABLE [dbo].[Configuration] DROP CONSTRAINT DF__SiteConfi__Na__2DFCAC08;
ALTER TABLE [dbo].[Configuration] DROP COLUMN NaFlag;

But I need this script to run on any server, so I don't want to mention the Constraint name as it may be different on any other servers.但我需要这个脚本在任何服务器上运行,所以我不想提及约束名称,因为它在任何其他服务器上可能不同。 What is the best solution?什么是最好的解决方案?

You can use some dynamic SQL to drop the default.您可以使用一些动态 SQL 来删除默认值。 If it's an isolated script to just drop the column, then it's easier, something like:如果它是一个单独的脚本来删除列,那么它更容易,比如:

DECLARE @sqlDF NVARCHAR(MAX);
SELECT @sqlDF = 'ALTER TABLE {$tableName} DROP CONSTRAINT ' + QUOTENAME(OBJECT_NAME([default_object_id])) + ';'
FROM sys.columns
WHERE [object_id] = OBJECT_ID('{$tableName}') AND [name] in ({$columns}) AND [default_object_id] <> 0;

IF @sqlDF IS NOT NULL
    EXEC(@sqlDF);

If you are working with a migrations tool, maybe you're gonna have to refactor this, so it doesn't try to redeclare the @sqlDF variable.如果您正在使用迁移工具,也许您将不得不重构它,因此它不会尝试重新声明@sqlDF变量。

Here's a query to get you started:这是一个帮助您入门的查询:

with q as
(
    select schema_name(t.schema_id) schema_name,
           t.name table_name,
           c.name column_name,
           d.name default_name
    from sys.tables t
    join sys.columns c
      on t.object_id = c.object_id
    join sys.default_constraints d
      on d.parent_object_id = t.object_id
     and d.parent_column_id = c.column_id
 )
select concat(
        'alter table ',
        quotename(schema_name),'.',quotename(table_name),
        ' drop constraint ', quotename(default_name) ) sql
from q

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM