Sql server SQL Server:始终加密的存储过程-列/变量的加密方案不匹配

Sql server SQL Server:始终加密的存储过程-列/变量的加密方案不匹配,sql-server,stored-procedures,always-encrypted,Sql Server,Stored Procedures,Always Encrypted,由于英国法规的变化,我们正在更改我们的数据库,以便在我们所有的个人身份和潜在敏感数据上使用始终加密的数据库 在进行所有加密后尝试运行存储过程时,我收到以下错误 列/变量“@FilePath”的加密方案不匹配。列/变量的加密方案为(加密类型='DETERMINISTIC',加密算法\名称='AEAD\ U AES\ U 256\ CBC\ U HMAC\ U SHA\ U 256',列加密\密钥\名称='CEK\ U Auto1',列加密\密钥\数据库\名称='xxxxx'),第'19'行附近的表

由于英国法规的变化,我们正在更改我们的数据库,以便在我们所有的个人身份和潜在敏感数据上使用始终加密的数据库

在进行所有加密后尝试运行存储过程时,我收到以下错误

列/变量“@FilePath”的加密方案不匹配。列/变量的加密方案为(加密类型='DETERMINISTIC',加密算法\名称='AEAD\ U AES\ U 256\ CBC\ U HMAC\ U SHA\ U 256',列加密\密钥\名称='CEK\ U Auto1',列加密\密钥\数据库\名称='xxxxx'),第'19'行附近的表达式预期为(加密\类型='明文')(或更弱)

因此,当调查这一点并注释出违规行时,SP创建并运行“罚款”

很好,因为它现在的值不正确

有问题的SQL是:

select @FilePath = ParameterValue from Parameter where ParameterCode = 'EXPORT_PATH'
所以,我把这行代码放到了它自己的SQL中,而不是SP中,让它像这样工作

DECLARE @FilePath VARCHAR(8000) = '',
@ParameterCode varchar(50) = 'EXPORT_PATH'

SELECT @FilePath  = ParameterValue from Parameter where ParameterCode = @ParameterCode
SELECT @FilePath
但是,当我将其封装到类似SP的

CREATE PROCEDURE SIMONTEST
AS
BEGIN
DECLARE @FilePath VARCHAR(8000) = '',
@ParameterCode varchar(50) = 'EXPORT_PATH'

SELECT @FilePath  = ParameterValue from Parameter where ParameterCode = @ParameterCode
SELECT @FilePath
END 
GO
我得到了错误

味精156,第15级,状态1,第1行 关键字“过程”附近的语法不正确。 Msg 8180,16级,状态1,程序sp_描述_参数_加密,第1行[批处理起始行0]

无法准备对账单

执行批处理时出错。错误消息是:内部错误。 语句或中参数“@p411c14c506c74dc690baf9ef724f7409”的元数据 过程“创建过程SIMONTEST” 作为 开始 声明@FilePath为VARCHAR(8000)=@p41c14c506c74dc690baf9ef724f7409,@ParameterCode为VARCHAR(50)=@p9f3729b1d6474cf858ff9edb30a5d71; 选择@FilePath=ParameterValue 从参数 其中ParameterCode=@ParameterCode; 选择@FilePath; 结束

sp_descripe_参数_encryption返回的结果集中缺少“”


如果有人能帮助我理解这个问题并帮助我度过难关,我将不胜感激

我不能确切地说出它为什么起作用,或者是如何起作用的,但这里是什么对我起作用了

首先,我禁用了存储过程WHERE子句中涉及的列的加密(即在SSMS Always Encrypted columns encryption对话框窗口中将明文设置为加密方法)

第二,我禁用了SSMS中的参数化查询选项,只用于我需要执行的特定更改或创建。您可以在查询>查询选项>执行>高级下找到它

第三,我修改/创建了存储过程,注意正确地参数化WHERE子句的变量,以避免在比较运算符中出现不兼容

第四,在执行了creation/alter查询之后,您报告说我重新启用了列加密,恢复了原来的方式


存储过程最终执行得很好,而且(还需要进一步测试)后续的更改似乎不需要上述步骤。但正如我所说,我对此不确定。明天我会再试一次。

我确实试过这个,或者至少是类似的东西,但没有给我带来任何积极的影响。我的问题是,我在许多表中有大量字段,存储过程和报告的大量存储过程和报告将在其中使用加密字段。您的意思是它不起作用,或者在您的场景中不可行,因为需要太多的更改?因为如果是前者,并且您尝试使用示例存储过程,您将看到它是有效的。。。刚刚用SSMS 17.6进行了测试。如果是后者,那么我只能告诉你这是你的电话,但要考虑你可能不需要触摸这个过程,因为正确的参数化可能是强制性的…在现实生活中,对涉及到的栏目进行暂时的明文处理可能会带来较少的痛苦。我们现在正在探索其他选项,将此作为第二个受欢迎的选项,但要获得SQL server的企业许可,以便与DDM一起进行TDE。如果我们回到这个选项上来,我将尝试这些方法,但这大约需要一周的时间来完成所有需要进行的存储过程、报告和模式更改,以及之后的测试。