如何指定 .dacpac 应使用 VS2022 数据库项目中指定的默认 SQLCMD 变量值?

How to specify that .dacpac should use default SQLCMD variable values specified in VS2022 database project?

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

我正在使用 Visual Studio 2022 RC.

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

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

##[error]*** An error occurred during deployment plan generation. Deployment cannot continue.

##[error]Missing values for the following SqlCmd variables:var1 var2.

##[error]The Azure SQL DACPAC task failed. SqlPackage.exe exited with code 1.Check out how to troubleshoot failures at 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 相同的值(这些值以前是空白的)但是出现了同样的错误.

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

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

我已阅读 How to use multiple SQLCMD variables with SqlPackage.exe while deploying a DacPac? 但这没有回答我的问题。

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

可能的解决方案:

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

请尝试通过 SqlCommandVariableValues 添加值:

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

您甚至可以使用 PowerShell 脚本添加值,如 Steve Fenton 的博客中所述:Here

为了解决这个问题,我使用了 publishProfile 参数 (代码中的最后一行) 并引用了应用默认 [=12= 的现有发布配置文件] 在通过 sqlPackage.exe.

部署期间将变量值传递给目标 .dacpac
- 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 交互式身份验证切换到 SQL 身份验证,因为它不受支持(因为这是自动化)。我在我的发布配置文件中使用了 AADI 身份验证。

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

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