2016-10-28 16 views
0

Sqlサーバー2016で暗号化された列と非暗号化列との結合操作を実行する方法.net framework 4.6.1を使用しています。列暗号化設定=接続文字列で有効になります。Sql 2016常に暗号化 - 暗号化された列と非暗号化列との結合操作?

コード:

cmd = new SqlCommand("select determin.name as name from determin inner join determinjoin on determin.name = determinjoin.name ", con); 

エラー:

The data types varchar(20) encrypted with (encryption_type = 
'DETERMINISTIC', encryption_algorithm_name = 
'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_Auto4', 
column_encryption_key_database_name = 'depdb') collation_name = 
'Latin1_General_BIN2' and varchar are incompatible in the equal to operator. 
+0

この時点で、より深い質問をしてください。例えば、「このデータが暗号化に値するものなら、それはなぜいくつかのテーブルでのみ暗号化され、他のものでは暗号化されないのですか? –

+0

これは必須です。私は、1つのテーブルの暗号化された列と他のテーブルの暗号化されていない列に結合する必要があります。 – Karthikeyan

+1

これは可能ではないと思います。 SQL Serverに格納されている値は暗号化されています。列の暗号化の設定では、データページの基になる値は変更されません。 MSの常に暗号化されたアルゴリズムを使用して、暗号化されていない値をハッシュして、2つの値を結合で一致させる必要があります。 – dfundako

答えて

1

ようになり、することはできません。クエリプロセッサは、結合のために復号化するための鍵にアクセスすることはできません。本当に2つのテーブルを結合する必要がある場合は、両方の列を確定的な暗号化で暗号化する必要があります。

あなたはまだそれをやりたいとは思わないかもしれません。パフォーマンスは、数百万行以上のものであればどこからでも悪いものから悪いものへと変わります。本当に必要で、スキーマを変更するオプションがない場合は、テストして、ユーザーの見た目が変わらないかどうかを確認します。スキーマを微調整することができれば、これを簡単にするオプションがあります。たとえば、そのような結合に代替の列を使用します。サロゲートキーか、おそらくセキュリティに敏感でない自然なキーであってもかまいません。

関連する問題