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.
我对错误的理解是,在运行脚本时,现有数据将忽略CHECK和NOCHECK约束(在每种情况下对我来说都是如此ALTER TABLE).
因此,我的问题是,为什么忽略检查约束?
似乎警告ID已经改变,因此我将两者都包括在内,以便将来可以轻松搜索.
在Visual Studio 2010中,此警告ID为:SQL03159
在Visual Studio 2012中,其警告ID为:SQL70588
ALTER TABLE [dbo].[MyTable] CHECK CONSTRAINT [FK_MyTable_SomeCol]
在我的情况下,这发生在我导入的脚本中,该脚本具有如下结构:
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看起来多余,因为表应该刚刚创建,因此是空的.所以我怀疑这个代码分析警告指出了这种冗余.
这与冗余无关,而是项目是期望状态或DDL模式的理想状态这一事实。
将项目应用于现有数据库时,该过程(发布,dacpac部署等)将在应用增量时强制执行检查约束。因此,在定义表和后续约束的项目DDL中,with check和with nocheck毫无意义。
在部署前和部署后脚本中,唯一接受CHECK和NOCHECK的地方。
编辑:
如果您曾经从dacpac生成脚本,您会注意到事情是分阶段进行的。
在应用新约束时,总是将它们添加为NOCHECK。最后一个阶段是在运行部署后脚本之后,将WITH CHECK应用于所有需要的约束。这允许在各个阶段(包括部署前和部署后脚本阶段)进行最大程度的定制。