暂时关闭约束(MS SQL)

Mac*_*iej 202 sql sql-server entity-relationship sql-server-2005 constraints

我正在寻找一种暂时关闭所有数据库约束(例如表关系)的方法.

我需要将一个DB的表复制(使用INSERT)到另一个DB.我知道我可以通过以正确的顺序执行命令(不破坏关系)来实现这一点.

但是如果我可以暂时关闭检查约束并在操作完成后重新打开它会更容易.

这可能吗?

Don*_*nal 217

-- Disable the constraints on a table called tableName:
ALTER TABLE tableName NOCHECK CONSTRAINT ALL

-- Re-enable the constraints on a table called tableName:
ALTER TABLE tableName WITH CHECK CHECK CONSTRAINT ALL
---------------------------------------------------------

-- Disable constraints for all tables:
EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'

-- Re-enable constraints for all tables:
EXEC sp_msforeachtable 'ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all'
---------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

  • 这应该被标记为正确的答案,因为它完全回答了这个问题.不仅如此,@ Donal包含了一个对我很有帮助的通配符版本. (3认同)
  • 使用带引号的标识符我相信ANSI标准设置,这意味着你不应该将它们用于字符串.与保持一致无关.请参阅http://stackoverflow.com/questions/1992314/what-is-the-difference-between-single-and-double-quotes-in-sql (2认同)
  • 感谢您的程序!顺便说一句,它的正确大小写是“sp_MSforeachtable”(MS 大写)。谢谢! (2认同)
  • 感谢您的重新启用位。特别是许多人忘记的双重“检查”! (2认同)

gbn*_*gbn 212

只能在SQL 2005+中禁用FK和CHECK约束.请参见ALTER TABLE

ALTER TABLE foo NOCHECK CONSTRAINT ALL
Run Code Online (Sandbox Code Playgroud)

要么

ALTER TABLE foo NOCHECK CONSTRAINT CK_foo_column
Run Code Online (Sandbox Code Playgroud)

无法禁用主键和唯一约束,但如果我理解正确,这应该没问题.

  • 但这不是暂时的. (6认同)

Mic*_*ell 57

并且,如果你想验证你没有破坏你的关系并引入孤儿,一旦你重新装备你的支票,即

ALTER TABLE foo CHECK CONSTRAINT ALL
Run Code Online (Sandbox Code Playgroud)

要么

ALTER TABLE foo CHECK CONSTRAINT FK_something
Run Code Online (Sandbox Code Playgroud)

然后你可以重新运行并对任何选中的列进行更新,如下所示:

UPDATE myUpdatedTable SET someCol = someCol, fkCol = fkCol, etc = etc
Run Code Online (Sandbox Code Playgroud)

此时的任何错误都将归因于未能满足约束条件.

  • 更好的方法是ALTER TABLE FOO with CHECK CHECK CONSTRAINT FK_something (11认同)
  • ALTER TABLE foo CHECK CONSTRAINT ALL 或 ALTER TABLE foo CHECK CONSTRAINT FK_something 将启用约束但不检查数据,这意味着该约束将不受信任(is_no_trusted = 1,is_disabled = 0)。 (2认同)

kri*_*tof 16

实际上,您可以在单个SQL命令中禁用所有数据库约束,并重新启用它们调用另一个命令.看到:

我目前正在使用SQL Server 2005,但我几乎可以肯定这种方法也适用于SQL 2000