将"始终加密"列插入临时表时出现问题



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

但是当我尝试将始终加密的列插入临时表时,我不允许这样做。

在进一步的研究中,我发现主数据库中使用的CMK,CEK也应该在tempdb中使用。所以我在临时数据库中使用"创建"语句创建了相同的 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')

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

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

  1. 无威达查(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,则该密钥实际上是一个新的唯一密钥,并且与另一个密钥不兼容。看起来Microsoft想避免这种潜在的灾难性情况。

请描述您对临时表的处理方式。对于临时表的速度,有一个很好的替代方案,例如插入到带有TABLOCK或TABLOCKX的永久表中

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

相关内容

  • 没有找到相关文章

最新更新