使用 Always Encrypted 和 DAC 包配置列加密

适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例

数据层应用程序 (DAC) 包(也称为 DACPAC)是 SQL Server 数据库部署的一个可移植单元,它定义了所有 SQL Server 对象,包括表和表中的列。 将 DACPAC 发布到数据库时(使用 DACPAC 升级数据库),目标数据库的架构将会更新以匹配 DACPAC 中的架构。 可以使用 SQL Server Management Studio、PowerShellsqlpackage 中的升级数据层应用程序向导来发布 DACPAC。

本文介绍了在 DACPAC 或/和目标数据库包含受 Always Encrypted 保护的列时升级数据库的特殊注意事项。 如果 DACPAC 中列的加密方案与目标数据库中现有列的加密方案不同,则发布 DACPAC 将导致对该列中存储的数据进行加密、解密或重新加密。 有关详细信息,请参阅下表。

条件 操作
列已在 DACPAC 中加密,但未在数据库中加密。 将加密该列中的数据。
列未在 DACPAC 中加密,但已在数据库中加密。 将解密该列中的数据(将为该列删除加密)。
列在 DACPAC 和数据库中均已加密,但 DACPAC 中的列所使用的加密类型或/和列加密密钥与数据库中的相应列不同。 将解密该列中的数据,然后重新加密,以匹配 DACPAC 中的加密配置。

部署 DAC 包也可能会导致针对 Always Encrypted 为列主密钥或列加密密钥创建或删除元数据对象。

性能注意事项

要执行加密操作,用于部署 DACPAC 的工具需要将数据移出数据库。 该工具会在数据库中创建具有所需加密配置的一个或多个新表,从原始表加载所有数据,执行请求的加密操作,将数据上传到新表,然后将原始表换为新表。 运行加密操作可能需要很长时间。 在此期间,数据库不可用于写入事务。

注意

如果使用的是 SQL Server 2019 (15.x),并且 SQL Server 实例配置了安全 Enclave,则无需将数据移出数据库,即可就地运行加密操作。 请参阅使用具有安全 enclave 的 Always Encrypted 就地配置列加密。 请注意,就地加密不适用于 DACPAC 部署。

用于发布 DAC 包的权限(如果设置了 Always Encrypted)

要在 DACPAC 和/或目标数据库中设置了 Always Encrypted 的情况下发布 DAC 包,可能需要以下部分或所有权限,具体视 DACPAC 架构与目标数据库架构的差异而定。

更改任意列主密钥密钥更改任意列加密密钥查看任意列主密钥定义查看任意列加密密钥定义

如果升级操作触发了数据加密操作,则还需要密钥存储权限来访问和使用列主密钥。 有关密钥存储权限的详细信息,请参阅创建并存储 Always Encrypted 的列主密钥,查找与密钥存储相关的部分。

后续步骤

另请参阅