我正在测试始终加密以潜在地在旧版应用程序中使用。为了进行测试,我在应用程序的基本查询表之一中加密了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').
答案 0 :(得分:0)
由于该过程已在应用加密之前存在,请尝试使用sp_refresh_parameter_encryption
刷新存储过程的始终加密的元数据。模块参数的加密元数据可以变成 如果已过时,则:
模块引用的表中某列的加密属性, 已更新。例如,一列已删除,而新 具有相同名称但加密类型不同的列,加密 密钥或加密算法已添加。
您可能需要对引用新加密对象的每个proc执行此操作:
EXEC sys.sp_refresh_parameter_encryption @name = '[YourSchema].[YourProc]'