5

我很高兴能够使用 DAC Fx 和声明式数据库开发。对我来说,主要障碍是如何处理跨多个不同版本模式的复杂数据迁移。在旧世界中,我们可以简单地按顺序运行我们所有的升级脚本,这可以保证架构在数据迁移时处于正确的状态。当升级路径是动态的时,这是如何工作的?

例如,假设现有实例上有我的架构 (DACPAC1-4) 的多个版本:

  • DACPAC1:tableA 存在并且有有价值的客户数据
  • DACPAC2:不推荐使用 tableA 并由 tableB 和规范化 tableC 替换;添加新表D
    • 部署后脚本:将数据从 tableA 移动到新的 tableB 和 tableC;删除表A
  • DACPAC3:tableC 有一个新的可为空的 columnX
    • 部署后脚本:基于 tableD 填充可为空的列
  • DACPAC4:tableC.columnX 不可为空

如果我需要能够支持将 DACPAC1-3 服务器升级到最新的 DACPAC4,我现在必须以足够聪明的方式编写我的部署前和部署后脚本,以检测目标上当前是哪个 DACPAC 并正确处理数据迁移步骤顺序。此外,我不能简单地重复使用我最初编写的幼稚的部署后脚本,因为它们依赖于模式的中间版本。

提前感谢您的任何建议!

4

1 回答 1

0

我通常做的是以下几点:

  1. 创建一个包含名为 SchemaVersion 的属性的系统表。所有升级脚本都被编程为首先检查当前版本,然后决定是否执行其内容。执行后,它将 SchemaVersion 设置为脚本中存储的最新版本。

  2. 我通常还包括另一个名为 MinAppVersion 的属性(与当前模式兼容的最低版本)。当应用程序尝试连接到数据库时,它会将其当前程序集版本与存储在数据库中的 MinAppVersion 进行比较。如果版本等于或高于 MinAppVersion 则建立连接,否则抛出异常。

我希望这有帮助。亲切的问候,

于 2012-08-31T04:31:28.883 回答