Azure Devops SQL Azure Key Vault 的 DacpacTask 失败

Azure Devops SQL DacpacTask failing for Azure Key Vault

我正在尝试将 dacpac 部署到启用了始终加密的 Azure Sql 数据库。 Devops 代理 运行 在自托管 VM 中,sqlpackage.exe 版本 19 安装了内部版本 16.0.5400.1。

我已经能够通过添加 /diagnostics 作为任务的参数来追查问题,并且引发的异常是:

Unexpected exception executing KeyVault extension 'Object reference not set to an instance of an object.' at Microsoft.SqlServer.Dac.KeyVault.DacKeyVaultAuthenticator.Validate(IList`1 keyVaultUrls, CancellationToken cancelToken)

有人对如何解决这个问题有建议吗?

请检查以下几点

  1. Microsoft.SqlServer.Dac.KeyVault.DacKeyVaultService 提供用于发现和配置 Microsoft.SqlServer.Dac.KeyVault.KeyVaultAuthenticator 以处理密钥保管库访问请求的服务。 如果更改加密的 table,这些请求将在部署期间发生。它还支持在应用程序中初始化通用密钥保管库支持

  2. 如果您将列主密钥存储在密钥保管库中并且您正在使用访问策略进行授权:

    您的应用程序的身份需要对密钥保管库具有以下访问策略权限:get, unwrapKey, and verify

    管理 Always Encrypted 密钥的用户需要对密钥保管库具有以下访问策略权限:create, get, list, sign, unwrapKey, wrapKey, verify.

参见Create & store column master keys for Always Encrypted - SQL Server | Microsoft Docs

3.

To publish DAC package if Always Encrypted is set up in the DACPAC or/and in the target database, you might need some or all of the below permissions, depending on the differences between the schema in the DACPAC and the target database schema.

ALTER ANY COLUMN MASTER KEY, ALTER ANY COLUMN ENCRYPTION KEY, VIEW ANY COLUMN > MASTER KEY DEFINITION, VIEW ANY COLUMN ENCRYPTION KEY DEFINITION

我们需要启用 Azure 虚拟机复选框

参考文献:

  1. Configure column encryption using Always Encrypted with a DAC package - SQL Server | Microsoft Docs
  2. azure-sql-advanced-deployment-part4.
  3. KeyVaultAuthenticator.Validate(IList, CancellationToken) >> Microsoft.SqlServer.Dac.KeyVault Namespace | Microsoft Docs

我设法找到了解决方案。我降级了 sqlpackage.exe 版本。如果我理解正确的话,显然版本 19 似乎针对 SQL 服务器兼容级别 160,它随 SQL 服务器 2022 一起提供。使用版本 18 时,它似乎正在使用我的 Azure 当前的 150数据库设置为。