SQL2012 可用性グループの読み取りインテント セカンダリ レプリカで発生している問題を調査しようとしましたが、まだ何も見つからないようです。インスタンス レベルの TDE についてはいくつか見ましたが、データベース レベルの証明書については見ませんでした。
概要、暗号化/復号化にデータベース証明書を使用する暗号化された列を持つテーブルを持つデータベースがあります。可用性グループのセットアップと、データベースとレプリカの作成はすべてうまくいっているようです (3 つの個別のノード)。ただし、リスナー経由で 2 番目のノードの読み取り専用セカンダリ レプリカに読み取りインテント接続で接続しようとし、暗号化された列を使用してこのテーブルをクエリすると、返されるデータはすべて NULL です。最初にパスワードを使用してマスター キーを開き、クエリを発行すると、通常どおり復号化されたデータが返されますが、そのセッション接続の間だけ持続します。プライマリ レプリカとセカンダリ レプリカでのこの暗号化の問題以外はすべて正常に機能することに注意してください。readWrite を使用してプライマリ データベースにクエリを実行すると、データは正常に取得されます。
これが、各セッション接続が最初にマスターキーを開く必要がある読み取り専用レプリカへの読み取り意図としてクエリを実行するものであるかどうか、誰かが知っていますか? または、何か間違ったものを設定しましたか?これを修正するにはどうすればよいですか?
マスターキーを開くコマンド:
OPEN MASTER KEY DECRYPTION BY PASSWORD = 'password';
暗号化された列を表示するために使用されるクエリ:
SELECT CAST(DECRYPTBYCERT(CERT_ID('CertName'), ColName) AS VARCHAR(200)) aliasColName
FROM [DBName].[dbo].[tableName]
以下は、プライマリで証明書を作成するために使用される sql です。
USE DBName
DROP CERTIFICATE CertName;
GO
USE DBName
IF NOT EXISTS (SELECT * FROM sys.symmetric_keys
WHERE [name] LIKE '%DatabaseMasterKey%')
BEGIN
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password'
END
GO
USE DBName
OPEN MASTER KEY DECRYPTION BY PASSWORD = 'password'
ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY
GO
USE DBName
CREATE CERTIFICATE CertName FROM FILE = 'C:\Cert.cer'
WITH PRIVATE KEY ( FILE = 'C:\CertKey.pvk' ,
DECRYPTION BY PASSWORD = 'password' );
GO
CLOSE MASTER KEY
GO
皆さんありがとう!