Почему хранимая процедура 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, но не нашел дополнительной информации по этой проблеме.
Обновление:
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
) как следует.