Sql-Server

使用 SSDT 發布數據庫更改,包括更改列的數據類型

  • August 23, 2021

我有一個在建構過程中自動發布的 SQL Server Data Tools (VS2012) 項目。列最近從 更新intdecimal(18,4)。由於此更改,發布失敗並出現錯誤

(49,1):SQL72014:.Net SqlClient 數據提供程序:檢測到消息 50000、級別 16、狀態 127、第 6 行。架構更新正在終止,因為可能會發生數據失去。(44,0):SQL72045:腳本執行錯誤。執行的腳本:/* 表中 QuantityReceived 列的類型

$$ dbo $$.$$ Reconciliation_Receiving $$目前為 INT NOT NULL,但正在更改為 DECIMAL (18, 4) NOT NULL。可能會發生數據失去。*/ 如果存在(選擇前 1 1 從

$$ dbo $$.$$ Reconciliation_Receiving $$) RAISERROR(檢測到 N’行。模式更新正在終止,因為可能會發生數據失去。’, 16, 127) WITH NOWAIT 在執行批處理時發生錯誤。

我了解我收到該錯誤的原因,並且我知道可以通過禁用“如果可能發生數據失去,阻止增量部署”標誌來解決它。但是,對於禁用該功能有非常強烈的反對意見,因此這不是一個可以接受的解決方案。

我能想到的唯一其他解決方案是執行以下操作:

  1. 製作一個臨時表並將現有表的內容複製到臨時表中
  2. 截斷現有表
  3. 讓 SSDT 更新數據類型
  4. 從臨時表填回數據

不過,這似乎非常笨拙且效率低下。

有更好的選擇嗎?

我也很想繞過該標誌,但已經站在您的同事一邊,現在嘗試“正確”處理這些問題。(稍微)不太笨重的路線是使用部署前和部署後腳本來完成重命名工作。

  • 在預部署腳本中重命名現有表。
  • 如果現有表缺失,則將根據新模式定義創建焦點表。
  • 在部署後腳本中,從重命名的原始表複製到新版本。

根據目標的性質,您當然可能需要處理刪除和重新創建外鍵約束。

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