2

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

无法继续执行,因为会话处于 kill 状态

如果XACT_ABORT设置为开。

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

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

环境:

  • Microsoft SQL Server 2016 Enterprise (64-bit) Service Pack 2 with CU2 (13.0.5153.0):目前最新版本。
  • 微软视窗 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];

错误:

Msg 596, Level 21, State 1, Line 29
无法继续执行,因为会话处于终止状态。

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

我没有找到关于 XACT_ABORT 和 Always Encrypted 如何相关的参考资料。

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

更新

链接到已注册的 SQL Server 错误

4

1 回答 1

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.

(by)抛出错误时的调用堆栈SELECT @EncryptedValue如下。

在此处输入图像描述

于 2018-07-29T12:28:18.173 回答