首页 > 解决方案 > SQL Server:始终加密的存储过程 - 列/变量的加密方案不匹配

问题描述

由于英国的法规变化,我们正在更改我们的数据库,以便在我们所有的个人可识别和潜在敏感数据上使用 Always Encrypted。

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

列/变量“@FilePath”的加密方案不匹配。列/变量的加密方案是 (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_Auto1', column_encryption_key_database_name = 'xxxxx') 并且行 '19' 附近的表达式期望它是 (encryption_type = ' PLAINTEXT')(或更弱)。

因此,当调查这一点并注释掉 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 行关键字“PROCEDURE”附近的语法不正确。消息 8180,级别 16,状态 1,过程 sp_describe_parameter_encryption,第 1 行 [批处理开始第 0 行]

无法准备报表。

执行批处理时出错。错误信息是:内部错误。Metadata for parameter '@p411c14c506c74dc690baf9ef724f7409' in statement or procedure 'CREATE PROCEDURE SIMONTEST AS BEGIN DECLARE @FilePath AS VARCHAR (8000) = @p411c14c506c74dc690baf9ef724f7409, @ParameterCode AS VARCHAR (50) = @p9f3729b1d64742cf858ff9edb30a5d71; SELECT @FilePath = ParameterValue FROM Parameter WHERE ParameterCode = @ParameterCode; 选择@文件路径;结尾

' 在 sp_describe_parameter_encryption 返回的结果集中缺失。

如果有人能帮助我理解这个问题并帮助我解决这个问题,我将不胜感激。

标签: sql-serverstored-proceduresalways-encrypted

解决方案


我不能确切地说出它为什么或如何工作,但在这里它对我有用

首先,我为 sproc 的 WHERE 子句中涉及的列禁用了加密(又名在 SSMS Always Encrypted 列加密对话框窗口中将 PLAINTEXT 设置为加密方法)

其次,我仅针对我需要执行的特定 ALTER 或 CREATE 禁用了 SSMS 中的参数化查询选项。您可以在查询 > 查询选项 > 执行 > 高级下找到它

第三,我修改/创建了我的 sproc,注意正确参数化 WHERE 子句的变量,以免比较运算符不兼容

第四,在没有您报告的错误的情况下执行创建/更改查询后,我重新启用了列加密方式。

Sprocs 最终执行得很好,而且(它需要进一步测试)似乎后续更改不需要上述步骤。但正如我所说,我不确定这一点。明天我再试一次。


推荐阅读