我们目前正在使用Visual Studio 2010,并且拥有一个包含所有数据库对象的数据库项目。我们通常通过构建脚本将数据库部署到CI,QA和UAT环境中。对于Production,我们生成脚本并将其提供给我们的DBA进行部署。
我们注意到,我们的Production数据库的部署是希望删除大量外键约束并使用 NOCHECK 重新创建它们。
当我们创建外键时,我们不会定义 CHECK 或 NOCHECK 。以下是我们的一个键的示例:
ALTER TABLE [dbo].[Table1]
ADD CONSTRAINT [FK_Table1_Table2_Field1]
FOREIGN KEY ([Field1])
REFERENCES dbo.[Table2] ([Field1])
当我们在CI,QA和UAT环境中定位我们的数据库项目时,它想要使用“ CHECK ”创建约束。它需要上面的脚本并尝试部署:
ALTER TABLE [dbo].[Table1] WITH CHECK
ADD CONSTRAINT [FK_Table1_Table2_Field1]
FOREIGN KEY ([Field1])
REFERENCES dbo.[Table2] ([Field1])
当我们在生产环境中定位我们的数据库项目时,它想要使用“ NOCHECK ”创建约束。它需要上面的脚本并尝试部署:
ALTER TABLE [dbo].[Table1] WITH NOCHECK
ADD CONSTRAINT [FK_Table1_Table2_Field1]
FOREIGN KEY ([Field1])
REFERENCES dbo.[Table2] ([Field1])
我的数据库项目中是否存在导致此问题的设置?数据库上是否有设置默认值的设置,因为我们没有在脚本中提供默认设置?
答案 0 :(得分:0)
这个问题的答案可以帮助你: WITH CHECK ADD CONSTRAINT followed by CHECK CONSTRAINT vs. ADD CONSTRAINT
看起来“WITH CHECK”是新外键的默认值,“WITH NOCHECK”是重新启用外键的默认值。如果您每次都为CI,QA和UAT创建一个新数据库并且只改变您的生产数据库(通常的做法),这将是有意义的。