【问题标题】:Stored proc Always Encrypted and CASE with default value存储过程始终加密和具有默认值的 CASE
【发布时间】:2019-06-18 10:22:25
【问题描述】:

我正在测试始终加密以可能在旧版应用程序中使用。对于测试,我在应用程序的一个基本查找表中加密了 NVARCHAR 列。我收到了来自加密向导的警告,警告我某些存储过程未达到要求。 在检查过程后,我注意到它抱怨加密列上的特定 CASE 语句。(注意:加密列是 adl.adl_Text NVARCHAR(50) )。在表 PK 为空的情况下,该列返回一个默认值(预定义的字符串)。我知道 ISNULL 可能在这里工作,但这是问题的一个例子。 加密列没有进行字符串比较,所以我有点困惑问题是什么。

我尝试在过程顶部使用常量而不是查询内联的文字字符串。

DECLARE @add_removed NVARCHAR(50)
SET @add_removed = 'Address Removed'

SELECT addr.Field1
  , addr.Field2
  , CASE WHEN addr.FieldPK IS NULL THEN @add_removed ELSE adl.adl_Text END AS StatusReason
FROM address addr
LEFT JOIN Address_Delete_Reason adl ON adl.PK = addr.adl_FK

我以前有:

SELECT addr.Field1
  , addr.Field2
  , CASE WHEN addr.FieldPK IS NULL THEN 'Address Removed' ELSE adl.adl_Text END AS StatusReason
FROM address addr
LEFT JOIN Address_Delete_Reason adl ON adl.PK = addr.adl_FK

我得到的错误是:

Error: Operand type clash: varchar 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 = 'DBTEST').

【问题讨论】:

  • 问题是该列返回给客户端进行解密。所以它不可能有一些加密值和一些纯文本值的混合。
  • 我想知道如何重构使用这些类型的存储过程的遗留应用程序。您是否必须向有问题的存储过程添加额外的参数?即使不用于与加密列进行比较,驱动程序是否知道它必须加密该参数?
  • 将这些值作为参数传递给 SP 是一种选择。另一种是将它们写入数据库中的一个表中,以同样的方式加密文本列,当你需要一个值时,从这个帮助表中读取它。

标签: sql-server tsql stored-procedures encryption always-encrypted


【解决方案1】:

由于该过程在应用加密之前就存在,请尝试使用sp_refresh_parameter_encryption刷新存储过程的始终加密的元数据

模块参数的加密元数据可以变成 过时的,如果:

模块引用的表中列的加密属性, 已更新。例如,一列已被删除,而新的 具有相同名称但加密类型不同的列,加密 已添加密钥或加密算法。

您可能需要为每个引用新加密对象的 proc 执行此操作:

EXEC sys.sp_refresh_parameter_encryption @name = '[YourSchema].[YourProc]'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 2018-10-10
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    相关资源
    最近更新 更多