生成的脚本中的SQL Server Check / NoCheck差异

时间:2009-08-26 22:49:26

标签: sql-server sql-server-2005

我正在尝试将模式同步到不同的数据库。基本上,我在两个数据库上运行任务 - >使用SQL Server Management Studio(2005)生成脚本,并将输出与diff工具进行比较。

出于某种原因,一个脚本添加约束 WITH CHECK 和一个 WITH NO CHECK ,然后重新启用这两个约束。

我是第一个获得的数据库:

ALTER TABLE [dbo].[Profile]  WITH CHECK ADD  CONSTRAINT [FK_Profile_OrganizationID] FOREIGN KEY([OrganizationID])
REFERENCES [dbo].[Organization] ([OrganizationID])
GO
ALTER TABLE [dbo].[Profile] CHECK CONSTRAINT [FK_Profile_OrganizationID]
GO

第二个数据库生成为

ALTER TABLE [dbo].[Profile]  WITH NOCHECK ADD  CONSTRAINT [FK_Profile_OrganizationID] FOREIGN KEY([OrganizationID])
REFERENCES [dbo].[Organization] ([OrganizationID])
GO
ALTER TABLE [dbo].[Profile] CHECK CONSTRAINT [FK_Profile_OrganizationID]
GO

所以我有两个问题:

  1. 最终结果是否相同? (修改 似乎很多人只接受这两个脚本的第一个声明。我对两个脚本的最终结果感兴趣。)

  2. 如果最终结果相同,为什么Management Studio会针对不同的数据库以不同方式生成它们?

3 个答案:

答案 0 :(得分:18)

最终结果不一样!

如果没有检查,SQL Server将不信任FK的唯一性。这意味着如果在查询中使用该列,则需要进行其他处理 简而言之,您应该让SQL Server检查列,以便它被认为是可信的。

至于为什么它们与不同的服务器不同,请检查sys.foreign_keys中的isnottrusted列。这可能会影响SSMS产生的内容?

如果对此更多的咆哮,请检查与FK& amp;没有检查/检查选项。

答案 1 :(得分:16)

是的,他们两个脚本不同

WITH CHECK 将根据新约束检查现有数据 WITH NOCHECK 不会根据新约束检查现有数据。这将允许您拥有没有相应父级的子记录。

编辑: 至于为什么SSMS这样做我不知道

答案 2 :(得分:0)

两者都是SQL Server 2005服务器?由于结果相同,代码生成工具可能使用基于产品的不同版本的不同例程