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

时间:2013-01-28 08:36:45

标签: sql-server visual-studio compiler-warnings static-analysis database-project

我正在使用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]

2 个答案:

答案 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应用于所有需要的约束。这样可以在各个阶段(包括部署前和部署后脚本阶段)进行最大程度的自定义。