为什么SQL Server存储过程将加密数据选择为变量失败

时间:2018-07-28 13:31:35

标签: sql-server always-encrypted xact-abort

将存储过程从加密列(始终加密)选择为变量的存储过程失败并出现错误

  

由于会话处于终止状态而无法继续执行

如果XACT_ABORT设置为打开。

删除SET XACT_ABORT ON;行可以使存储过程完美地工作,但尚不清楚它是如何关联的。

完全删除变量也可以修复错误。

环境:

  • 带有CU2(13.0.5153.0)的Microsoft SQL Server 2016企业(64位)Service Pack 2:当前最新版本。
  • Microsoft Windows NT 6.3(15063)

存储过程:

CREATE PROCEDURE [SomeStoredProcedure]
WITH EXECUTE AS OWNER
AS
BEGIN
    SET NOCOUNT ON;
    SET XACT_ABORT ON;

    DECLARE @EncryptedValue VARBINARY(4096);

    SELECT TOP 1
        @EncryptedValue = [someencryptedcolumn]
    FROM
        [sometable];

    SELECT @EncryptedValue

    RETURN 0;
END;

表声明:

CREATE TABLE [sometable]
(
    [someencryptedcolumn] [varbinary](4096)
                          ENCRYPTED WITH
                          (
                            COLUMN_ENCRYPTION_KEY = [CEK1],
                            ENCRYPTION_TYPE = Randomized,
                            ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'
                           )
                           NULL
)

样本数据:

INSERT INTO [sometable] ([someencryptedcolumn])
VALUES (NULL)

调用存储过程:

EXEC [SomeStoredProcedure];

错误:

  

第1级第29行第29行596消息
  由于会话处于终止状态,因此无法继续执行。

     

第20行,状态0,第29行的消息0
  当前命令发生严重错误。结果(如果有的话)应该被丢弃。

我没有找到有关XACT_ABORT和Always Encrypted如何关联的参考。

我还检查了SQL Server日志,但没有发现有关此问题的其他信息。

更新

Link to the registered SQL Server bug

1 个答案:

答案 0 :(得分:3)

这是产品中的错误。您应该首先尝试安装最新的SP / CU,以查看是否已修复,如果尚未修复,请向Microsoft报告。

我还可以在SQL Server 2017 RTM上重现此内容。我没有尝试安装最新的CU来查看是否可以改善情况。

它不特定于XACT_ABORT。您还可以在其他设置选项中看到相同的内容。如

  • SET DATEFIRST 5
  • SET ANSI_NULLS OFF

如果存在这些指针,它将结束两次调用sqllang.dll!CEnvColEncryptionKey::XretSchemaChanged,而第二次尝试取消对空指针的引用,并失败,并返回Access violation reading location 0x0000000000000000

SELECT @EncryptedValue)引发错误时的调用堆栈如下。

enter image description here