我正在使用SQL Server始终加密SSN列的功能。我创建了一个存储过程并从.net代码调用它。我在我的连接字符串中使用列加密设置= true。从.net代码调用动态存储过程会引发此错误:
操作数类型冲突:varchar与使用加密的varchar(4)不兼容(encryption_type =' DETERMINISTIC',encryption_algorithm_name =' AEAD_AES_256_CBC_HMAC_SHA_256',column_encryption_key_name =' ColumnKey' ,column_encryption_key_database_name =' DatabaseName')collation_name =' SQL_Latin1_General_CP1_CI_AS'
有人可以提供一个示例代码,用于通过使用参数化搜索加密列来检索数据吗?
CREATE PROCEDURE [dbo].[testSSN_Dynamic]
@Last4SSN VARCHAR(50)
AS
BEGIN
DECLARE @query NVARCHAR(4000);
SET @query = 'Select [SSNumber], [last4SSNumber] from table_XXX WHERE last4SSNumber = @Last4SSN ;'
EXEC sp_executesql @query, N'@Last4SSN varchar(4)', @Last4SSN ;
END
在应用程序中,SSN号码使用随机加密进行加密。 Last4SSNumber使用确定性加密进行加密。搜索基于SSN编号的最后4位数,并且经过筛选的列表将仅获得最后4个匹配数字的SSN编号,其余所有数字都在应用程序中被屏蔽。由于加密Randomized和deterministic都不支持类似操作,因此添加了列last4SSNumber。
当我在没有.NET代码的动态SQL的情况下调用上面的存储过程时,它工作正常,我能够检索匹配SSN最后4位数的列表..
在应用程序中,存在一些存储过程,其中传递了相当多的参数。搜索条件基于值是否传递给参数。 Last4SSNumber是传递的参数之一。我提供了一个简单的存储过程示例,而不是包含所有参数的整个存储过程。搜索条件是构建的,具体取决于传递给参数的值。
在各种帖子中,已经指出必须将动态SQL转换为参数化查询才能使用始终加密的on功能。我将参数化应用于上面的存储过程仍然在从.NET代码调用存储过程时收到错误。
答案 0 :(得分:0)
目前不支持使用动态SQL和针对加密列进行评估的参数。
不幸的是,Always Encrypted
不支持以下面的方式执行查询EXEC sp_executesql @query,N' @ Last4SSN varchar(4)',@ Last4SSN;
但是,如果您能够以下列方式重构存储过程,则可能有一个可行的解决方案。
CREATE PROCEDURE [dbo].[testSSN]
@Last4SSN VARCHAR(50)
AS
BEGIN
Select [SSNumber], [last4SSNumber] from table_XXX WHERE last4SSNumber = @Last4SSN ;
END