2

我有一个"Amount" numeric(18,2)使用 SSMS v17 的加密列向导加密的列。列数据现在已加密。

但是,我有一个使用类似的视图:

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

该列Rate的类型为numeric(18,8)

我无法创建此视图。它给出了数据类型不兼容的错误,因为一列是加密的,而另一列是明文。从我尝试过的各种排列中,我看到 > 0 的 Where 子句导致问题,并且 Select 列表中的 Amount*Rate 也不起作用。

相关的错误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') 加密的 numeric(18,2) 与 numeric 不兼容

相关的错误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') 和 tinyint 加密的数据类型 numeric(18,2) 在大于运算符中不兼容。

我尝试了这些,但效果不佳:

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

我们不能声明变量,因为它是视图。这种视图正在许多存储过程中使用。

任何想法表示赞赏。

4

1 回答 1

2

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

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

来自官方文档

确定性加密总是为任何给定的纯文本值生成相同的加密值。使用确定性加密允许对加密列进行点查找、等式连接、分组和索引。但是,但也可能允许未经授权的用户通过检查加密列中的模式来猜测有关加密值的信息,特别是如果存在一小组可能的加密值,例如 True/False,或 North/South/East/West 区域。确定性加密必须对字符列使用具有 binary2 排序顺序的列排序规则。

随机加密使用一种以不太可预测的方式加密数据的方法。随机加密更安全,但会阻止对加密列进行搜索、分组、索引和连接。

于 2017-05-25T16:24:31.610 回答