繁体   English   中英

为什么我不能在加密的列上使用 ISNULL function?

[英]Why can't I use the ISNULL function on a column that is encrypted?

我正在使用“始终使用 Secure Enclaves 加密”。 我创建了一个允许 null 的加密列:

    MiddleName NVARCHAR(512) COLLATE Latin1_General_BIN2 ENCRYPTED 
    WITH (COLUMN_ENCRYPTION_KEY = [CEK_Loyal], 
    ENCRYPTION_TYPE = Randomized, 
    ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NULL

在 SSMS 中,我检查了“启用始终加密”并在连接对话框中提供了一个证明 URL。 我还确保在查询选项中设置了“为 Always Encrypted 启用参数化”。 当我运行以下查询时,出现错误:

    Select ISNULL(MiddleName, '') from TheTable

错误:

Operand type clash: varchar is incompatible with nvarchar(512) encrypted with
(encryption_type = 'RANDOMIZED',
 encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', 
 column_encryption_key_name = '{keyname}', 
 column_encryption_key_database_name = '{database}')

我在这里阅读: https://learn.microsoft.com/en-us/sql/relational-databases/security/encryption/always-encrypted-enclaves

定义计算列的表达式无法使用随机加密对启用 enclave 的列执行任何计算

我了解计算列所涉及的开销,但在“ISNULL”的情况下,即使您连接到数据库时未指定“始终加密”(您只能看到加密值),列中的值为 null总是 null,解密与否。 目前,为了使我的应用程序可用,我需要将所有加密列声明为“非空”。 虽然这似乎是一个小问题,但这只是我们允许 null 的众多字段之一,当我们想要从其他来源导入数据时,导入器将需要在字段不存在的地方添加一个空字符串在源数据中。 虽然我们可以记录这种必要性,但我可以很好地想象创建进口商的人在发现时会翻白眼。

另一方面,要求“不为空”将使比较操作更容易一些。

感谢Martin Smithsartoris发布您的讨论作为帮助其他社区成员的答案。

单列不能有一些带有plain text的行和一些带有always encrypted values的行同样适用于结果集。

具有可以是非加密纯文本或加密二进制的表达式

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM