数据层应用程序 (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 的列主密钥或列加密密钥的元数据对象。
注意
如果使用的是 SQL Server 2019 (15.x) 或更高版本 或 Azure SQL 数据库,并且 SQL Server 实例或数据库配置了安全 Enclave,则无需将数据移出数据库,即可就地运行加密操作。 请参阅使用具有安全飞地的 Always Encrypted 就地配置列加密。 若要使用 DAC 包触发就地加密,用户需要指定 EnclaveAttestationProtocol 和 EnclaveAttestationUrl 属性。
用于发布 DAC 包的权限(如果设置了具有安全 Enclave 的 Always Encrypted)
要在 DACPAC 和/或目标数据库中设置了具有安全 Enclave 的 Always Encrypted 的情况下发布 DAC 包,可能需要以下部分或所有权限,具体视 DACPAC 架构与目标数据库架构的差异而定。
ALTER ANY COLUMN MASTER KEY, ALTER ANY COLUMN ENCRYPTION KEY, VIEW ANY COLUMN MASTER KEY DEFINITION, VIEW ANY COLUMN ENCRYPTION KEY DEFINITION
如果升级操作触发了数据加密操作,则还需要密钥存储权限来访问和使用列主密钥。 有关密钥存储权限的详细信息,请参阅预配已启用 enclave 的密钥,查找与密钥存储相关的部分。