如何将变量传递给 sql deploy on devops?

How to pass a variable to sql deploy on devops?

我需要 post 部署脚本(数据库项目的一部分)来根据环境设置一些特定的东西 运行。

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

这是我正在尝试做的事情。 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。像这样添加环境变量:

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

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

    您可以通过发布项目在 visual studio 中对其进行测试。

  3. 最后进入部署任务定义并像这样设置变量:

    - 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