首页 > 解决方案 > Azure Devops - 管理、运行和跟踪一次性 Sql 脚本

问题描述

我们有一个数据库项目,它使用 dacpac 来部署架构更改,并且还允许部署前和部署后脚本。

但是,我们经常不得不运行一次性脚本,并且安全性希望开发人员在 prod 中没有写入权限(我们目前没有 DBA 角色)。我正在尝试找到一种可以与 azure devops 一起使用的解决方案,以将一次性运行脚本存储在 git 中,如果之前未运行过脚本,则运行该脚本,并且在下次管道运行时不运行该脚本。我们希望通过 devops 完成这项工作,以便 SP 有权运行查询而不是 dev,并且流经管道的任何内容都通过了我们的同行评审过程,此外我们还记录了执行的内容。

我正在寻找任何做过这个或知道任何可以做到这一点的产品的人的建议。

标签: azure-devopsazure-sql-databaseazure-pipelinesazure-sql-server

解决方案


我过去也遇到过类似的问题:

选项1

如果您有能力在数据库中拥有一个额外的表来跟踪执行或未执行的内容,那么您的问题很容易解决,有一个工具可以帮助您:https ://github.com/DbUp/DbUp

然后您将拥有一个新的存储库,我们将其称为 OneOffSqlScriptsRepository,您的管道将使用此存储库:

resources:
  repositories:
  - repository: OneOffSqlScriptsRepository
    endpoint: OneOffSqlScriptsEndpoint
    type: git

因此,您将创建一个管道来运行此 DbUp 应用程序,使用 OneOffSqlScripts 存储库中的脚本,DB 将只负责执行一次脚本(它是可配置的)。数据库的用户名/密码可以与 azure keyvault 一起安全地存储在库中,因此只有具有正确访问权限的人才能访问它们(管道除外)。

选项 2

此选项假定您希望仅使用 azure 管道可以提供的本机资源来完成所有工作。

  1. 像 option1 一样创建一个 OneOffSqlScripts
  2. 创建 ScriptsRunner 存储库
  3. 在 ScriptRunner 存储库中,您将创建一个文件夹,其中包含一个 .json 文件,其中包含脚本的名称以及您运行它们的次数(或布尔值)。

例如。:

[{
 "id": 1
 "scriptName" : "myscript1.sql"
  "runs": 0 //or hasRun : false
 }]

然后编写一个 python 脚本,通过更新运行量来读取和写入一个 json 文件,因此您需要在每次管道运行后更新您的存储库。这意味着您的管道将在每次运行后执行 git commit / push 操作,以防有新的脚本要运行。算法是这样的,实现可以调整。


推荐阅读