【问题标题】:TFS - Database deploy - Setting CHECK or NOCHECK on ConstraintsTFS - 数据库部署 - 在约束上设置 CHECK 或 NOCHECK
【发布时间】:2011-08-25 00:03:37
【问题描述】:

我们目前正在使用 Visual Studio 2010,并且有一个包含我们所有数据库对象的数据库项目。我们通常通过构建脚本将数据库部署到我们的 CI、QA 和 UAT 环境中。对于生产,我们生成脚本并将其提供给我们的 DBA 进行部署。

我们注意到,我们的生产数据库部署想要删除大量外键约束并使用 NOCHECK 重新创建它们。

当我们创建外键时,我们没有定义 CHECKNOCHECK。以下是我们其中一个键的示例:

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])

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

【问题讨论】:

  • 定位到 PROD 时,是否在上述脚本之后在脚本中进行额外检查:ALTER TABLE [dbo].[Table1] CHECK CONSTRAINT [FK_Table1_Table2_Field1]?我假设您的 SQL Server 版本是 2008。
  • 或者检查 DBA 组最后是否添加了 CHECK ALL 约束,如下所示:ALTER TABLE WITH CHECK CHECK CONSTRAINT ALL。这可能是他们最佳实践的一部分。

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


【解决方案1】:

这个问题的答案应该对你有所帮助: WITH CHECK ADD CONSTRAINT followed by CHECK CONSTRAINT vs. ADD CONSTRAINT

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

【讨论】:

    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    相关资源
    最近更新 更多