如何使用T-SQL暂时禁用外键约束?

时间:2020-03-06 14:59:28  来源:igfitidea点击:

SQL Server是否支持禁用和启用外键约束?还是我唯一的选择是先删除然后重新创建约束?

解决方案

http://www.sqljunkies.com/WebLog/roman/archive/2005/01/30/7037.aspx

-- Disable all table constraints

ALTER TABLE MyTable NOCHECK CONSTRAINT ALL

-- Enable all table constraints

ALTER TABLE MyTable WITH CHECK CHECK CONSTRAINT ALL

-- Disable single constraint

ALTER TABLE MyTable NOCHECK CONSTRAINT MyConstraint

-- Enable single constraint

ALTER TABLE MyTable WITH CHECK CHECK CONSTRAINT MyConstraint

如果要禁用数据库中的所有约束,请运行以下代码:

-- disable all constraints
EXEC sp_MSforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

要重新打开它们,请运行:(当然,打印是可选的,它只是列出表)

-- enable all constraints
exec sp_MSforeachtable @command1="print '?'", @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"

在将数据从一个数据库填充到另一个数据库时,我发现它很有用。这比放弃约束要好得多。正如我们提到的,在删除数据库中的所有数据并重新填充它们时(例如在测试环境中),它很方便。

如果要删除所有数据,则可能会发现此解决方案很有帮助。

有时也很方便地禁用所有触发器,我们可以在此处查看完整的解决方案。

SQL-92标准允许将约束声明为DEFERRABLE,以便可以在事务范围内将其隐式(隐式或者显式)进行延迟。可悲的是,SQL Server仍然缺少此SQL-92功能。

对我而言,将约束更改为NOCHECK类似于即时更改数据库结构-确实删除了约束-并且需要避免某些事情(例如,用户需要增加的特权)。