存储过程中始终加密的查询

时间:2019-10-22 15:59:21

标签: sql-server stored-procedures always-encrypted

我正在尝试从使用“始终加密”功能加密的列中检索值。在SSMS中,我已指定“列加密设置=已启用”连接选项,并且还启用了“为始终加密启用参数化”设置。

此查询由其自身执行,按预期方式工作。

DECLARE @value varchar(25) = '345'

SELECT PrivateID
FROM TestDB.dbo.tblData
WHERE PrivateID = @value

但是,如果我尝试将其放入存储过程中

ALTER PROCEDURE dbo.Test
AS
BEGIN
    DECLARE @value varchar(25) = '345'

    SELECT PrivateID
    FROM TestDB.dbo.tblData
    WHERE PrivateID = @value
END
GO

我收到错误消息:

  

第156条消息,第15级,状态1,第1行
  关键字“ PROCEDURE”附近的语法不正确。

     

第156条消息,第15级,状态1,第1行
  关键字“ PROCEDURE”附近的语法不正确。

     

第156条消息,第15级,状态1,第1行
  关键字“ PROCEDURE”附近的语法不正确。

     

第156条消息,第15级,状态1,第1行
  关键字“ PROCEDURE”附近的语法不正确。

     

消息8180,级别16,状态1,过程sp_describe_parameter_encryption,第1行[批处理开始第0行]
  无法准备声明。

     

消息8180,级别16,状态1,过程sp_describe_parameter_encryption,第1行[批处理开始第0行]
  无法准备声明。

     

消息8180,级别16,状态1,过程sp_describe_parameter_encryption,第1行[批处理开始第0行]
  无法准备声明。

     

消息8180,级别16,状态1,过程sp_describe_parameter_encryption,第1行[批处理开始第0行]
  无法准备声明。

     

执行批处理时发生错误。错误消息是:内部错误。语句或过程'ALTER PROCEDURE dbo.Test'中参数'@ p850913a51d1247f290af5a8e7dd24f25'的元数据       如       开始           十进制@value AS VARCHAR(25)= @ p850913a51d1247f290af5a8e7dd24f25;           选择私人ID           从TestDB.dbo.tblData           在哪里PrivateID = @value;       sp_describe_parameter_encryption返回的结果集中缺少“ END”。

使用存储过程从始终加密的列中获取结果的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

我通过MSDN论坛帖子“ always encrypted query within stored procedure”找出了导致此错误的原因。

当尝试创建(或更改)在SSMS中启用了参数化的存储过程时,这是在我看到原始帖子中的错误之前,跟踪已提交给服务器的内容(参考sp_describe_parameter_encryption

<Style TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type Button}}" x:Key="StyleKey">
    <Setter Property="Background" Value="{StaticResource SteelBrush}"/>
…
</Style>

要完成我要测试的内容,我只需要在下面创建简单的存储过程即可。

exec sp_describe_parameter_encryption N'ALTER PROCEDURE [dbo].[Test]
AS
BEGIN
    DECLARE @value AS VARCHAR (25) = @p9f7f4f9078e14e1e8b661791c0c1348a;
    SELECT PrivateID
    FROM   TestDB.dbo.tblData
    WHERE  PrivateID = @value;
END

',N'@p9f7f4f9078e14e1e8b661791c0c1348a varchar(25)'

然后在SSMS中启用参数设置,按如下所示执行它。

ALTER PROCEDURE dbo.Test
    @PrivateID varchar(25) 
AS
BEGIN
    SELECT PrivateID
    FROM TestDB.dbo.tblData
    WHERE PrivateID = @PrivateID
END