21

我最近将我的开发环境从 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)

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

4

3 回答 3

17

要协调用户与登录名,可以使用系统存储过程 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

这必须在您需要固定用户的数据库的上下文中运行。

于 2013-05-10T01:56:55.893 回答
16

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

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

于 2014-05-12T17:50:44.400 回答
0

在 SQL Server 2012 下,无法更改用户“dbo”。

于 2016-03-11T17:16:43.353 回答