2011-08-23 84 views
6

我喜欢外键,但我遇到了一个问题。我有一个转换程序,我禁用外键到表。我这样做的原因是,我可以重新转换主表中的所有记录,但保留其他表不依赖于那个表,而不必每次重新转换它们,因为它们很大。使用外键检查现有数据

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

ALTER TABLE MyTable的NOCHECK约束MyConstraint

ALTER TABLE MyTable的CHECK约束MyConstraint

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

有没有办法改变这与ALTER TABLE命令?我知道我可以,如果我放弃约束并重新创建它,但我不会编写脚本来重新创建我拥有的每个外键,并保持这一点。

我正在使用SQL Server 2008 R2。

回答

9

要重新启用约束:

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

注意:你必须指定CHECK两次强行检查,所有外键瓦莱斯是有效的。

外键,并检查将被禁用标记 is_not_trusted.These处于sys.check_constraints和 sys.foreign_keys目录视图可见约束。这意味着对于表的所有行,约束不再由系统验证更长的 。即使在 重新启用约束时,除非您指定 ALTER TABLE的WITH CHECK选项,否则它将不会重新验证现有的 行。指定WITH CHECK将该限制再次标记为可信 。

参考:Guidelines for Disabling Indexes and Constraints

正如注释(搜索引擎)所指出的,这对应于

sys.foreign_keys.is_not_trusted

在目录视图

+0

谢谢,你是一个救生员。 –

+1

为了记录,因为我有一段时间在其他地方找到它:“sys.foreign_keys.is_not_trusted”对应于SQL Server Management Studio“外键关系”对话框中的“在创建或重新启用时检查现有数据”。 – leqid