使用 SSDT 发布数据库更改,包括更改列的数据类型

Dan*_*ann 10 sql-server ssdt

我有一个在构建过程中自动发布的 SQL Server Data Tools (VS2012) 项目。一列最近从 更新intdecimal(18,4)。由于此更改,发布失败并显示错误

(49,1): SQL72014: .Net SqlClient Data Provider: Msg 50000, Level 16, State 127, Line 6 检测到行。架构更新正在终止,因为可能会发生数据丢失。(44,0): SQL72045: 脚本执行错误。执行的脚本: /* The type for column QuantityReceived in table [dbo].[Reconciliation_Receiving] 当前为 INT NOT NULL 但正在更改为 DECIMAL (18, 4) NOT NULL。可能会发生数据丢失。*/

IF EXISTS (select top 1 1 from [dbo].[Reconciliation_Receiving]) RAISERROR(检测到 N'Rows。由于可能发生数据丢失,模式更新正在终止。', 16, 127) WITH NOWAIT 批处理时发生错误被处决。

我明白为什么我会收到该错误,并且我知道可以通过禁用“如果可能发生数据丢失则阻止增量部署”标志来解决它。但是,非常强烈反对禁用该功能,因此它不会是一个可接受的解决方案。

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

  1. 创建一个临时表并将现有表的内容复制到临时表中
  2. 截断现有表
  3. 让SSDT更新数据类型
  4. 从临时表填回数据

不过,这似乎非常笨拙且效率低下。

有更好的选择吗?

Mar*_*ith 5

我也曾试图绕过该标志,但已经站在你的同事一边,现在尝试“正确”处理这些问题。(稍微)不那么笨拙的路线是使用部署前和部署后脚本来完成重命名工作。

  • 在预部署脚本中重命名现有表。
  • 由于现有表缺少焦点表,将根据新模式定义创建。
  • 在从重命名的原始表到新版本的部署后脚本副本中。

根据目标的性质,您当然可能需要处理删除和重新创建外键约束。