

# データベース ユーザーとオブジェクトを SQL Server リードレプリカと同期する
<a name="SQLServer.ReadReplicas.ObjectSynchronization"></a>

新しく作成されたリードレプリカには、リードレプリカの作成時にプライマリ DB インスタンスに存在するログイン、カスタムサーバーロール、SQL エージェントジョブ、またはその他のサーバーレベルのオブジェクトが存在することが期待されます。ただし、リードレプリカの作成後にプライマリ DB インスタンスで作成されたサーバーレベルのオブジェクトは自動的にレプリケートされないため、リードレプリカで手動で作成する必要があります。

データベースユーザーは、プライマリ DB インスタンスからリードレプリカに自動的にレプリケートされます。リードレプリカデータベースは読み取り専用モードであるため、データベースユーザーのセキュリティ識別子 (SID) をデータベースで更新することはできません。そのため、リードレプリカに SQL ログインを作成するときは、そのログインの SID がプライマリ DB インスタンスの対応する SQL ログインの SID と一致していることを確認することが不可欠です。SQL ログインの SID を同期しないと、リードレプリカのデータベースにアクセスできなくなります。SQL Server は Active Directory から SID を取得するため、Windows Active Directory (AD) 認証ログインでこの問題は発生しません。

**プライマリ DB インスタンスからの SQL ログインをリードレプリカに同期するには**

1. プライマリ DB インスタンスに接続します。

1. プライマリ DB インスタンスに新しい SQL ログインを作成します。

   ```
   USE [master]
   GO
   CREATE LOGIN {{TestLogin1}}
   WITH PASSWORD = '{{REPLACE WITH PASSWORD}}';
   ```
**注記**  
セキュリティ上のベストプラクティスとして、ここに示されているプロンプト以外のパスワードを指定してください。

1. データベースに SQL ログイン用の新しいデータベースユーザーを作成します。

   ```
   USE [{{REPLACE WITH YOUR DB NAME}}]
   GO
   CREATE USER {{TestLogin1}} FOR LOGIN {{TestLogin1}};
   GO
   ```

1. プライマリ DB インスタンスで新しく作成された SQL ログインの SID を確認します。

   ```
   SELECT name, sid FROM sys.server_principals WHERE name =  '{{TestLogin1}}';
   ```

1. リードレプリカに接続します。新しい SQL ログインを作成します。

   ```
   CREATE LOGIN {{TestLogin1}} WITH PASSWORD = '{{REPLACE WITH PASSWORD}}', SID={{REPLACE WITH sid FROM STEP #4}};
   ```

**または、リードレプリカデータベースにアクセスできる場合は、孤立したユーザーを次のように修正できます。**

1. リードレプリカに接続します。

1. データベース内で孤立したユーザーを特定します。

   ```
   USE [{{REPLACE WITH YOUR DB NAME}}]
   GO
   EXEC sp_change_users_login 'Report';
   GO
   ```

1. 孤立したデータベースユーザーに SQL ログインを作成します。

   ```
   CREATE LOGIN {{TestLogin1}} WITH PASSWORD = '{{REPLACE WITH PASSWORD}}', SID={{REPLACE WITH sid FROM STEP #2}};
   ```

   例:

   ```
   CREATE LOGIN {{TestLogin1}} WITH PASSWORD = '{{TestPa$$word#1}}', SID={{0x1A2B3C4D5E6F7G8H9I0J1K2L3M4N5O6P}};
   ```
**注記**  
セキュリティ上のベストプラクティスとして、ここに示されているプロンプト以外のパスワードを指定してください。