SQL Server 2016 - 是否可以连接两个nvarchar始终加密的列?

时间:2017-05-29 11:29:09

标签: sql-server-2016 always-encrypted

我使用以下方法创建了一个表:

create table dbo.employee(firstname nvarchar(100) null,lastname nvarchar(100) null)

使用以下方法插入一些样本数据:

insert into dbo.employee values('Sachin','Tendulkar')
insert into dbo.employee values('Rohit','Sharma')
insert into dbo.employee values('Virendra','Sehwag')
insert into dbo.employee values('Irfan','Pathan')

然后我使用始终加密的向导使用SSMS v17加密此表的两个列。现在我试图将firstname与lastname连接起来:

select concat(firstname, lastname) from dbo.employee

它给了我以下错误:

  

操作数类型冲突:nvarchar(100)加密(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')是   与varchar不兼容

当我尝试这个时:

select firstname + lastname from dbo.employee

它出现以下错误:

  

列/变量' firstname'的加密方案不匹配,   '姓&#39 ;.列/变量的加密方案是   (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')   并且在线附近的表达式' 1'期望它是(encryption_type =   ' PLAINTEXT')(或更弱)。

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:3)

加密列上不允许连接。目前,加密列上唯一可能的操作是相等。这是因为SQL Server没有密钥。

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

来自官方文件

  

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

     

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

相关问题