TFS - 数据库部署 - 在约束上设置CHECK或NOCHECK

时间:2011-08-18 21:12:18

标签: sql sql-server-2008 foreign-keys tfs2010 constraints

我们目前正在使用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])

我的数据库项目中是否存在导致此问题的设置?数据库上是否有设置默认值的设置,因为我们没有在脚本中提供默认设置?

1 个答案:

答案 0 :(得分:0)

这个问题的答案可以帮助你: WITH CHECK ADD CONSTRAINT followed by CHECK CONSTRAINT vs. ADD CONSTRAINT

看起来“WITH CHECK”是新外键的默认值,“WITH NOCHECK”是重新启用外键的默认值。如果您每次都为CI,QA和UAT创建一个新数据库并且只改变您的生产数据库(通常的做法),这将是有意义的。