请帮助我在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
不幸的是,如果FIRST_NAME和LAST_NAME始终加密,则无法使用 LIKE 运算符搜索字符串。
查询可以对使用确定性加密加密的列执行相等比较,但不能执行其他操作(例如,大于/小于、使用 LIKE 运算符的模式匹配或算术运算(。
参考: https://learn.microsoft.com/en-us/sql/relational-databases/security/encryption/always-encrypted-database-engine
> 从SQL Server 2019开始,安全隔区功能允许完全查询始终加密的列 - 与LIKE,范围和排序的模式匹配 - 包括随机列(不仅仅是确定性(。
如果不使用安全隔区,查询仅限于搜索完全匹配项。("始终加密"字段也可用于"联接"、"分组依据"和"非重复"。
安全飞地Microsoft简介:
https://learn.microsoft.com/en-us/sql/relational-databases/security/encryption/always-encrypted-enclaves?view=sql-server-ver15
[此链接取代了之前不幸消失的RedGate链接]