SSDT 升级架构时的升级数据

Posted

技术标签:

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

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

我有 4 张桌子:

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

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

期望的改变:

CarColors 重命名为ColorCodesCars.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 数据库项目 实现这一目标?

【问题讨论】:

您坚持以下哪些步骤?我不明白你的确切问题是什么。 【参考方案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)

埃德

【讨论】:

以上是关于SSDT 升级架构时的升级数据的主要内容,如果未能解决你的问题,请参考以下文章

SSDT 很长时间加载项目和未解决的参考

架构师更多的是和人打交道,说说我见到和听说到的架构师升级步骤和平时的工作内容

安装SSDT2017

sharepoint server 2016 解决升级补丁kb3141515后提示 错误:升级后的数据库架构与目标架构不匹配

使用 SSDT 进行自定义表比较和部署

升级或迁移后是不是有一种好方法可以验证数据库架构是不是正确?