【发布时间】:2018-07-06 00:27:31
【问题描述】:
请帮助我修复 SQL Sever 2016 中的以下查询,其中列 FIRST_NAME、LAST_NAME 始终被加密。
SELECT * FROM MY_TABLE
WHERE (LAST_NAME LIKE '%[@,#,$,%,*]%' OR LAST_NAME LIKE '%,%')
OR (FIRST_NAME LIKE '%[@,#,$,%,*]%' OR FIRST_NAME LIKE '%,%');
我收到以下错误,因为列始终是加密的,而且我无法声明变量并将字符串分配给它。
Msg 206, Level 16, State 2, Line 1
Operand type clash: varchar(50) encrypted with (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_POC_CERTSTORE', column_encryption_key_database_name = 'UIM-LOCAL-DB') collation_name = 'Latin1_General_BIN2' is incompatible with varchar
【问题讨论】:
-
不就是加密列的点不解密就不能查询数据吗?可能是我误会了。
-
好吧,你不能。服务器没有 具有 加密密钥,因此它无法解密列以在服务器端执行通配符匹配,并且无法在内部重写
LIKE运算符,因此它以某种方式与加密数据。 -
一种可能的方法是让客户端在每次插入/更新时计算
WHERE,并将其结果(是/否)存储为标志,因此您只需执行@987654325 @。然后列的加密不再重要。这仅在这种情况下有效,因为LIKE模式是常量(模式的变化意味着您必须重新计算所有列)。
标签: sql-server encryption sql-server-2016 always-encrypted