我使用以下方法创建了一个表:
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')(或更弱)。
任何帮助表示感谢。
答案 0 :(得分:3)
加密列上不允许连接。目前,加密列上唯一可能的操作是相等。这是因为SQL Server没有密钥。
您可能必须在客户端应用程序中实现此逻辑。
来自官方文件
确定性加密始终为其生成相同的加密值 任何给定的纯文本值。使用确定性加密允许 对加密的点查找,等同连接,分组和索引 列。但是,也可能允许未经授权的用户猜测 通过检查中的模式来获取有关加密值的信息 加密列,特别是如果有一小部分可能的话 加密值,例如True / False或North / South / East / West区域。 确定性加密必须使用具有binary2的列排序规则 字符列的排序顺序。
随机加密使用一种以较少的方式加密数据的方法 可预测的方式。随机加密更安全,但可以防止 搜索,分组,索引和加入加密列。