【问题标题】:SSDT Upgrade data when upgrading schemaSSDT 升级架构时的升级数据
【发布时间】:2015-12-29 13:20:56
【问题描述】:

我有以下 示例 场景,我正在寻找一种方法如何在 Sql Server 数据库项目中进行正确升级。

我有 4 张桌子:

  • 汽车颜色
    • 身份证
    • 颜色代码
  • 汽车
    • 身份证
    • CarColor_Id
  • 卡车
    • 身份证
    • TruckColor_Id
  • 卡车颜色
    • 身份证
    • 颜色代码

TruckColorsCarColors 是相同的,所以我想重构它。

期望的改变:

  • CarColors 重命名为ColorCodes
  • Cars.CarColor_Id重命名为Cars.ColorCode_Id
  • 创建Trucks.ColorCode_Id外键到ColorCodes
  • 根据Trucks.TruckColor_Id的信息填写'Trucks.ColorCode_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 数据库项目 实现这一目标?

【问题讨论】:

  • 您坚持以下哪些步骤?我不明白你的确切问题是什么。

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


【解决方案1】:

诀窍是同时使用 pre-deploy 和 post-deploy 来为您完成更改:

在预部署中,将您需要的数据保存到一个临时表中(我会使用一个实际的表,称为 migration_blah 等),该表应该在项目中,但您在预部署脚本中创建它。

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

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

如果你让你的脚本可以重新运行,事情会变得更容易:

  • 在部署前检查旧表,如果存在则复制到中间表 - 在部署后使用外连接仅插入缺失的行(或合并等)

这意味着您不必小心只运行此特定脚本一次,如果需要,您可以将其取出几个版本(记得创建 jira 票证或其他)

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

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

埃德

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多