【问题标题】:Issue while inserting Always Encrypted columns into Temp table将 Always Encrypted 列插入 Temp 表时出现问题
【发布时间】:2019-09-01 09:23:25
【问题描述】:

我在本地数据库中探索 SQL Server 2016 中的始终加密功能。在我们的项目中,我们在存储过程、作业等中广泛使用临时表。

但是当我尝试将 Always Encrypted 列插入临时表时,我不允许这样做。

在进一步的研究中,我发现在主数据库中使用的 CMK、CEK 也应该在 tempdb 中使用。所以我在临时数据库中使用“create”语句创建了相同的 CMK、CEK。

但问题仍然存在,这不允许我将主表中的 AE 列数据插入临时表,该临时表也使用相同的密钥进行加密。

获取错误:Operand type clash: nvarchar(50) encrypted with (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_Auto1', column_encryption_key_database_name = 'testDB') is incompatible with nvarchar(50) encrypted with (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_Auto1', column_encryption_key_database_name = 'tempdb')

非常感谢任何帮助解决此问题。

【问题讨论】:

  • 可能需要重新启动/sql 服务重新启动 - 许多临时数据库属性仅在每次服务重新启动时首次创建临时数据库时应用。
  • @SqlSurfer :重启sql服务后测试相同。仍然没有运气。获取Operand type clash: nvarchar(50) encrypted with (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_Auto1', column_encryption_key_database_name = 'testDB') is incompatible with nvarchar(50) encrypted with (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_Auto1', column_encryption_key_database_name = 'tempdb') 错误

标签: sql-server temp-tables always-encrypted


【解决方案1】:

您发现了始终加密的限制。它不允许跨数据库使用密钥。除了可以在 CREATE TABLE 语句中描述的列数据类型的 4 个组成部分,即:

  1. NVARCHAR(50)
  2. encryption_type = '确定性'
  3. encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256'
  4. column_encryption_key_name = 'CEK_Auto1'

SQL Server 添加了第 5 个组件——数据库名称:

  1. column_encryption_key_database_name = 'testDB'

尽管其他元素是相同的,但这会呈现特定于数据库的数据类型。

我认为这是一种内置的保护措施,旨在保护开发人员免受自身伤害,因为无法保证一个数据库中名为 CEK_Auto1 的密钥与另一个数据库中的 CEK_Auto1 相同。您使用的方法(我假设涉及从第一个数据库的 CEK 和 CMK 生成 CREATE 脚本)确实确保密钥元数据是相同的,并且将使用相同的证书(主加密密钥)进行加密/解密。

但是,如果开发人员使用 SSMS 在第二个数据库中生成与第一个同名的新 CEK,则该密钥实际上是一个新的唯一密钥,并且与另一个不兼容。看起来微软希望避免这种潜在的灾难性场景。

请描述您如何处理临时表。临时表的速度有一个很好的替代方案,例如使用 TABLOCK 或 TABLOCKX 插入永久表

使用加密列有很多限制,最重要的是您不能对查询中的内容进行任何处理。处理需要以明文形式提供数据,这需要临时拥有行的副本以在不加密的情况下进行处理。

【讨论】:

  • 请将我的回答标记为有用 - 即使您希望修复,在这种情况下是不可能的。
猜你喜欢
  • 2021-07-05
  • 1970-01-01
  • 2020-07-26
  • 2011-08-22
  • 1970-01-01
  • 2020-04-24
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多