【问题标题】:SQL Server 2016 always encrypted - comparison and calculated expression using always encrypted column in viewSQL Server 2016 始终加密 - 在视图中使用始终加密的列进行比较和计算表达式
【发布时间】:2017-05-25 14:16:49
【问题描述】:

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

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

任何想法表示赞赏。

【问题讨论】:

  • 请粘贴准确的错误
  • @TheGameiswar 我现在已经粘贴了确切的错误。谢谢。
  • 当 where 子句包含加密列时,似乎 where 子句仅支持相等查询
  • 我没有看到任何文档支持为什么这个Amount*Rate 失败,但我想应该是由于加密列无法参与正常列的任何操作

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


【解决方案1】:

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

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

来自官方文档

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多