无法在SQL Server上为加密列应用max()

时间:2017-09-14 20:15:53

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

我有一个datetime列的表,该列使用SQL Server 2016上的“始终加密”功能进行加密。

现在我正在尝试执行这个简单的选择:

select max(dt_order) 
from orders 
where customer = 123;

我遇到了这个错误:

  

Msg 33299,Level 16,State 2,Line 5
  列/变量'dt_order'的加密方案不匹配。列/变量的加密方案是(encryption_type ='DETERMINISTIC',encryption_algorithm_name ='AEAD_AES_256_CBC_HMAC_SHA_256',column_encryption_key_name ='myColHML',column_encryption_key_database_name ='TESTING')并且行'1'附近的表达式期望它是(encryption_type =' PLAINTEXT')(或更弱)。

在SSMS中我已经设置了连接选项“列加密设置=启用”,并且我还设置了查询选项“启用参数化以始终加密”

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

由于您的数据是使用客户端上的密钥加密的,因此SQL Server将无法计算最大值。这是因为SQL Server没有密钥。 Always Encrypted的主要价值主张是它保护数据免受SQL Server管理员的攻击。目前,加密列上唯一可能的操作是相等。

来自官方文件

  

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

     

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