我正在使用Visual Studio 2012,一个SQL数据库项目并对该数据库运行数据库分析,它引发了以下警告:
WITH CHECK | NOCHECK OPTION FOR EXISTING DATA CHECK ENFORCEMENT IS IGNORED.
我对错误的理解是,在运行脚本时,现有数据将忽略CHECK
和NOCHECK
约束(在每种情况下,我都是ALTER TABLE
)。
我的问题是,为什么忽略检查约束?
警告ID似乎已经改变,所以我将两者都包括在内,以便将来可以轻松搜索
在Visual Studio 2010中,它具有警告ID:SQL03159
在Visual Studio 2012中,它具有警告ID:SQL70588
ALTER TABLE [dbo].[MyTable] CHECK CONSTRAINT [FK_MyTable_SomeCol]
答案 0 :(得分:8)
在我的情况下,这发生在我导入的脚本中,该脚本具有如下结构:
CREATE TABLE [dbo].[ELMAH_Error]
(
[ErrorId] UNIQUEIDENTIFIER NOT NULL,
)
GO
ALTER TABLE [dbo].[ELMAH_Error] WITH NOCHECK ADD
CONSTRAINT [PK_ELMAH_Error] PRIMARY KEY NONCLUSTERED ([ErrorId]) ON [PRIMARY]
GO
当我查看上面的代码时,WITH NOCHECK
看起来是多余的,因为表应该刚刚创建,因此是空的。所以我怀疑这个代码分析警告指出了这种冗余。
答案 1 :(得分:2)
这与冗余无关,而是有关项目是期望状态还是DDL架构的理想状态的事实。
将项目应用于现有数据库时,过程(发布,dacpac部署等)将在应用增量时强制执行检查约束。因此,在定义表和后续约束的项目DDL中,with check和with nocheck毫无意义。
在部署前和部署后脚本中,唯一受到CHECK和NOCHECK认可的地方。
编辑:
如果您曾经从dacpac生成脚本,则会注意到事情是分阶段进行的。
在应用新约束时,总是将它们添加为NOCHECK。最后一个阶段是在运行部署后脚本之后,将WITH CHECK应用于所有需要的约束。这样可以在各个阶段(包括部署前和部署后脚本阶段)进行最大程度的自定义。