如何将变量传递给devops上的sql部署?

Posted

技术标签:

【中文标题】如何将变量传递给devops上的sql部署?【英文标题】:How to pass a variable to sql deploy on devops? 【发布时间】:2022-01-08 21:22:37 【问题描述】:

我需要部署后脚本(数据库项目的一部分)来设置一些具体的东西,具体取决于它将运行的环境。

如何传递脚本可以访问的环境变量?

这就是我想要做的。 yaml文件:

- task: SqlDacpacDeploymentOnMachineGroup@0   
  displayName: Install database
  inputs:
    TaskType: 'dacpac'
    DacpacFile: '**/app-db.dacpac'
    TargetMethod: 'server' 
    ServerName: '(localdb)\MSSQLLocalDB'
    DatabaseName: 'app-dev'
    AuthScheme: 'windowsAuthentication'

日志:

Starting: Install database
==============================================================================
Task         : SQL Server database deploy
Description  : Deploy a SQL Server database using DACPAC or SQL scripts
Version      : 0.3.23
Author       : Microsoft Corporation
Help         : https://docs.microsoft.com/azure/devops/pipelines/tasks/deploy/sql-dacpac-deployment-on-machine-group
==============================================================================
*** Could not deploy package.
Warning SQL72013: The following SqlCmd variables are not defined in the target scripts: env.
Error SQL72014: .Net SqlClient Data Provider: Msg 137, Level 15, State 2, Line 14 Must declare the scalar variable "@env".
Error SQL72045: Script execution error.  The executed script:
IF (@env = 'DEV')
    BEGIN
        ...
    END

【问题讨论】:

【参考方案1】:

这里是我在任何地方都找不到的完整解决方案:

    为 dacpac 声明一个变量。在 Visual Studio 中,转到属性项目页面,选项卡SQLCMD Variables。像这样添加环境变量:

    在 sql 脚本中,将变量写入字符串中,这样就不会因 SQL 语法错误而中断构建。它不是 SQL 变量。字符串'$(env)' 在运行前将被替换为令牌:

    if ('$(env)' = 'DEV') ...
    

    您仍然可以通过发布项目在 Visual Studio 中对其进行测试。

    最后去部署任务定义并像这样设置变量:

    - task: SqlDacpacDeploymentOnMachineGroup@0   
      displayName: Install database
      inputs:
        TaskType: 'dacpac'
        DacpacFile: '**/app-db.dacpac'
        TargetMethod: 'server' 
        ServerName: '(localdb)\MSSQLLocalDB'
        DatabaseName: 'app-dev'
        AuthScheme: 'windowsAuthentication'
        AdditionalArguments: /v:env=DEV
    

【讨论】:

以上是关于如何将变量传递给devops上的sql部署?的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串变量传递给动态sql中的where子句

如何将绑定变量传递给 for 循环的视图

PHP 通过 SQL 查询中的 Href 链接将变量传递给弹出页面

PL/SQL:, 如何将变量传递给 SELECT 语句并返回所有结果行

如何将变量传递给 UIAlertView 委托?

将变量传递给另一个页面上的函数