【发布时间】: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