SQL 部署自动化

SQL deployment automation

我正在尝试使用 Jenkins 自动化现有的 sql 服务器数据库部署自动化。

其中一种自动化方法是使用 Visual Studio 在 SQL 服务器数据库项目中包含 SQL 脚本(存储过程、视图、table 创建) .使用 MSBuild 构建项目并使用 SQLPackage.exe 部署 dacpac。但是,现有数据库引用了 Stored Procedures/Views 中的其他数据库,因此我在 SQL 服务器数据库项目中导入了其他数据库。此外,在提取现有数据库的 dacpac 时,我遇到了很多错误。我认为这是由于现有代码与 dacpac 不兼容,可能需要更改才能与 dacpac 兼容。

有没有其他方法可以自动化 SQL 服务器代码部署而不是使用 SQL 服务器数据库项目?

SSDT model-based 项目的替代方法是 here 所讨论的迁移脚本方法。

基于模型的部署需要在构建期间验证依赖项,否则您将 运行 在部署期间存在出错的风险。不幸的是,我知道没有简单的方法可以为其他不是 dacpac-friendly 的引用数据库创建 dacpac,而无需为从源构建的引用数据库创建单独的项目。您可以为引用的数据库创建一个数据库项目,并使用 SSDT 导入向导提取数据库项目源代码的架构并清理解决方案。

此任务的复杂性会因您拥有的 cross-database 和 cross-server 依赖项的数量而有很大差异。可能需要将数据库拆分为单独的项目以避免循环引用。

SSDT 是一个不错的选择,但是您和所有开发人员需要一段时间才能习惯它并了解什么是离线开发和基于状态的部署。您可以自己阅读 SSDT 的工作原理,但是对您的建议很少:

  • 对于查询中涉及的每个数据库,您需要创建项目
  • 如果你在代码中使用了其他数据库,那么应该添加这个项目作为参考
  • 与其在代码中使用 3/4 的部分名称(server.database.schema.name 或 database.schema.name),不如为每个对象创建同义词,并在同义词中为服务器和数据库名称使用变量
  • 不要将登录名、用户和权限放入该项目
  • 创建发布配置文件并仔细查看所有设置(例如从部署中排除用户、登录名、权限等)
  • 有 pre/post 个脚本,您可以在其中创建一些解决方法

大多数人害怕使用 SSDT 完全自动化部署到 PROD,因为脚本是自动生成的,并且对最终部署脚本的控制非常有限(公平地说,您可以使用部署贡献者控制几乎所有内容,但是这是另一个讨论的主题)。通常在脚本生成和部署之间有脚本审核步骤。

因此,如果您坚持使用 SSDT,那么适合您的路线图是:

  • 为代码中使用的所有数据库创建项目
  • 为项目中所有来自其他数据库的对象创建同义词变量作为数据库和实例名称(非常重要的一点)
  • 对所有外部数据库和实例使用跨多个文件的替换

更换提示。代码中有几种对象名称的组合:

  • INSTANCE.DATABASE.SCHEMA.OBJECT
  • INSTANCE.DATABASE..对象
  • 实例...对象
  • 所有其他带有 [] 或 "" 的组合,例如 [dbo].[SomeTable] 或 [dbo].SomeTable

所以你可以做的是在所有文件中用 $(InstanceName) 替换 INSTANCE [数据库][$(DatabaseName)] 等等。要有创意,基本上当您知道该怎么做时,您可以使用这些技巧在几个小时内将几乎所有数据库放入 SSDT。