还原SQL Server 2005数据库后,将所有用户链接到登录

Ian*_*ose 43 t-sql sql-server sql-server-2005

(注意这个问题询问关于链接所有用户,不同于要求链接单个用户的可能重复)

我希望在两台服务器之间移动一个数据库,我已经从第一台服务器上备份了数据库并在第二台服务器上完成了数据库恢复,到目前为止一直很好.

但是,我们的应用程序使用了数据库中定义的大量数据库用户.这些必须链接到master数据库中定义的登录.我已恢复数据库的服务器已定义所有登录,但它们具有不同的sid.

我不是T-SQL专家......

我认为sp_change_users_login是解决方案的一部分,但我无法找到如何让它自动将已恢复数据库中的所有用户链接到同名的登录名.

我们用于应用程序的数据库创建脚本创建用户和登录,但是在创建登录时它没有指定SID,因此出现此问题.现在如果我有时间机器......

(当我谷歌我得到很多点击,但他们大多是网站,不会让你看到答案,而不必先在网站上注册.)

PQW*_*PQW 41

是的,您可以通过执行以下操作来实现:

EXEC sp_change_users_login 'Auto_Fix' , 'TheUserName';
Run Code Online (Sandbox Code Playgroud)

但是,如果您的问题是我可以自动修复所有用户,那么这不会那样做.


Mik*_*Vee 27

我想出了以下内容.它工作得很好,因为它告诉你:

  1. 所有当前的孤儿用户.
  2. 哪些是固定的.
  3. 哪些无法修复.

其他解决方案要求您事先知道孤立的用户名以便修复.

以下代码可以在将数据库还原到另一台服务器后调用的sproc中运行.

脚本:

EXEC sp_change_users_login 'report'--See all orphaned users in the database.
DECLARE @OrphanedUsers TABLE
(
  IndexKey Int IDENTITY(1,1) PRIMARY KEY,
  UserName SysName,--nVarChar(128)
  UserSID  VarBinary(85)
)
INSERT INTO @OrphanedUsers
    EXEC sp_change_users_login 'report'

DECLARE @CRLF as nVarChar
    SET @CRLF = CHAR(10) + '&' + CHAR(13)--NOTE: Carriage-Return/Line-Feed will only appear in PRINT statements, not SELECT statements.
DECLARE @Sql as nVarChar(MAX)
    SET @Sql = N''
DECLARE @IndexKey as Int
    SET @IndexKey = 1
DECLARE @MaxIndexKey as Int
    SET @MaxIndexKey = (SELECT COUNT(*) FROM @OrphanedUsers)
DECLARE @Count as Int
    SET @Count = 0
DECLARE @UsersFixed as nVarChar(MAX)
    SET @UsersFixed = N''
DECLARE @UserName as SysName--This is an orphaned Database user.

WHILE (@IndexKey <= @MaxIndexKey)
  BEGIN
    SET @UserName = (SELECT UserName FROM @OrphanedUsers WHERE IndexKey = @IndexKey)
    IF 1 = (SELECT COUNT(*) FROM sys.server_principals WHERE Name = @UserName)--Look for a match in the Server Logins.
      BEGIN
        SET @Sql = @Sql + 'EXEC sp_change_users_login ''update_one'', [' + @UserName + '], [' + @UserName + ']' + @CRLF
        SET @UsersFixed = @UsersFixed + @UserName + ', '
        SET @Count = @Count + 1
      END
    SET @IndexKey = @IndexKey + 1
  END

PRINT @Sql
EXEC sp_executesql @Sql
PRINT   'Total fixed: ' + CAST(@Count as VarChar) + '.  Users Fixed: ' + @UsersFixed
SELECT ('Total fixed: ' + CAST(@Count as VarChar) + '.  Users Fixed: ' + @UsersFixed)[Fixed]
EXEC sp_change_users_login 'report'--See all orphaned users still in the database.
Run Code Online (Sandbox Code Playgroud)

结果:

在此输入图像描述

*注意:未修复的4个(在上面的示例屏幕截图中)在目标服务器中没有相应的用户数据库已恢复到.

  • 这对我来说很有用,除了少数用户(以及他们孤立的匹配登录),他们的名字中都有单引号(我很惊讶那些甚至是合法的!).我将传递给sp_change_users_login的params改为传递[username]而不是'username'然后那些用户也工作了(并且那些'正常'的用户也在更改后正确修复了.谢谢,@ MikeTeeVee获得了一个很棒的脚本! (2认同)