

# 将数据库用户和对象与 SQL Server 只读副本同步
<a name="SQLServer.ReadReplicas.ObjectSynchronization"></a>

创建只读副本时主数据库实例中存在的任何登录名、自定义服务器角色、SQL 代理任务或其他服务器级对象，都应出现在新创建的只读副本中。但是，在创建只读副本后在主数据库实例中创建的任何服务器级对象不会自动复制，您必须在只读副本中手动创建它们。

数据库用户将自动从主数据库实例复制到只读副本。由于只读副本数据库处于只读模式，因此无法在数据库中更新数据库用户的安全标识符（SID）。因此，当在只读副本中创建 SQL 登录名时，务必确保该登录名的 SID 与主数据库实例中相应 SQL 登录名的 SID 相匹配。如果您未同步 SQL 登录名的 SID，这些登录名将无法访问只读副本中的数据库。经 Windows Active Directory（AD）身份验证的登录名不会遇到此问题，因为 SQL Server 从 Active Directory 获取 SID。

**将 SQL 登录名从主数据库实例同步到只读副本**

1. 连接到主数据库实例。

1. 在主数据库实例中创建新的 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. 检查主数据库实例中新创建的 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;
   ```
**注意**  
作为安全最佳实践，请指定除此处所示提示以外的密码。