首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >还原SQL Server 2005数据库后将所有用户链接到登录

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

Stack Overflow用户
提问于 2009-05-15 10:45:10
回答 6查看 89.8K关注 0票数 45

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

我希望在两台服务器之间移动数据库,我已经从第一台服务器备份了数据库,并在第二台服务器上进行了数据库恢复,到目前为止一切顺利。

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

我不是T-SQL专家…。

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

我们用于应用程序的数据库创建脚本创建用户和登录,但是它在创建登录时没有指定SID,因此出现了这个问题。如果我有一台时光机。

(当我在谷歌上搜索时,我得到了很多结果,但它们大多是不让你看到答案的网站,除非首先在网站上注册。)

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-06-01 02:35:00

我想出了以下几点。它很好用,因为它向你展示了:

  1. 所有当前的孤立用户。
  2. 哪些用户已修复。
  3. 哪些用户无法修复。

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

以下代码可以在将数据库恢复到另一台服务器后调用的存储过程中运行。

脚本:

代码语言:javascript
复制
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.

结果:

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

票数 29
EN

Stack Overflow用户

发布于 2009-05-15 10:55:57

是的,您可以通过执行以下命令来完成此操作:

代码语言:javascript
复制
EXEC sp_change_users_login 'Auto_Fix' , 'TheUserName';

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

票数 42
EN

Stack Overflow用户

发布于 2016-04-22 17:24:18

如果:

代码语言:javascript
复制
EXEC sp_change_users_login 'Auto_Fix' , 'TheUserName';

不起作用,试试这个:

代码语言:javascript
复制
EXEC sp_change_users_login 'Auto_Fix', 'Username', NULL, 'p@ssword123'

我在这里找到的:http://dbadiaries.com/using-sp_change_users_login-to-fix-sql-server-orphaned-users

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/867986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档