如何从始终加密的列 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
我已经在 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