在日志传送中在辅助服务器上创建用户

M.A*_*Ali 7 sql-server sql-server-2008-r2 log-shipping

我有一个生产服务器说ServerA我已经设置了日志传送到ServerB它处于只读模式。此日志传送的目的是降低生产服务器上一些昂贵查询(痛苦报告)的负载。

现在,如果我必须使用我们的域帐户创建一些登录。我不能这样做,因为辅助数据库在standby mode.

我想如果我在主服务器上创建这些登录名,它将被复制到辅助服务器,然后日志会在那里恢复,但事实并非如此。

我在网上做了很多研究,找到了解决这个问题的方法。我为此找到了以下资源。我尝试了本文中建议的所有方法,但似乎都不起作用。

1) Log Shipping in SQL Server 2008 R2 for set BI on replicated database

2) How to transfer logins and passwords between instances of SQL Server

3) Orphaned Users with Database Mirroring and Log Shipping

有人遇到过同样的问题吗?你做了什么?有没有办法解决这个问题?任何建议请任何指针。

Sim*_*rts 14

两种选择:

  • 在您的日志传送主服务器上,在该数据库中找到一个具有您想要的权限的用户(或创建一个)。如果您创建一个,那么日志传送将把它传送过来(因为它是一个数据库级对象)。然后,在主服务器上查找所需用户的 SID:select sid from sys.database_principals dp where type = 'S' and name = '<<YourUserNameHere>>'. (SID 基本上是一个唯一的 ID - 它完全不可读)然后,在辅助服务器上,使用指定的 SID 创建一个登录名:CREATE LOGIN [<YourLoginNameHere>>] WITH PASSWORD ='<<YourPasswordHere>>', SID = <<the SID from primary server>>。通过指定 SID,该登录名将与您登录的数据库中的用户具有相同的 SID - 然后您应该能够登录到该用户。
  • 在您的日志传送目标上创建一个具有服务器级权限(即 sysadmin)的登录名。由于多种原因,这是一个非常糟糕的主意(特别是如果您在该服务器上有其他数据库)。

创建用户的工作示例:我有一个名为 LogShippingTest 的数据库,我想在我的辅助服务器 db_datareader 上登录登录副本,以便 Marketing 可以读取内容。

在主服务器上:

USE [LogShippingTest];
CREATE USER [DataReaderForMarketing] WITHOUT LOGIN;
ALTER ROLE [db_datareader] ADD MEMBER [DataReaderForMarketing];
SELECT sid FROM sys.database_principals dp WHERE type = 'S' AND name = 'DataReaderForMarketing'
Run Code Online (Sandbox Code Playgroud)

假设 SID 是 0x70DD0D59ADF3FD4ABB000037826A2888(我只是编造的,但我们将从那里开始)。现在,要么强制运行日志传送,要么等待它自行运行并且用户存在于辅助端。然后,在辅助上:

USE [master];
CREATE LOGIN [DataReaderForMarketing] WITH 
   PASSWORD = 'ThisIsAVerySecurePassword', 
   SID = 0x70DD0D59ADF3FD4ABB000037826A2888 
Run Code Online (Sandbox Code Playgroud)

然后,您应该能够在辅助服务器上以 DataReaderForMarketing 登录名登录,并在已登录的辅助数据库上拥有 db_datareader。(您可以更改主数据库用户的权限,他们也会登录以应用于辅助数据库!)