SQL映射到现有用户的登录

use*_*322 17 sql sql-server-2008

我最近将我的开发环境从SQL 2000升级到SQL 2008 R2.我已经完成了生产数据库的备份,并将其恢复为新的开发服务器.

我在开发服务器上创建了一个登录,它反映了我在生产服务器上使用的登录,但我无法将其映射到数据库中的'dbo'用户.当我在'用户映射'中编辑登录属性时,我用'dbo'替换用户,我收到以下错误:

标题:用户'dbo'的Microsoft SQL Server Management Studio创建失败.(Microsoft.SqlServer.Smo)执行Transact-SQL语句或批处理时发生异常.(Microsoft.SqlServer.ConnectionInfo)用户,组或角色"dbo"已存在于当前数据库中.(Microsoft SQL Server,错误:15023)

那么如何将登录映射到现有用户?

jwh*_*y58 13

要使用户与登录进行协调,可以使用系统存储过程sp_change_users_login.

sp_change_users_login [ @Action = ] 'action'
[ , [ @UserNamePattern = ] 'user' ] 
[ , [ @LoginName = ] 'login' ] 
[ , [ @Password = ] 'password' ];
Run Code Online (Sandbox Code Playgroud)

例如:

EXEC sp_change_users_login 'Update_One','User123','User123'

如果您有许多不同步的用户,您可以使用游标拉出所有用户并为他们运行此命令.对不同步的用户运行此操作没有任何不利影响,它将修复所有孤立用户.

DECLARE @sql NVARCHAR(MAX);
DECLARE curSQL CURSOR
FOR
       SELECT   'EXEC sp_change_users_login ''UPDATE_ONE'', ''' + name + ''', ''' + name + ''''
       FROM     sysusers
       WHERE    issqluser = 1
                AND name NOT IN ( 'guest', 'dbo', 'sys', 'INFORMATION_SCHEMA' )
OPEN curSQL
FETCH curSQL INTO @sql
WHILE @@FETCH_STATUS = 0 
     BEGIN
           EXEC (
           @sql
           )
           FETCH curSQL INTO @sql
     END
CLOSE curSQL
DEALLOCATE curSQL
Run Code Online (Sandbox Code Playgroud)

这必须运行您需要用户修复的数据库的上下文.


Zac*_*son 12

我认为NikolaMarkovinović对这篇文章的评论需要作为答案添加.使用Alter用户命令:

USE {database}; 
ALTER USER {user} WITH login = {login}
Run Code Online (Sandbox Code Playgroud)

哪里:

  • {database}:包含孤儿用户的数据库
  • {user}:孤儿用户名
  • {login}:登录名.您可以使用旧服务器上使用的相同登录名,也可以将用户映射到其他登录名

我在http://www.aip.im/2010/05/re-map-database-user-to-login-in-sql-server-after-restoring-or-attaching-database/#sthash找到了这个答案. fbazv94Z.dpuf