我有一个列"Amount" numeric(18,2)
,我使用SSMS v17的加密列向导对其进行了加密。列数据现在已加密。
但是,我有一个使用类似:
的视图create SampleView
as
Select
*, Amount * Rate as TotalAmount
From
SampleTable
Where
Amount > 0
go
列Rate
的类型为numeric(18,8)
。
我无法创建此视图。它给出了数据类型不兼容的错误,因为一列是加密的而另一侧是纯文本的。从我尝试的各种排列,我看到Where子句与> 0导致问题,并且数量*选择列表中的速率不起作用。
与Amount*Rate
相关的错误是(我评论了Where子句)
操作数类型冲突:使用(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')加密的数字(18,2)与数字
不兼容
与Where Amount>0
相关的错误是(我在Select子句中注释了Amount * Rate)
使用(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')加密的数字类型(18,2)和tinyint在大于运算符中不兼容。< / p>
我试过这些,但它也不起作用:
Where Amount > cast(0 as numeric(18,2)
Select Amount * cast(Rate as numeric(18,2)
我们无法声明变量,因为它是视图。此视图已在许多存储过程中使用。
任何想法都赞赏。
答案 0 :(得分:1)
加密列中不允许进行比较和数学运算。 目前,加密列上唯一可能的操作是相等。 bastos的答案不起作用,因为SQL Server没有密钥。
您可能必须在客户端应用程序中实现此逻辑。
来自官方文件
确定性加密始终为其生成相同的加密值 任何给定的纯文本值。使用确定性加密允许 对加密的点查找,等同连接,分组和索引 列。但是,也可能允许未经授权的用户猜测 通过检查中的模式来获取有关加密值的信息 加密列,特别是如果有一小部分可能的话 加密值,例如True / False或North / South / East / West区域。 确定性加密必须使用具有binary2的列排序规则 字符列的排序顺序。
随机加密使用方法 以较不可预测的方式加密数据。随机加密 更安全,但阻止搜索,分组,索引和 加入加密列。