0

我有一个 Azure SQL 数据库项目,它使用 SQLCMD 变量动态设置值。我可以将这些变量作为项目附带的发布配置文件的一部分引用,甚至可以覆盖它们。

我正在使用 Visual Studio 2022 RC

我还有一个 Azure DevOps 管道,它在将数据库部署到 Azure 的部署任务之前检查项目构建.dacpac并将其移动到必要的目录中。.dacpac

部署任务SqlAzureDacpacDeployment@1失败。前面的构建任务正在生成一个.dacpac没有在项目级别设置的默认 SQLCMD 变量值。

##[error]*** 部署计划生成过程中发生错误。部署无法继续。

##[错误]以下 SqlCmd 变量的值缺失:var1 var2。

##[错误]Azure SQL DACPAC 任务失败。SqlPackage.exe 以代码 1 退出。在https://aka.ms/sqlazuredeployreadme#troubleshooting-查看如何解决故障

为了提供一些额外的上下文,这是构建和部署的 CI 管道的一部分。

- task: VSBuild@1
  displayName: 'Build projA database.'
  inputs:
    solution: 'projA\\projA.sqlproj'
    vsVersion: 16.0
    platform: 'x64'

- task: SqlAzureDacpacDeployment@1
  displayName: 'Deploy projA database.'
  inputs:
    azureSubscription: '$(ServiceConnectionName)'
    ServerName: '$(ServerName)'
    DatabaseName: '$(DatabaseName)'
    SqlUsername: '$(ServerUserName)'
    SqlPassword: '$(ServerUserPassword)'
    DacpacFile: '$(Build.SourcesDirectory)\\projA\\bin\\Output\\projA.dacpac'

我认为在创建.dacpac. 不是这种情况。

我也尝试将local值设置为相同default(这些以前是空白的)但出现了相同的错误

在此处输入图像描述

我看过这篇文章,它表明在部署时可以提供额外的变量。我不确定是否可以使用AdditionalArguments部署任务中的子句将值应用于现有变量。

理想情况下.dacpac,如果没有被覆盖,我希望使用提供的 SQLCMD 默认值生成,当然这应该是默认行为。我不想在多个位置维护值,这应该在项目中捕获。

我已阅读如何在部署 DacPac 时将多个 SQLCMD 变量与 SqlPackage.exe 一起使用?但这并没有回答我的问题。

4

2 回答 2

0

您尝试在其上部署 dacpac 的 SQL 服务器的目标平台与 dacpac 文件的目标平台不同。

潜在的解决方案: 在此处输入图像描述

将 dacpac 项目中的目标平台更改为与 SQL 服务器的目标平台相同的平台。

请尝试通过以下方式添加值SqlCommandVariableValues

在此处输入图像描述

$options.SqlCommandVariableValues.Add("variable", $Variable)

您甚至可以使用 PowerShell 脚本来添加值,正如 Steve Fenton 的博客中提到的:这里

于 2021-10-20T06:15:10.870 回答
0

为了解决这个问题,我使用了publishProfile参数(代码中的最后一行)并引用了一个现有的发布配置文件,该配置文件在SQLCMD部署.dacpac期间通过sqlPackage.exe.

- task: SqlAzureDacpacDeployment@1
  displayName: 'Deploy projA database.'
  inputs:
    azureSubscription: '$(ServiceConnectionName)'
    ServerName: '$(ServerName)'
    DatabaseName: '$(DatabaseName)'
    SqlUsername: '$(ServerUserName)'
    SqlPassword: '$(ServerUserPassword)'
    DacpacFile: '$(Build.SourcesDirectory)\\projA\\bin\\Output\\projA.dacpac'
    publishProfile: '$(Build.SourcesDirectory)\\projA\\projA.publish.xml'

我还不得不从使用 Azure Active Directory Interactive 身份验证切换到 SQL 身份验证,因为它不受支持(因为这是自动化)。我在我的发布配置文件中使用了 AADI 身份验证。

在将其移动到我使用该 AAD 帐户进行身份验证的公司 VM 时,我将使用 Azure Active Directory Integrated。

我遇到的另一个问题是 Azure SQL 数据库实例阻止了所有不在绿名单上的 IP,我不想授予一揽子访问权限。我使用的是没有静态 IP 的 Microsoft 托管代理。我在本地机器上安装了一个代理,我的公共 IP 是绿色的,因此部署成功。

于 2021-10-21T18:16:51.943 回答