Почему хранимая процедура SQL Server, выбирающая зашифрованные данные в переменную, дает сбой

Хранимая процедура, которая выбирает данные из зашифрованного столбца (Always Encrypted) в переменную, завершается с ошибкой

Невозможно продолжить выполнение, так как сеанс находится в состоянии уничтожения

если XACT_ABORT установлено на вкл.

Удаление SET XACT_ABORT ON; Строка заставляет хранимую процедуру работать отлично, но неясно, как она связана.

Полное удаление переменной также исправляет ошибку.

Среда:

  • Microsoft SQL Server 2016 Enterprise (64-разрядная версия) с пакетом обновления 2 (SP2) с CU2 (13.0.5153.0): последняя сборка на данный момент.
  • 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];

Ошибка:

Сообщение 596, уровень 21, состояние 1, строка 29
Невозможно продолжить выполнение, так как сеанс находится в состоянии уничтожения.

Сообщение 0, Уровень 20, Состояние 0, Строка 29
Произошла серьезная ошибка в текущей команде. Результаты, если таковые имеются, должны быть отброшены.

Я не нашел никаких ссылок на то, как связаны XACT_ABORT и Always Encrypted.

Я также проверил журналы SQL Server, но не нашел дополнительной информации по этой проблеме.

Обновление:

Ссылка на зарегистрированную ошибку SQL Server

1 ответ

Решение

Это ошибка в продукте. Сначала вы должны попытаться установить последнюю версию 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) как следует.

Другие вопросы по тегам