10

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

我对错误的理解是,当脚本运行时,现有数据的CHECKandNOCHECK约束将被忽略(在每种情况下,对我来说,它都是一个ALTER TABLE)。

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

警告 ID 号

警告 ID 似乎已更改,因此我将两者都包括在下面,以便将来轻松搜索。
在 Visual Studio 2010 中,警告 ID 为:SQL03159
在 Visual Studio 2012 中,警告 ID 为:SQL70588

相关信息

ALTER TABLE [dbo].[MyTable] 检查约束 [FK_MyTable_SomeCol]

4

2 回答 2

11

就我而言,这发生在我导入的具有如下结构的脚本中:

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看起来是多余的,因为表应该只是刚刚创建,因此是空的。所以我怀疑这个代码分析警告指出了这种冗余。

于 2013-11-12T01:07:46.677 回答
9

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

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

CHECK 和 NOCHECK 唯一受尊重的地方是部署前和部署后脚本。

编辑:

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

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

于 2018-07-06T16:33:51.560 回答