简单的解决方案是为SSN的第一个字符添加未加密的列。和 这是艰难的 。
我的猜测是,通过加密列,每次查询时都会强制进行全表扫描(尽管检查计划是否确定)。通过SSN创建索引会使加密变得毫无意义。
一个难以克服的问题是使用通配符搜索需要某种索引或表扫描,这需要对每一行进行解密。
通过预加密搜索值来优化,以允许索引加密值。
如果您要求显式匹配,您可以执行类似的操作,请注意加密是在输入值而不是列上完成的:
select Client_ID from tblClient (nolock) where SSN = convert(nvarchar(11), ENCRYPTBYKEY(@SSN))
但是......对于搜索,您可能希望通过将SSN的片段分开来实现这种优化 索引 字段,然后解析输入字符串,并做
select Client_ID from tblClient (nolock) where SSNFIRST3 = convert(nvarchar(3), ENCRYPTBYKEY( <parsed prefix here> )) and SSNSECOND2 = convert(nvarchar(2), ENCRYPTBYKEY( <parsed middle section here> ))
您只对输入值进行加密/解密,而不是对行进行加密/解密。
假设您编写了一些简单的正则表达式代码,将搜索字符串解析为单独的部分以提供上述查询。上述情况的影响至少可以使用索引搜索,因为访问的行数有限,所以索引搜索应该比现在快得多。
编辑:我的意思是ENCRYPTBYKEY,改变了上面。