Sql-Server
使用 SSDT 發布數據庫更改,包括更改列的數據類型
我有一個在建構過程中自動發布的 SQL Server Data Tools (VS2012) 項目。列最近從 更新
int
到decimal(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 在執行批處理時發生錯誤。
我了解我收到該錯誤的原因,並且我知道可以通過禁用“如果可能發生數據失去,阻止增量部署”標誌來解決它。但是,對於禁用該功能有非常強烈的反對意見,因此這不是一個可以接受的解決方案。
我能想到的唯一其他解決方案是執行以下操作:
- 製作一個臨時表並將現有表的內容複製到臨時表中
- 截斷現有表
- 讓 SSDT 更新數據類型
- 從臨時表填回數據
不過,這似乎非常笨拙且效率低下。
有更好的選擇嗎?
我也很想繞過該標誌,但已經站在您的同事一邊,現在嘗試“正確”處理這些問題。(稍微)不太笨重的路線是使用部署前和部署後腳本來完成重命名工作。
- 在預部署腳本中重命名現有表。
- 如果現有表缺失,則將根據新模式定義創建焦點表。
- 在部署後腳本中,從重命名的原始表複製到新版本。
根據目標的性質,您當然可能需要處理刪除和重新創建外鍵約束。