2016-12-05 27 views
1

我已經在表中加密了一列mob_no。 加密後的列,存儲過程出現錯誤。如何從始終加密的列中選擇存儲過程參數的值

我已經加入下面

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當運行這個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') (或更弱)。

回答

1

以下相等條件

@mobNo = '' 

在你的存儲過程將在服務器中進行評估。由於您使用的是始終加密,因此與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 
相關問題