SQL 部署后 SQL CMD 变量和 YAML 任务

问题描述 投票:0回答:1

我正在将 SQL Server 数据库部署到 Azure,该部署的一部分是将静态数据作为部署后任务加载到某些表中。我的 YAML 已设置完毕,因此我们可以在“逐个客户端”上部署,手动执行管道。客户端部署后数据与 SQL 文件中的 SQL 项目一起存储在客户端文件夹中。

我的 Yaml 任务:

  - task: SqlAzureDacpacDeployment@1
    inputs:
      azureSubscription: ${{ parameters.azureSubscription }}
      serverName: ${{ parameters.serverName }}
      databaseName: ${{ parameters.databaseName }}
      sqlUsername: ${{ parameters.sqlUsername }}  
      sqlPassword: 'pwd'
      deployType: 'DacpacTask'
      DacpacFile: ${{ parameters.dacpacFile }}
      DeploymentAction: ${{ parameters.DeploymentAction }}
      AdditionalArguments: /v:RunPostDeployment=${{ parameters.RunPostDeployment }} /v:tenant=${{ parameters.tenant }}
    displayName: Deploy SQL DacPac

我的两个 SQL CMD 变量是

RunPostDeployment
,默认为
true
tenant
默认为
CompanyA
。 CompanyA 是一个包含 SQL 脚本数据的文件夹。

我的部署后控制器 SQL 文件:

IF '$(RunPostDeployment)' = 'True'
BEGIN
    -- Set Vars
    :r .\variables.sql
    
    -- Tenant and Stages
    :r ..\config_data\$(tenant)\tenant_and_stage.sql
    :r .\tenant.sql
    :r .\stage.sql

    -- Pipeline and Parameters
    :r ..\config_data\$(tenant)\pipeline_and_parameters.sql
    :r .\pipeline.sql
    :r .\pipeline_parameter.sql

    -- Column Mappings
    :r ..\config_data\$(tenant)\column_mappings.sql
    :r .\column_mapping.sql
END

运行我的 YAML 管道并选择

CompanyA
,一切都非常顺利。但是选择
CompanyB
,则不会加载任何数据。如果我将
tenant
默认设置为
CompanyB
,那么我会遇到相反的情况。它几乎看起来像设置租户的 YAML 任务不起作用。我已经检查了通常的拼写、大小写等,一切都很好。

进一步测试表明 YAML 任务上传递的值并未被传递。删除默认值并为

false
提供
RunPostDeployment
会产生相反的结果!

sql-server azure-sql-database
1个回答
0
投票

其他一些人可能需要这个答案,但解决方案位于

VSBuild@1
YAML 任务中,而不是部署中!

在上面的控制器文件中,我使用

$(tenant)
动态选择客户端文件夹,并通过后期绑定嵌入 SQL 变量的 Json 数据,例如
:r ..\config-data\$(tenant)\pipelines-and-parameters.sql
。 IE。后期绑定解决了这个问题,而不是拥有一个随着每个新客户端而增长的控制器文件。

由于 SQL Cmd 变量(租户)有默认值,因此它没有选择包含我想要的文件(带有 Json 的 SQL 变量)的文件夹,并且始终使用默认客户端。当到达 dacpac 部署时,我可以提供任何 SQL Cmd 值,但这无关紧要,因为 dacpac 已经使用其 SQL 部署后 SQL 文件创建了!

调整了两个要素。首先在

sqlproj
文件中:

  <ItemGroup>
    <SqlCmdVariable Include="RunPostDeployment">
      <Value>$(RunPostDeployment)</Value>
      <DefaultValue>False</DefaultValue>
    </SqlCmdVariable>
    <SqlCmdVariable Include="tenant">
      <Value>$(tenant)</Value>
      <DefaultValue>default</DefaultValue>
    </SqlCmdVariable>
  </ItemGroup>

值与变量名称匹配。而不是 VS Code 设置的一些随机值,例如sql_cmd_6!

其次,在

VSBuild@1
中,我提供了要设置为参数的值,因此当编译
dacpac
时,它会采用正确的客户端文件夹(Json SQL 变量):

- task: VSBuild@1
  inputs:
    solution: $(sqlProjectFile)
    msbuildArgs: '/p:Configuration=$(buildConfiguration) /p:SqlCmdVariables=RunPostDeployment=${{parameters.RunPostDeployment}};tenant=${{parameters.tenant}}'
    platform: 'Any CPU'
    configuration: $(buildConfiguration)
© www.soinside.com 2019 - 2024. All rights reserved.