如何使用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类似于即时更改数据库结构-确实删除了约束-并且需要避免某些事情(例如,用户需要增加的特权)。