Jef*_*ock 8 t-sql sql-server sql-server-2008
我喜欢外键,但我遇到了一个问题.我有一个转换程序,我禁用表的外键.我这样做的原因是我可以重新转换主表中的所有记录,但是让其他表依赖于那些未触及的表而不必每次都重新转换它们因为它们是巨大的.
我正在使用这些命令来禁用和重新启用外键:
ALTER TABLE MyTable NOCHECK CONSTRAINT MyConstraint
ALTER TABLE MyTable CHECK CONSTRAINT MyConstraint
Run Code Online (Sandbox Code Playgroud)
但是,在我重新启用约束"检查创建或重新启用时的现有数据"仍然设置为否.我知道它被设置为否因为我禁用了约束,但是通过这样做它改变了我的数据库模式,我不喜欢.我认为这将被视为重新启用约束并将检查现有数据,但显然不是.
有没有办法用ALTER TABLE命令改变它?我知道如果我删除约束并重新创建它,我就可以了,但我不打算编写脚本来重新创建我拥有的每个外键并保持它.
我正在使用SQL Server 2008 R2.
Mit*_*eat 12
要重新启用约束:
-- Enable the constraint
ALTER TABLE MyTable
WITH CHECK CHECK CONSTRAINT MyConstraint
GO
Run Code Online (Sandbox Code Playgroud)
注意:您必须指定CHECK
两次以强制检查所有外键值是否有效.
禁用的FOREIGN KEY和CHECK约束标记为is_not_trusted.可以在sys.check_constraints和sys.foreign_keys目录视图中查看这些约束.这意味着系统不再为表的所有行验证约束.即使重新启用约束,它也不会针对表重新验证现有行,除非您指定ALTER TABLE的WITH CHECK选项.指定WITH CHECK会再次将约束标记为受信任.
参考: 禁用索引和约束的指南
正如评论中所述(对于搜索引擎),这对应于
sys.foreign_keys.is_not_trusted
在目录视图中