将存储过程从加密列(始终加密)选择为变量的存储过程失败并出现错误
由于会话处于终止状态而无法继续执行
如果XACT_ABORT
设置为打开。
删除SET XACT_ABORT ON;
行可以使存储过程完美地工作,但尚不清楚它是如何关联的。
完全删除变量也可以修复错误。
环境:
存储过程:
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日志,但没有发现有关此问题的其他信息。
更新:
答案 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
)引发错误时的调用堆栈如下。