我使用的是"始终使用安全信封加密"。我创建了一个允许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。我还确保在查询选项中设置了"始终加密的启用参数化"。当我运行以下查询时,我得到一个错误:
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
定义计算列的表达式不能使用随机化加密对启用包围区的列执行任何计算
我理解计算列所涉及的开销,但在"ISNULL"的情况下,即使您连接到数据库时没有指定"始终加密"(在那里您只能看到加密的值(,列中为null的值始终为null,无论是否解密。目前,为了使我的应用程序可用,我需要将所有加密列声明为"not null"。虽然这似乎是一个小问题,但这只是我们可以允许为null的众多字段之一,当我们想从其他源导入数据时,导入程序需要在源数据中不存在字段的地方添加一个空字符串。虽然我们可以记录这种必要性,但我可以想象,创建进口商的人发现后会翻白眼。
另一方面,要求"not null"会使比较操作更容易一些。
感谢Martin Smith和sartoris将您的讨论作为答案发布,以帮助其他社区成员。
单列不能有某些带有
plain text
的行和某些带有always encrypted values
与好具有一个表达式,该表达式可以是非加密的纯文本,也可以是加密二进制