Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server 2016始终加密-在视图中使用始终加密列进行比较和计算表达式_Sql Server_Sql Server 2016_Always Encrypted - Fatal编程技术网

Sql server SQL Server 2016始终加密-在视图中使用始终加密列进行比较和计算表达式

Sql server SQL Server 2016始终加密-在视图中使用始终加密列进行比较和计算表达式,sql-server,sql-server-2016,always-encrypted,Sql Server,Sql Server 2016,Always Encrypted,我有一个列“Amount”数字(18,2),我使用SSMS v17的加密列向导对其进行了加密。列数据现在已加密 但是,我有一个视图使用了如下内容: create SampleView as Select *, Amount * Rate as TotalAmount From SampleTable Where Amount > 0 go 列Rate的类型为numeric(18,8) 我无法创建此视图。它

我有一个列
“Amount”数字(18,2)
,我使用SSMS v17的加密列向导对其进行了加密。列数据现在已加密

但是,我有一个视图使用了如下内容:

create SampleView 
as
    Select 
        *, Amount * Rate as TotalAmount 
    From 
        SampleTable 
    Where 
        Amount > 0
go
Rate
的类型为
numeric(18,8)

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

Amount*Rate
相关的错误是(我注释了Where子句)

操作数类型冲突:使用(加密类型='DETERMINISTIC',加密算法名称='AEAD\U AES\U 256\U CBC\U HMAC\U SHA\U 256',列加密\U key\U name='SampleDB\U CEK',列加密\U key\U数据库名称='SampleDB')加密的数字(18,2)与数字不兼容

其中Amount>0相关的错误是(我在Select子句中注释了Amount*Rate)

在大于运算符中,使用(加密类型='DETERMINISTIC',加密算法名称='AEAD\u AES\u 256\u CBC\u HMAC\u SHA\u 256',列加密\u key\u name='SampleDB\u CEK',列加密\u key\u数据库名称='SampleDB')和tinyint加密的数据类型numeric(18,2)不兼容

我试过这些,但效果不太好:

Where Amount > cast(0 as numeric(18,2)
Select Amount * cast(Rate as numeric(18,2)
我们不能声明变量,因为它是视图。这个视图正在许多存储过程中使用


任何想法都值得赞赏。

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

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

来自官方文件

确定性加密始终为 任何给定的纯文本值。使用确定性加密允许 加密数据的点查找、相等联接、分组和索引 柱。但是,也可能允许未经授权的用户猜测 通过检查 加密列,特别是如果存在一小组可能的 加密值,如真/假或北/南/东/西区域。 确定性加密必须使用具有二进制2的列排序规则 字符列的排序顺序

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


请准确粘贴error@TheGameiswar我现在已经粘贴了准确的错误。谢谢。当where子句包含加密列时,where子句似乎只支持相等查询。我看不到任何文档支持此
Amount*Rate
失败的原因,但我想,这应该是因为加密列无法参与任何具有普通列的操作。有关更多信息,请参见此: