【问题标题】:SSDT - How to: Incremental Updates?SSDT - 如何:增量更新?
【发布时间】:2015-02-04 12:21:45
【问题描述】:

我在 Visual Studio 中使用数据库项目。

在我的场景中,我有几个客户使用不同版本的数据库。

例如,一个使用版本 5 的客户和另一个使用版本 7 的客户。

我提供版本 8 的更新。

客户端版本 5 应该在运行更新到版本 8 的脚本之前运行“累积”脚本(更新到版本 6 和 7)。

客户端版本 7 应该运行升级到版本 8 的版本。

目前是否有任何使用 SSDT 自动执行此操作的方法?

【问题讨论】:

  • 您是在 VS 中寻找自动构建还是发布?
  • 我正在寻找 Publish, SAS
  • 很好,然后使用参数 GetVersion(如果版本 8 不是您的示例中检查的最新版本)。如我在回答中所述,使用 msbuild 或使用构建中的 dacpac 进行部署。

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


【解决方案1】:

使用 SSDT 时,部署数据库的累积“版本”的概念消失了(在我看来)。 必须理解的 SSDT 的基本概念是声明式数据库开发。我对声明式数据库开发的个人定义:

您定义希望数据库架构处于何种状态,而不是如何使其进入该状态。 SSDT 中的发布引擎将负责让您的数据库进入该状态。

简单示例,您的数据库中当前有一个名为 [Person] 的表,并且您想要添加一个名为 [Person].[MiddleName] 的列。您在 SSDT 中定义新列,当您发布时,SSDT 将发布类似于以下内容的内容:

ALTER TABLE [Person] ADD COLUMN [MiddleName]

关键是您不必编写该 SQL 语句,SSDT 会为您编写和执行它。 在这种情况下,数据库版本的概念消失了。您只会将数据库更新到 SSDT 项目中定义的状态。希望对您有所帮助。

【讨论】:

  • 这个工具太棒了。谢谢你的回复。
  • 对于无法自动推断 delta 脚本或需要自定义步骤的情况怎么办? SSDT 工作流程中有哪些内容可用于处理这些场景? (例如:需要将不可为空的列添加到具有现有记录的表中,并且必须使用自定义函数的结果填充列值)。如果 SSDT 正在生成 delta 脚本以按给定顺序修改多个 DB 对象,那么如何在生成的脚本中注入和修改自定义步骤?
  • @cvacca 你说得很好。如果检测到任何重大更改,部署将简单地出错。 (即检测数据丢失)。有一些迁移步骤无法自动生成
【解决方案2】:

使用 msbuild:/p:GetVersion=CXXXX

Form VS,发布前获取具体版本(在Solution Explorer中右键Project)。

您针对两个不同的目标运行此程序,然后将为指定的目标创建发布脚本(每个目标一个)。

如果您改用 dacpac,则脚本会在部署时通过与目标进行比较从 dacpac 自动生成。如果您想部署相同的版本,您可以在两个目标上使用相同的 dacpac 文件,生成的脚本将专门为每个目标创建。

【讨论】:

  • 如果这行得通,那就太好了!所以我可以使用单个 dacpac(我的构建结果)来更新任何客户端?在这种情况下,如果我生成一个 dacpac 版本 8,并在尚未升级到版本 6 而不是 7 的客户端版本 5 上运行它,会工作吗?
  • 是的!一个文件到多个目标(包含不同的版本)。脚本是在部署时创建的。如果您要更新到生产服务器,最好在部署之前生成并查看脚本,尤其是在部署期间在线时,因为某些更改可能会影响性能和锁定表。..
  • 另外,如果您有任何手动创建的包含在前/后脚本中的脚本,它们必须在两个目标版本上都能正常工作。
【解决方案3】:

您应该提供作为构建输出的 dacpac,然后将其提供给他们进行部署。

您可以通过 SSMS 手动部署它,也可以给他们一个运行 sqlpackage.exe 的命令行 - 这可以执行更新或仅生成升级其数据库的脚本。

【讨论】:

  • 如果这行得通,那就太好了!所以我可以使用单个 dacpac(我的构建结果)来更新任何客户端?在这种情况下,如果我生成一个 dacpac 版本 8,并在尚未升级到版本 6 而不是 7 的客户端版本 5 上运行它,会工作吗?
  • 是的,它应该是这样工作的——唯一需要注意的是如何处理破坏性更改,例如拆分表和任何用于参考数据的脚本
  • 我赞同@EdElliott 所说的,首先针对生产副本测试您的部署。您总是有可能做了一些可能导致部署失败的事情(例如删除列)。默认情况下,SSDt 会对你的数据库做任何破坏性的事情,它只会抛出一个错误,但提前知道可能会发生错误仍然很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-09
相关资源
最近更新 更多