SQL Server 2016始终加密 - 使用视图

时间:2017-05-25 14:16:49

标签: sql-server sql-server-2016 always-encrypted

我有一个列"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)

我们无法声明变量,因为它是视图。此视图已在许多存储过程中使用。

任何想法都赞赏。

1 个答案:

答案 0 :(得分:1)

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

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

来自官方文件

  

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

     

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