sql-server – 不支持使用CommandBehavior = SequentialAccess检索加密列’xxx’

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

列(column3)之一是varchar(Max).

当我从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.

这就是我的表定义:

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
)

如果我删除column3上的加密,一切正常,我可以看到解密的值.

我在这里错过了什么吗?

《sql-server – 不支持使用CommandBehavior = SequentialAccess检索加密列’xxx’》

最佳答案 来自Always Encrypted团队的开发人员.

SQL Server和Azure SQL DB不允许从SSMS查询带有“列加密设置=启用”的VARCHAR(MAX)列,因为SSMS使用顺序访问来传输可能较大的varchar(MAX)值. SSMS通过设计强制执行此选择,因为它提供了一种查询大对象中的部分字节位置的机制(从而避免在内存中存储整个大blob).但是,相反,Always Encrypted不允许对加密列进行部分解密.这种限制源于我们使用分组密码并将HMAC存储在加密单元中的事实,没有完整的单元值,我们无法验证HMAC并解密数据.

或者,您可以从ADO.Net客户端(不使用SequentialAccess)使用“column encryption setting = enabled”查询varchar(max).

点赞