存储的过程始终加密,并带有默认值的CASE

时间:2019-01-24 16:03:43

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

我正在测试始终加密以潜在地在旧版应用程序中使用。为了进行测试,我在应用程序的基本查询表之一中加密了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').

1 个答案:

答案 0 :(得分:0)

由于该过程已在应用加密之前存在,请尝试使用sp_refresh_parameter_encryption

刷新存储过程的始终加密的元数据。
  

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

     

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

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

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