1

我已经加密了表中的一列 mob_no。加密列后,存储过程出错。

我在下面添加了sp

create procedure get_cut

@mobNo varchar(50),

@custId int 

As 

Begin

if(@mobNo = null or @mobNo = '')

Begin

    select @mobNo = mob_no  
    from table1 where cust_id = @custId



End

select cust_name from tbl_cust where mob_no = @mobNo and cust_id = @custId


End

运行此 sp 时出现以下错误

消息 33299,列/变量“@mobNo”的加密方案不匹配。列/变量的加密方案是 (encryption_type = 'PLAINTEXT') 并且行 '9' 附近的表达式期望它是 (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'xxxx', column_encryption_key_database_name = ' mydb') (或更弱)。

4

1 回答 1

1

以下相等条件

 @mobNo = '' 

在您的存储过程中将在服务器中进行评估。由于您使用的是 Always Encrypted,因此与 mobNo 对应的列作为二进制数据存储在服务器中。服务器将无法比较数据库中的值,''因为服务器不知道对应的加密二进制值''

您可以修改存储过程以采用 3 个参数而不是 2 个参数,如下所示:

create procedure get_cut
@mobNo varchar(50),    
@custId int,
@emptyString varchar(50)
...
if(@mobNo is null or @mobNo = @emptyString)
...

注意: is null代替= null

您可以将值传递''

  • 如果您SqlCommand使用应用程序执行存储过程或
  • 如果您使用 Sql Server Management Studio 执行存储过程,请查找Always Encrypted 的参数化,以了解如何发送针对加密列的纯文本值

例如,在 SSMS中,(Requires at least SSMS version 17.0.)您可以执行以下操作:

Declare @emptyStringVar varchar(50) = ''
Declare @mobNoVar varchar(50) = '000-000-0000'
EXEC get_cut 
@mobNo varchar = @mobNoVar  
@custId int = 1234
@emptyString @emptyStringVar 
于 2016-12-08T23:59:22.023 回答