使用检查现有数据启用外键

时间:2011-08-23 14:52:39

标签: sql-server tsql sql-server-2008

我喜欢外键,但我遇到了一个问题。我有一个转换程序,我禁用表的外键。我这样做的原因是我可以重新转换主表中的所有记录,但是让其他表依赖于那些不受影响的表,而不必每次都重新转换它们,因为它们是巨大的。

我正在使用这些命令来禁用和重新启用外键:

ALTER TABLE MyTable NOCHECK CONSTRAINT MyConstraint

ALTER TABLE MyTable CHECK CONSTRAINT MyConstraint

然而,在我重新启用约束“检查创建或重新启用时的现有数据”仍然设置为否。我明白它被设置为否因为我禁用了约束,但是通过这样做它改变了我的数据库架构,我不喜欢。我认为这将被视为重新启用约束并将检查现有数据,但显然不是。

使用ALTER TABLE命令无法更改此设置吗?我知道如果我删除约束并重新创建它,我就可以了,但我不打算编写脚本来重新创建我拥有的每个外键并保持它。

我正在使用SQL Server 2008 R2。

1 个答案:

答案 0 :(得分:12)

重新启用约束:

 -- Enable the constraint
 ALTER TABLE MyTable 
 WITH CHECK CHECK CONSTRAINT MyConstraint
 GO

注意:您必须指定CHECK两次以强制检查所有外键值是否有效。

  

标记了禁用的FOREIGN KEY和CHECK约束   is_not_trusted。可以在sys.check_constraints中查看   sys.foreign_keys目录视图。这意味着约束是否定的   系统对表的所有行进行更长时间的验证。甚至   当您重新启用约束时,它将不会重新验证现有约束   除非您指定WITH CHECK选项,否则对着表的行   更改表。指定WITH CHECK会将约束标记为受信任   试。

参考:Guidelines for Disabling Indexes and Constraints

如评论中所述(对于搜索引擎),这对应于

  

sys.foreign_keys.is_not_trusted

目录视图中的