我正在尝试将模式同步到不同的数据库。基本上,我在两个数据库上运行任务 - >使用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
所以我有两个问题:
最终结果是否相同? (修改 似乎很多人只接受这两个脚本的第一个声明。我对两个脚本的最终结果感兴趣。)
如果最终结果相同,为什么Management Studio会针对不同的数据库以不同方式生成它们?
答案 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服务器?由于结果相同,代码生成工具可能使用基于产品的不同版本的不同例程