如何将变量传递给 azure devops 管道中的 SqlAzureDacpacDeployment@1 任务

Posted

技术标签:

【中文标题】如何将变量传递给 azure devops 管道中的 SqlAzureDacpacDeployment@1 任务【英文标题】:How can I pass a variable to the SqlAzureDacpacDeployment@1 task in azure devops pipeline 【发布时间】:2020-11-30 06:58:52 【问题描述】:

我正在尝试授予应用程序访问数据库的权限。其中一个步骤要求必须在数据库上运行创建用户的脚本。我正在使用 azureSqlAzureDacpacDeployment@1 任务通过管道执行此操作。

Secure Azure SQL Database connection from App Service using a managed identity

- task: SqlAzureDacpacDeployment@1
      inputs:
        azureSubscription: 'xxxxxxxx (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)'
        AuthenticationType: 'aadAuthenticationIntegrated'
        ServerName: '$(SqlServerName)'
        DatabaseName: '$(SqlDatabaseName)'
        deployType: 'InlineSqlTask'
        SqlInline: |
          CREATE USER [$(AppName)] FROM EXTERNAL PROVIDER;
          ALTER ROLE db_datareader ADD MEMBER [$(AppName)];
          ALTER ROLE db_datawriter ADD MEMBER [$(AppName)];
          GO
        InlineAdditionalArguments: '-v $(ApiAppName)'
        IpDetectionMethod: 'AutoDetect'

ApiAppName = 'AppName=MyApplication'

##[error]The format used to define the new variable for Invoke-Sqlcmd cmdlet is invalid. 
Please use the 'var=value' format for defining a new variable.Check out how to troubleshoot 
failures at https://aka.ms/sqlazuredeployreadme#troubleshooting-

【问题讨论】:

这个任务完成后,你能否使用 Powershell 之类的工具对 SQL 服务器执行临时命令? 任务工作正常参数化appname部分是问题。如果我从 powershell 运行 invoke-sqlcmd,我仍然会面临参数化的挑战。 还有一个想法:如果您使用 $(AppName) 而不是 [$(AppName)],错误消息会改变吗?我确实查阅了文档,并且应该在运行任务之前扩展 $(variable) 宏,这正是您想要的。 得到一个新的错误 'AppName' 脚本变量未定义查看如何解决故障在 【参考方案1】:

您似乎正在尝试在 SQL 脚本中定义变量。您可以尝试DECLARE 语句和SET 语句,如下链接所示:

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/variables-transact-sql?view=sql-server-ver15

-- Declare two variables.
DECLARE @AppName nvarchar(50);

-- Set their values.
SET @AppName = 'MyApplication';

【讨论】:

我想如何将我的 'MyApplication' 放入 sql 脚本中。”我正在尝试将一个变量从我的管道传递给 sql 脚本。任务使用 invoke-sqlcmd 您可以尝试在任务SqlAzureDacpacDeployment@1之前添加一个脚本步骤,并使用##vso[task.setvariable]value设置一个变量:docs.microsoft.com/en-us/azure/devops/pipelines/scripts/…。 您提供的答案与问题无关。我正在尝试将变量从管道传递到内联 sql 脚本。我收到的错误消息表明我使用的格式有问题。这是格式“AppName=MyApplication”,这是错误消息建议我使用“var=value”的格式。这是否说明了问题,因为您提供的答案与问题无关。 看来我误解了您的问题。请尝试以下格式定义变量$ApiAppName = "AppName='MyApplication'",并在sql中使用$(AppName)。 docs.microsoft.com/en-us/powershell/module/sqlserver/…

以上是关于如何将变量传递给 azure devops 管道中的 SqlAzureDacpacDeployment@1 任务的主要内容,如果未能解决你的问题,请参考以下文章

Azure DevOps YAML 管道从传递的变量中删除引号和双反斜杠

如何将 Azure 管道变量传递给 AzureResourceManagerTemplateDeployment@3 任务使用的 ARM 模板?

如何将Azure管道变量传递给AzureResourceManagerTemplateDeployment @ 3任务使用的ARM模板?

如何在 Azure DevOps 变量组中使用 SecureFile?

我正在尝试使用另一个变量更新 azure devops 中的管道变量。但我不确定如何做到这一点

无法将环境变量传递给 azure 管道 yaml 中的 powershell 脚本(非内联)