我们有许多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的名称,所以我可以改变。
请不要讲授克隆,复制或为什么我们做错了。 我们以这种方式做了多个数据库,并出于内部原因自我引用。
答案 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)
或强>
或强>
将更改更改为 - 未经测试
禁用:
ALTER TABLE <yourtable_Name> NOCHECK CONSTRAINT <yourconstraint_Name>
启用:
ALTER TABLE <yourtable_Name> CHECK CONSTRAINT <yourconstraint_Name>