SSDT 升级架构时的升级数据
Posted
技术标签:
【中文标题】SSDT 升级架构时的升级数据【英文标题】:SSDT Upgrade data when upgrading schema 【发布时间】:2015-12-29 13:20:56 【问题描述】:我有以下 示例 场景,我正在寻找一种方法如何在 Sql Server 数据库项目中进行正确升级。
我有 4 张桌子:
汽车颜色 身份证 颜色代码 汽车 身份证 CarColor_Id 卡车 身份证 TruckColor_Id 卡车颜色 身份证 颜色代码TruckColors
和 CarColors
是相同的,所以我想重构它。
期望的改变:
将CarColors
重命名为ColorCodes
将Cars.CarColor_Id
重命名为Cars.ColorCode_Id
创建Trucks.ColorCode_Id
外键到ColorCodes
根据Trucks.TruckColor_Id
的信息填写'Trucks.ColorCode_Id'
删除Trucks.TruckColor_Id
列
删除TruckColors
表
我只能做 PostDeploy
或 PreDeploy
但那是:
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 升级架构时的升级数据的主要内容,如果未能解决你的问题,请参考以下文章
架构师更多的是和人打交道,说说我见到和听说到的架构师升级步骤和平时的工作内容
sharepoint server 2016 解决升级补丁kb3141515后提示 错误:升级后的数据库架构与目标架构不匹配