【发布时间】:2011-08-25 00:03:37
【问题描述】:
我们目前正在使用 Visual Studio 2010,并且有一个包含我们所有数据库对象的数据库项目。我们通常通过构建脚本将数据库部署到我们的 CI、QA 和 UAT 环境中。对于生产,我们生成脚本并将其提供给我们的 DBA 进行部署。
我们注意到,我们的生产数据库部署想要删除大量外键约束并使用 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])
我的数据库项目中是否存在导致此问题的设置?数据库上是否有设置默认值,因为我们没有在脚本中提供默认值?
【问题讨论】:
-
定位到 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