与检查| 现有数据检查执行的检查选项被忽略

Rob*_*ean 9 sql-server static-analysis database-project compiler-warnings visual-studio

我正在使用Visual Studio 2012,一个SQL数据库项目和对该数据库运行数据库分析,它引发了以下警告: WITH CHECK | NOCHECK OPTION FOR EXISTING DATA CHECK ENFORCEMENT IS IGNORED.

我对错误的理解是,在运行脚本时,现有数据将忽略CHECKNOCHECK约束(在每种情况下对我来说都是如此ALTER TABLE).

因此,我的问题是,为什么忽略检查约束?

警告ID号

似乎警告ID已经改变,因此我将两者都包括在内,以便将来可以轻松搜索.
在Visual Studio 2010中,此警告ID为:SQL03159
在Visual Studio 2012中,其警告ID为:SQL70588

相关信息

ALTER TABLE [dbo].[MyTable] CHECK CONSTRAINT [FK_MyTable_SomeCol]

Sam*_*Sam 9

在我的情况下,这发生在我导入的脚本中,该脚本具有如下结构:

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
Run Code Online (Sandbox Code Playgroud)

当我查看上面的代码时,WITH NOCHECK看起来多余,因为表应该刚刚创建,因此是空的.所以我怀疑这个代码分析警告指出了这种冗余.


rsh*_*man 5

这与冗余无关,而是项目是期望状态或DDL模式的理想状态这一事实。

将项目应用于现有数据库时,该过程(发布,dacpac部署等)将在应用增量时强制执行检查约束。因此,在定义表和后续约束的项目DDL中,with check和with nocheck毫无意义。

在部署前和部署后脚本中,唯一接受CHECK和NOCHECK的地方。

编辑:

如果您曾经从dacpac生成脚本,您会注意到事情是分阶段进行的。

在应用新约束时,总是将它们添加为NOCHECK。最后一个阶段是在运行部署后脚本之后,将WITH CHECK应用于所有需要的约束。这允许在各个阶段(包括部署前和部署后脚本阶段)进行最大程度的定制。