不支持使用 CommandBehavior=SequentialAccess 检索加密列 'xxx'

Retrieving encrypted column 'xxx' with CommandBehavior=SequentialAccess is not supported

我已经设置了 Azure SQL 数据库并启用了 Always Encrypted。

其中一列(第 3 列)是 varchar(Max)

当我在不使用 "column encryption setting=enabled" 的情况下从 SSMS 查询数据库时,我可以看到所有列都有二进制数据。

当我使用 "column encryption setting=enabled" 从 SSMS 查询数据库时,出现如下错误:

An error occurred while executing batch. Error message is: Retrieving encrypted column 'column3' with CommandBehavior=SequentialAccess is not supported.

这就是我的 table 定义:

CREATE TABLE [dbo].[mytable](
    [column1] [varchar](2000) ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK_Auto1], ENCRYPTION_TYPE = Deterministic, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NULL,
    [column2] [datetime] ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK_Auto1], ENCRYPTION_TYPE = Deterministic, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NULL,
    [column3] [varchar](max) ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK_Auto1], ENCRYPTION_TYPE = Deterministic, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NULL
)

如果我删除第 3 列的加密,一切正常,我可以看到解密后的值。

我是不是漏掉了什么?

来自 Always Encrypted 团队的开发人员。

SQL 服务器和 Azure SQL 数据库不允许从 SSMS 使用 "column encryption setting=enabled" 查询 VARCHAR(MAX) 列,因为 SSMS 使用顺序访问来流式传输可能较大的 varchar(MAX) 值. SSMS 通过设计强制执行此选择,因为它提供了一种机制来查询大对象中的部分字节位置(从而避免在内存中存储整个大 blob)。但是,相比之下,Always Encrypted 不允许对加密列进行部分解密。此限制源于我们使用块密码并将 HMAC 存储在加密单元格中这一事实,如果没有完整的单元格值,我们将无法验证 HMAC 和解密数据。

作为替代方案,您可以从 ADO.Net 客户端(不使用 SequentialAccess)使用 "column encryption setting=enabled" 查询 varchar(max)。

此问题已在 2016 年 8 月发布的 SSMS 16.3 中修复。您现在可以查询和解密 varchar(max) 和其他 LOB 列。