SQL Server 2016始终加密 - 在视图中始终使用加密列的比较和计算表达式

问题描述:

我有一列"Amount" numeric(18,2),我使用SSMS v17的加密列向导进行了加密。列数据现在被加密。SQL Server 2016始终加密 - 在视图中始终使用加密列的比较和计算表达式

不过,我有一个使用类似的视图:

create SampleView 
as 
    Select 
     *, Amount * Rate as TotalAmount 
    From 
     SampleTable 
    Where 
     Amount > 0 
go 

Ratenumeric(18,8)类型。

我无法创建此视图。它提供了数据类型不兼容的错误,因为一列是加密的而另一列是明文。从我试过的各种排列中,我发现Where>子句带有> 0会导致问题,并且选择列表中的金额*比率不起作用。

有关Amount*Rate该错误是(I注释where子句)

操作数类型冲突:使用(将encryption_type = 'DETERMINISTIC',encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256',column_encryption_key_name ='加密数字(18,2) SampleDB_CEK”,column_encryption_key_database_name = 'SAMPLEDB')是不兼容的数字

相关Where Amount>0错误的是(我评论金额*价格在SELECT子句中)

的数据类型的数字(18,2)与(将encryption_type = 'DETERMINISTIC',encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256',column_encryption_key_name = 'SampleDB_CEK',column_encryption_key_database_name = 'SAMPLEDB')和TINYINT加密是在比操作者更大的不兼容。

我尝试了这些,但它没有工作,以及:

Where Amount > cast(0 as numeric(18,2) 
Select Amount * cast(Rate as numeric(18,2) 

,因为它是观点我们不能声明变量。而且这个视图在许多存储过程中得到了使用。

任何想法赞赏。

+0

请贴上确切的错误 – TheGameiswar

+0

@TheGameiswar我现在已经粘贴了确切的错误。谢谢。 – CleanBold

+0

看来where子句只支持where子句包含加密列时的相等查询 – TheGameiswar

加密列中不允许比较和数学运算。 目前加密列上唯一可能的操作是平等的。 bastos的答案将不起作用,因为SQL Server没有密钥。

您可能必须在客户端应用程序中实现此逻辑。

从官方文档

确定性加密总是生成 任何给定的纯文本值相同的加密值。使用确定性加密允许在加密的 列中查找点,等式连接,分组和索引。但是,也可能允许未经授权的用户通过检查加密列中的模式来猜测 有关加密值的信息,尤其是在加密值(如True/False或North/South/East /西部地区。 确定性加密必须使用字符列的排序顺序的列排序规则。

随机加密使用方法 以不太可预测的方式加密数据。随机加密 更安全,但会阻止搜索,分组,索引和 加入列。