3

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

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 加密此表的列。现在我正在尝试将名字与姓氏连接起来,如下所示:

select concat(firstname, lastname) from dbo.employee

它给了我以下错误:

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

当我尝试这个时:

select firstname + lastname from dbo.employee

它给出以下错误:

列/变量“名字”、“姓氏”的加密方案不匹配。列/变量的加密方案是 (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')(或更弱)。

任何帮助表示赞赏。

4

1 回答 1

3

不允许在加密列上进行串联。目前,对加密列唯一可能的操作是相等。这是因为 SQL Server 没有密钥。

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

来自官方文档

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

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

于 2017-05-30T17:29:21.113 回答