适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
数据层应用程序 (DAC) 包(也称为 DACPAC)是 SQL Server 数据库部署的一个可移植单元,它定义了所有 SQL Server 对象,包括表和表中的列。 将 DACPAC 发布到数据库(使用 DACPAC 升级数据库时),将更新目标数据库的架构以匹配 DACPAC 中的架构。 可以使用 SQL Server Management Studio、PowerShell 或 sqlpackage 中的升级数据层应用程序向导来发布 DACPAC。
本文介绍在 DACPAC 或目标数据库包含使用 Always Encrypted 保护的列时升级数据库的特殊注意事项。 如果 DACPAC 中列的加密方案与目标数据库中现有列的加密方案不同,则发布 DACPAC 将导致对该列中存储的数据进行加密、解密或重新加密。 有关详细信息,请参阅下表。
| 条件 | 操作 |
|---|---|
| 列已在 DACPAC 中加密,但未在数据库中加密。 | 将加密该列中的数据。 |
| 列未在 DACPAC 中加密,但已在数据库中加密。 | 将解密该列中的数据(将为该列删除加密)。 |
| 该列在 DACPAC 和数据库中都加密,但 DACPAC 中的列使用不同于数据库中相应列的加密类型或不同的列加密密钥。 | 将解密该列中的数据,然后重新加密,以匹配 DACPAC 中的加密配置。 |
部署 DAC 包还可能导致创建或删除用于 Always Encrypted 的列主密钥或列加密密钥的元数据对象。
性能注意事项
要执行加密操作,用于部署 DACPAC 的工具需要将数据移出数据库。 该工具会在数据库中创建具有所需加密配置的一个或多个新表,从原始表加载所有数据,执行请求的加密操作,将数据上传到新表,然后将原始表换为新表。 运行加密操作可能需要很长时间。 在此期间,您的数据库无法进行写入事务。
注意
如果使用的是 SQL Server 2019 (15.x),并且 SQL Server 实例配置了安全 Enclave,则无需将数据移出数据库,即可就地运行加密操作。 请参阅使用带有安全区域的 Always Encrypted 就地配置列加密。 就地加密不适用于 DACPAC 部署。
用于发布 DAC 包的权限(如果设置了 Always Encrypted)
若要在 DACPAC 或目标数据库中设置 Always Encrypted 时发布 DAC 包,可能需要以下部分或全部权限,具体取决于 DACPAC 中的架构与目标数据库架构之间的差异。
更改任何COLUMN MASTER KEY、更改任何COLUMN ENCRYPTION KEY、VIEW任何COLUMN MASTER KEY定义、VIEW任何COLUMN ENCRYPTION KEY定义
如果升级操作触发了数据加密操作,则还需要密钥存储权限来访问和使用列主密钥。 有关密钥存储权限的详细信息,请参阅创建并存储 Always Encrypted 的列主密钥,查找与密钥存储相关的部分。