如何按列名删除SQL外部约束

时间:2014-01-03 16:50:51

标签: sql-server tsql foreign-key-relationship sql-drop

我们有许多DB是相同的架构,但FK名称可能不是。 我们做了大量的克隆测试等等。

当我们添加自引用外键时,遇到克隆问题。 我们无法返回并更改所有较旧的数据库,但只需要一种方法来克隆并跳过约束,并在最后重新应用。

// Keeping the columns simplified to just the 2 main ones causing the issue.

Table [Employee]

Columns [EmpId(pk), ManagerId(fk)]

ManagerId --> EmpId

因此,如果克隆尝试使用不存在的managerId插入Employee,则会出现FK错误。

找到几种方法来改变(删除然后添加)或重命名FK,但我需要在锥形应用程序运行时知道FK的名称,所以我可以改变。

请不要讲授克隆,复制或为什么我们做错了。 我们以这种方式做了多个数据库,并出于内部原因自我引用。

1 个答案:

答案 0 :(得分:1)

我想出了什么。

我可以获得FK NAME然后ALTER约束,执行操作,然后重新应用它。

DECLARE @fkname VARCHAR(100)
DECLARE @Command_drop NVARCHAR(1000)
DECLARE @Command_add NVARCHAR(1000)

    --GET THE FK NAME by column Names
    -- thanks to marc_s https://stackoverflow.com/a/3907957/295734
SELECT  @fkname = fk.name
FROM    sys.foreign_keys fk
        INNER JOIN sys.foreign_key_columns fkc ON fkc.constraint_object_id = fk.object_id
        INNER JOIN sys.columns c1 ON fkc.parent_column_id = c1.column_id
                                     AND fkc.parent_object_id = c1.object_id
        INNER JOIN sys.columns c2 ON fkc.referenced_column_id = c2.column_id
                                     AND fkc.referenced_object_id = c2.object_id
WHERE   fkc.parent_object_id = OBJECT_ID(N'dbo.employee')
        AND c1.name = 'manager_employee_id'
        AND c2.name = 'id'

SET @Command_drop = 'ALTER TABLE dbo.Employee DROP CONSTRAINT ' + @fkname
SET @Command_add = 'ALTER TABLE dbo.Employee ADD CONSTRAINT ' + @fkname
    + ' FOREIGN KEY (manager_employee_id) REFERENCES Employee(id)'
    -- DROP the constraint
EXEC (@Command_drop)
    -- DO SOME OPERATION HERE --
    -- Re ADD the constraint
EXEC (@Command_add)

Disable All Foreign Keys

将更改更改为 - 未经测试

禁用:

ALTER TABLE <yourtable_Name> NOCHECK CONSTRAINT <yourconstraint_Name>

启用:

ALTER TABLE <yourtable_Name> CHECK CONSTRAINT <yourconstraint_Name>