如何从始终加密的列 select 值到存储过程参数

How to select value to stored procedure parameter from always encrypted column

我已经在 table 中加密了一列 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我得到了下面的错误

Msg 33299, Encryption scheme mismatch for columns/variables '@mobNo'. The encryption scheme for the columns/variables is (encryption_type = 'PLAINTEXT') and the expression near line '9' expects it to be (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'xxxx', column_encryption_key_database_name = 'mydb') (or weaker).

下面的相等条件

 @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