【问题标题】:The data types nvarchar(max) encrypted with with (encryption_type = 'DETERMINISTIC' xxx) are incompatible in the equal to operator使用 (encryption_type = 'DETERMINISTIC' xxx) 加密的数据类型 nvarchar(max) 在等于运算符中不兼容
【发布时间】:2020-10-09 12:42:37
【问题描述】:
var countryCode = new SqlParameter("@countryCode", SqlDbType.VarBinary);
var byteArray = Encoding.UTF8.GetBytes(dto.Country);
countryCode.Value = byteArray;
var country = new SqlParameter("@country", "country");
country.Value = "country";

var rawUsers = DbContext.Users.FromSqlRaw("Select u.* from AspNetUsers u join AspNetUserClaims uc on
                                            u.Id = uc.UserId where uc.ClaimType = @country and
                                            uc.ClaimValue = @countryCode", country, countryCode)
                              .ToList();

错误:

[17:16:22 ERR] 错误:使用 (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_WITH_AKV', column_encryption_key_database_name = 'MyDatabase') 和 varbinary( 2) 使用 (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_WITH_AKV', column_encryption_key_database_name = 'MyDatabase') 加密在等于运算符中不兼容。

顺便说一句,db 列是加密的,大多数 nvarchar 列都是加密的。

我一直在寻找解决方案以使其正确。但似乎没有任何作用。我错过了什么吗?谁能帮忙?

【问题讨论】:

  • 错误在这里告诉你问题。您无法使用等于 (=) 运算符将加密的 nvarchar(MAX) 与加密的 varbinary(2) 进行比较。
  • @Larnu 是的,我明白这一点。但仅仅理解它并不能解决它。明白我的意思吗?我一直在寻找使其兼容的方法。也尝试过转换,但没有人工作。这就是我问的原因。

标签: sql-server entity-framework encryption sqldatatypes deterministic


【解决方案1】:

AspNetUserClaims.ClaimValuenvarchar(max)

@countryCodevarbinary(2)

AlwaysEncrypted 是客户端加密。所以参数的加密值必须与列的加密值完全匹配。因此,无法进行服务器端隐式转换来进行比较,并且数据类型必须完全匹配。

因此您还需要将参数声明为nvarchar(max)。 EG

   var countryCode = new SqlParameter("@countryCode", SqlDbType.NVarChar,-1);
   countryCode.Value = dto.Country;

【讨论】:

  • 嗨@David Browne,谢谢。不过,我已经尝试过了。我不会得到解决方案的错误,但我期望的集合是空的。我尝试使用分析器,这是错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-13
  • 1970-01-01
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多