升级架构

时间:2015-12-29 13:20:56

标签: sql-server database sql-server-data-tools

我有以下示例方案,我正在寻找一种方法如何在 Sql Server数据库项目中进行适当的升级

我有4张桌子:

  • CarColors
    • 编号
    • 的ColorCode
  • 汽车
    • 编号
    • CarColor_Id
  • 货车
    • 编号
    • TruckColor_Id
  • TruckColors
    • 编号
    • 的ColorCode

TruckColorsCarColors完全相同,所以我想重构一下。

期望的变化:

  • CarColors重命名为ColorCodes
  • Cars.CarColor_Id重命名为Cars.ColorCode_Id
  • 创建Trucks.ColorCode_Id
  • ColorCodes外键
  • 填充' Trucks.ColorCode_Id'基于Trucks.TruckColor_Id
  • 的信息
  • 删除Trucks.TruckColor_Id
  • 删除TruckColors表格

我只能做PostDeployPreDeploy,但也可以:

  • 早到,因为在迁移之前Trucks.ColorCode_Id不存在。
  • 迟到因为Trucks.TruckColor_Id已被删除

所以在升级过程中,我想运行这个特定的脚本:

UPDATE truck
SET truck.ColorCode_Id = newcolor.Id 
FROM Trucks truck 
INNER JOIN TruckColors truckcolor ON truck.TruckColor_Id = truckcolor.Id
INNER JOIN ColorCodes newcolor ON truckcolor.ColorCode = newcolor.ColorCode

数据已经投入生产,因此不会出现数据损失。 如何使用 Sql Server数据库项目

实现此目的

1 个答案:

答案 0 :(得分:1)

诀窍是使用预部署和后部署来完成更改:

在预部署中将您需要的数据保存到临时表中(我会使用实际的表调用mig_blah等),此表应该在项目中,但是您可以在预部署脚本中创建它。

发生表迁移,然后在post post脚本中使用临时中间表中的数据更新表。

下一步部署删除临时中间表。

如果让脚本重新运行,这会让事情变得更容易:

  • 在预部署中检查旧表以及是否存在复制到中间表 - 在post部署中使用外部联接仅插入缺失的行(或合并等)

这意味着你不必小心只运行一次这个特定的脚本,你可以根据需要将它取出一些版本(记得创建一个jira票或其他)

另一个有用的是,在预部署之前禁用修改表中的任何外键,并在部署后重新启用,这样您就可以设置所需的任何数据,而无需担心中间状态。数据库:)

希望它有意义 - 我已经在这里写下了可能会更清楚的步骤(https://the.agilesql.club/blog/Ed-Elliott/2015-12-30/Migrating-Data-In-SSDT-Without-Losing-It