Azure devops Azure Devops-管理、运行和跟踪一次性Sql脚本

Azure devops Azure Devops-管理、运行和跟踪一次性Sql脚本,azure-devops,azure-sql-database,azure-pipelines,azure-sql-server,Azure Devops,Azure Sql Database,Azure Pipelines,Azure Sql Server,我们有一个数据库项目,它使用dacpac部署模式更改,还允许部署前和部署后脚本 但是,我们经常需要运行一次性脚本,安全性方面希望开发人员在prod中没有写访问权限(目前我们没有DBA角色)。我正试图找到一个与azure devops协同工作的解决方案,在git中存储一次性运行的脚本,如果以前没有运行过脚本,则运行该脚本,并且在下次管道运行时不运行该脚本。我们希望通过devops完成这项工作,这样SP就可以运行查询,而不是开发人员,通过管道的任何内容都已经通过了我们的同行评审过程,而且我们还记录了

我们有一个数据库项目,它使用dacpac部署模式更改,还允许部署前和部署后脚本

但是,我们经常需要运行一次性脚本,安全性方面希望开发人员在prod中没有写访问权限(目前我们没有DBA角色)。我正试图找到一个与azure devops协同工作的解决方案,在git中存储一次性运行的脚本,如果以前没有运行过脚本,则运行该脚本,并且在下次管道运行时不运行该脚本。我们希望通过devops完成这项工作,这样SP就可以运行查询,而不是开发人员,通过管道的任何内容都已经通过了我们的同行评审过程,而且我们还记录了执行的内容


我正在寻求任何做过这项工作或知道任何产品可以做这项工作的人的建议。

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

选项1

如果您能够在数据库中提供一个额外的表来跟踪执行了什么或没有执行什么,您的问题可以很容易地解决,有一个工具可以帮助您:

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

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

选项2

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

  • 如选项1所示,创建OneOffSqlScripts
  • 创建ScriptsRunner存储库
  • 在ScriptRunner存储库中,您将创建一个文件夹,其中包含一个.json文件,其中包含脚本的名称和运行它们的次数(或布尔值)
  • 例如:

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

    使用liquibase。虽然我将它作为代码库的一部分,但您也可以从CLI使用它,并使用该工具运行脚本

    Liquibase跟踪您在部署中发布的SQL文件,因此您可以有多个阶段,如DIT、UAT、STAGING、PROD,并且它可以随时间应用剩余的一次性SQL更改

    一般来说,除非你真的需要支持,否则我怀疑你是否需要商业版。开源版本足以满足我的系统需求,我已经有了一个相对复杂的系统

    与其他技术相比,我喜欢liquibase的主要原因是它允许基于SQL的更改集。因此,学习曲线要低得多

    两个小贴士:

  • 不要依赖于logicalFilePath的自动计算,即使它在重复,也要显式地设置它。这允许您重构脚本,以便以后可以将它们分组,而不是将所有内容都集中到一个文件夹中

  • 首先用日期命名脚本。这样,您就可以利用自然排序顺序


  • 嗨,乔希,下面的答案有用吗?请检查并告知结果。
    [{
     "id": 1
     "scriptName" : "myscript1.sql"
      "runs": 0 //or hasRun : false
     }]