Sql-Server

SSDT 在沒有任何更改時刪除並重新創建表

  • April 4, 2020

我們有一個由大約 129 個表組成的 Visual Studio 數據庫項目。它是我們內部基於 Web 的 CRM/呼叫中心產品的主要數據庫,該產品仍在積極開發中。

我們使用 VS 中的 SSDT Publish 在進行更改時部署到實例。我們通過 SQL Express (2016) 進行本地開發,還有一個用於執行 SQL 2014 的性能和負載測試的 LAB 環境,一個執行 2012 的 UAT 環境,最後一個部署到執行 SQL 2016 的生產環境。

發佈時生成的腳本在所有環境(生產除外)都非常好,僅進行更改。生產腳本做了大量的工作。似乎刪除並重新創建了更多的表,我知道這些表沒有改變(上次部署了 37 個表)。其中一些表有數百萬行,整個發布需要 25 分鐘以上。

如果我重複發佈到生產,它會再次刪除並重新創建 37 個表。生產數據庫確實有複製,我必須在部署之前禁用它(不確定這是否是一個因素)。

我不明白生產發布總是想要刪除和重新創建表,即使沒有任何改變。我希望得到一些關於在哪裡尋找以確定為什麼 SSDT 認為需要重新創建這些的建議。

使用 Visual Studio Professional 2017 V 15.5.5 和 SSDT 15.1

經過相當多的挫折後,終於找到了原因,並將其作為答案發布,因為它可能對其他人有所幫助….

找到 SSDT 認為該方案不同的原因,我認為這是第一個呼叫點。SQL Scheme compare 是你的朋友。(在VS下Tools => SQL => New Scheme Comparison…)

首先感謝@jadarnel27,它非常有幫助,所以我很高興,但我擔心這不是答案。計算列定義和約束定義絕對是候選者,潛在的列排序也是如此。具有諷刺意味的是,我確實對計算列有一個問題,但這不是定義,而是我沒有在列定義的末尾添加 NOT NULL (當然這是預設設置),但 SSDT 認為這是不同的每次。

所以我不得不從

[ColumnName] AS (CONCAT(Col1,' ',Col2)) PERSISTED

[ColumnName] AS (CONCAT(Col1,' ',Col2)) PERSISTED NOT NULL

然後它停止不斷下降並重新創建列。這齣現在 Scheme Compare 中,而不是在計算列的定義中。

其次,因為我們使用複制,SQL 將 NOT FOR REPLICATION 添加到複製中使用的大多數表(原因與複製工作有關),但本質上是更改表 DDL

CREATE TABLE [dbo].[Whatever]
(
   [WhateverId]    INT IDENTITY(1,1) NOT NULL
   ...etc more columns
)

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

這再次出現在方案比較中……

並修復,或者將 NOT FOR REPLICATION 添加到 VS 中的所有需要​​的表的 DDL 原始碼中,或者在發佈設置 -> 高級 -> 忽略選項卡下並向下滾動一點,勾選如下框:SSDT Publish Advance Ignore Not For Replication

然後一切都是迪斯科

引用自:https://dba.stackexchange.com/questions/215037