SSDT 在没有任何变化时删除并重新创建表

OJa*_*Jay 7 sql-server visual-studio deployment ssdt

我们有一个由大约 129 个表组成的 Visual Studio 数据库项目。它是我们内部基于 Web 的 CRM/呼叫中心产品的主要数据库,该产品仍在积极开发中。

我们使用 VS 中的 SSDT 发布在进行更改时部署到实例。我们通过 SQL Express (2016) 在本地开发,还有一个 LAB 环境用于运行 SQL 2014 的性能和负载测试,一个运行 2012 的 UAT 环境,最后部署到运行 SQL 2016 的生产环境。

在发布时生成的脚本的所有环境(生产除外)都非常好,只做更改。生产脚本做了大量的工作。似乎删除并重新创建了更多的表,我知道这些表没有改变(上次部署了 37 个表)。其中一些表的行数以百万计,整个发布需要 25 分钟以上。

如果我重复发布到生产,它会再次删除并重新创建 37 个表。生产数据库确实有复制,我必须在部署之前禁用它(不确定这是否是一个因素)。

我不明白 Production 发布总是想要删除和重新创建表的内容,即使什么都没有改变。我希望得到一些关于在哪里寻找确定为什么 SSDT 认为需要重新创建这些的建议。

使用 Visual Studio Professional 2017 V 15.5.5 和 SSDT 15.1

OJa*_*Jay 11

在经历了相当多的挫折之后,终于找到了原因,并将其作为答案发布,因为它可能会帮助其他人......

找到 SSDT 认为该方案不同的原因,我认为是第一点。SQL Scheme compare 是您的朋友。(在工具 => SQL => 新方案比较下的 VS...)

首先感谢@jadarnel27,非常有帮助,所以给伙计欢呼,但我担心这不是答案。计算列定义和约束定义绝对是候选者,潜在的列排序也是如此。具有讽刺意味的是,我确实有一个计算列的问题,但这不是定义,事实上我没有在列定义的末尾添加 NOT NULL(当然这是默认值),但 SSDT 认为这是不同的每次。

所以我不得不改变一列

[ColumnName] AS (CONCAT(Col1,' ',Col2)) PERSISTED
Run Code Online (Sandbox Code Playgroud)

[ColumnName] AS (CONCAT(Col1,' ',Col2)) PERSISTED NOT NULL
Run Code Online (Sandbox Code Playgroud)

然后它停止不断下降并重新创建列。这出现在 Scheme Compare 中,而不是出现在计算列的定义中。

其次,因为我们使用了复制,SQL 将 NOT FOR REPLICATION 添加到复制中使用的大多数表中(原因与复制工作有关),但本质上是将表 DDL 从

CREATE TABLE [dbo].[Whatever]
(
    [WhateverId]    INT IDENTITY(1,1) NOT NULL
    ...etc more columns
)
Run Code Online (Sandbox Code Playgroud)

CREATE TABLE [dbo].[Whatever]
(
    [WhateverId]    INT IDENTITY(1,1) NOT FOR REPLICATION NOT NULL
    ...etc more columns
)
Run Code Online (Sandbox Code Playgroud)

这再次出现在 Scheme 比较中......

并修复,要么将 NOT FOR REPLICATION 添加到 VS 中的所有表的 DDL 源代码中,要么在发布设置 -> Advance -> Ignore 选项卡下并向下滚动一点,勾选如下框:SSDT 发布提前忽略不用于复制

然后一切都是迪斯科