SQL映射到现有用户的登录

时间:2012-09-04 17:31:40

标签: sql sql-server-2008

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

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

  

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

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

3 个答案:

答案 0 :(得分:13)

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

sp_change_users_login [ @Action = ] 'action'
[ , [ @UserNamePattern = ] 'user' ] 
[ , [ @LoginName = ] 'login' ] 
[ , [ @Password = ] 'password' ];

例如:

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

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

答案 1 :(得分:11)

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

USE {database}; 
ALTER USER {user} WITH login = {login}

其中:

  • {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

找到了这个答案

答案 2 :(得分:0)

在SQL Server 2012下,用户&#d;'不能改变。