使用 TFS 2015 部署数据库更改有哪些不同的方法?

What are the different approaches for deploying DB changes using TFS 2015?

目前,我们在 CI/CD 部署之外手动 运行 数据库脚本(SQL Server 2012)。我们可以通过哪些方式(包括工具集)使用 TFS 2015 Update 3 自动部署数据库更改?

如果部署数据库更改仅意味着在 Team Foundation Server 中使用 SQL 服务器数据库项目(.sqlproj 文件)和 Team Foundation Build。

有几种方法可以实现这一点:

  • 使用带有一些参数的 MSBuild 任务来发布您的 SQL 项目 在构建期间。
  • 在您的 sqlproj 文件中添加部署目标,运行 构建后的目标 完成。
  • 或者在您的构建中添加一个 "Batch Script" 步骤 定义 运行 "SqlPackage.exe" 以发布 .dacpac 文件。

更多详情请参考这篇博文:Deploying SSDT During Local and Server Build .


至于使用TFS2015,也可以尝试使用SQL Server Database Deployment任务。

Use this task to deploy a SQL Server database to an existing SQL Server instance. The task uses a DACPAC and SqlPackage.exe, which provides fine-grained control over database creation and upgrades.

这里实际上有两种方法,都适用于 TFS。实际上,TFS 只是促进了您将用于更新数据库的任何脚本的执行,包括您自定义的、手工编写的脚本。

有一种基于状态的方法,它使用比较技术来查看您的 VCS/dev/test/staging 数据库并将其与生产环境进行比较。 SQL Source Control Redgate Software 的 DLM Automation Suite 和其他比较工具一样可以做到这一点。您要做的是使用命令行或编程界面来设置源和目标,捕获输出,然后将其用作发布过程中的工件。我可能会在您的流程中包括对工件的审查作为脚本选择。

请注意,有些问题是基于状态的比较不能很好地解决的。重命名、拆分、合并、数据移动等等。一些比较工具有办法解决这个问题,有些则没有。请注意,这可能是一个问题。如果你有一个更成熟的数据库,也许不会,但你应该考虑这一点。 SQL 源代码管理允许自定义迁移脚本,可以处理这些问题。

另一种方法是脚本运行器或迁移策略,其中您对开发数据库所做的每项更改都被捕获为有序脚本,如果需要,框架会按顺序执行这些更改。这是一些人的首选,因为您可以准确地看到在开发和部署时将执行哪些代码。 ReadyRoll 来自 Redgate Software、Liquibase、Rails Migrations、DBUp、FlywayDB,都使用这种策略。

这些都没有好坏之分。两者都有效,各有利弊,但真正的选择取决于您的舒适程度和偏好。

披露:我在 Redgate Software 工作。