1

テーブル内の 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 に対応する列はバイナリ データとしてサーバーに格納されます。サーバーはデータベース内の値を比較でき''ません。これは、サーバーが対応する暗号化されたバイナリ値を認識していないためです。''

次のように、ストアド プロシージャを変更して、2 つではなく 3 つの引数を取ることができます。

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 に答える