SQL 部署自动化
Posted
技术标签:
【中文标题】SQL 部署自动化【英文标题】:SQL deployment automation 【发布时间】:2019-05-24 08:58:41 【问题描述】:我正在尝试使用 Jenkins 自动化现有的 sql server 数据库部署自动化。
实现自动化的方法之一是使用 Visual Studio 在 SQL Server 数据库项目中包含 SQL 脚本(存储过程、视图、表创建)。使用 MSBuild 构建项目并使用 SQLPackage.exe 部署 dacpac。但是,现有数据库引用了存储过程/视图中的其他数据库,因此我在 SQL Server 数据库项目中导入了其他数据库。此外,在提取现有数据库的 dacpac 时,我遇到了很多错误。我认为这是由于现有代码不兼容 dacpac,可能需要更改才能兼容 dacpac。
除了使用 SQL Server 数据库项目之外,还有其他方法可以自动化 SQL Server 代码部署吗?
【问题讨论】:
这可能是一个广泛的问题,但我需要一个起点来寻找不同的选择。我认为这对正在寻找类似选择的其他人会很有用。 我在这里写了一篇博客:schottsql.com/all-ssdt-articles - 查找“外部参考”文章。我最终将 dacpacs 用于外部数据库引用。仍然需要清理代码以删除当前数据库的 3 部分名称,但它往往会起作用。然后我们可以构建/部署没有太多麻烦。 -- 可能也值得关注 Red-Gate 的产品,但外部参考可能仍然会给您带来麻烦。 【参考方案1】:SSDT 是一个不错的选择,但是您和所有开发人员需要一段时间才能习惯它并了解什么是离线开发和基于状态的部署。您可以自己阅读 SSDT 的工作原理,但对您的建议很少:
您需要为查询中涉及的每个数据库创建项目 如果你在代码中使用了其他数据库,那么这个项目应该被添加为参考 不要在代码中使用 3/4 部分名称(server.database.schema.name 或 database.schema.name),而是为每个对象创建同义词,并在同义词中为服务器和数据库名称使用变量 不要将登录名、用户和权限放入该项目中 创建发布配置文件并仔细查看所有设置(例如从部署中排除用户、登录名、权限等) 有一些前置/后置脚本,您可以在其中创建一些解决方法大多数人害怕使用 SSDT 完全自动部署到 PROD,因为脚本是自动生成的,并且对最终部署脚本的控制非常有限(公平地说,您可以使用部署贡献者控制几乎所有内容,但它是另一个讨论的主题)。通常在脚本生成和部署之间有一个脚本审查步骤。
因此,如果您坚持使用 SSDT,您的路线图是:
为代码中使用的所有数据库创建项目 为项目中来自其他数据库的所有对象创建同义词,变量作为数据库和实例名称(非常重要的一点) 对所有外部数据库和实例使用跨多个文件的替换提示更换。代码中有几种对象名称的组合:
INSTANCE.DATABASE.SCHEMA.OBJECT INSTANCE.DATABASE..OBJECT 实例...对象 与 [] 或 "" 的所有其他组合,例如 [dbo].[SomeTable] 或 [dbo].SomeTable所以你可以做的是在所有文件中用 $(InstanceName) 替换 INSTANCE,用 [Database] >[$(DatabaseName)] 等等。要有创意,基本上,当您知道该做什么时,您可以使用这些技巧在几个小时内将几乎任何数据库放入 SSDT。
【讨论】:
感谢您的详细说明。 关于“不要将登录名、用户和权限放入该项目”,我在哪里可以放置“在 [SP] 上向 [用户] 作为 [dbo] 授予执行”语句?我想我需要为用户及其登录创建一个脚本来编译这个语句。 您可以将其添加到发布脚本中 好的,如果我以后必须更改存储过程,它会保留权限吗? (即它是否需要在 post 脚本中永久授予权限?) 在 SSDT 后脚本中总是会执行。因此,如果您在此处添加此脚本,则它必须是幂等的。【参考方案2】:SSDT 基于模型的项目的替代方法是迁移脚本方法,如 here 所述。
基于模型的部署需要在构建期间验证依赖关系,否则您将在部署期间面临出错的风险。不幸的是,如果不努力为从源代码构建的引用数据库创建单独的项目,我知道没有简单的方法可以为其他对 dacpac 不友好的引用数据库创建 dacpac。您可以为引用的数据库创建一个数据库项目,并使用 SSDT 导入向导为项目源代码提取数据库架构并清理解决方案。
此任务的复杂性将根据您拥有的跨数据库和跨服务器依赖项的数量而有很大差异。为了避免循环引用,可能需要将数据库拆分为单独的项目。
【讨论】:
您可以使用 sqlpackage 命令行提取其他 DB 的 dacpacs 以用作参考。如果您不将它们放入源代码控制中,则无需为它们构建项目。如果您只需要里面的少量对象,甚至可以通过一些工作将它们剥离。以上是关于SQL 部署自动化的主要内容,如果未能解决你的问题,请参考以下文章