【问题标题】:How to select value to stored procedure parameter from always encrypted column如何从始终加密的列中选择存储过程参数的值
【发布时间】:2016-12-05 14:32:22
【问题描述】:

我已加密表中的一列 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', 加密算法名称 = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'xxxx',column_encryption_key_database_name = 'mydb') (或更弱)。

【问题讨论】:

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


    【解决方案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 执行存储过程,请查找 Parameterization for 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 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-18
      • 2013-02-03
      • 2018-10-10
      • 1970-01-01
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多