SQL登录映射到现有用户(SQL map a login to an existing user)

2019-07-31 08:44发布

我最近升级从SQL 2000我的开发环境,SQL 2008 R2。 我已经做了我们的生产数据库的备份和恢复了它我们新开发服务器。

我创建了反映我在生产服务器上使用登录开发服务器上登录,但我不能把它映射到数据库中的“DBO”用户。 当我编辑在登录的属性“用户映射”,我更换了与用户‘DBO’,我得到以下错误:

标题:Microsoft SQL Server管理Studio中创建失败,用户DBO“。 执行Transact-SQL语句或批处理时出现(Microsoft.SqlServer.Smo)例外。 (Microsoft.SqlServer.ConnectionInfo)用户,组,或角色“DBO”已存在在目前的数据库。 (微软SQL服务器,错误:15023)

那么,如何映射一个登录到现有的用户?

Answer 1:

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

这必须运行数据库的情况下,你需要固定的用户。



Answer 2:

我认为需要添加作为回答尼古拉Markovinović对这篇文章发表评论。 使用ALTER USER命令:

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

哪里:

  • {数据库}:包含孤儿用户数据库
  • {}用户:孤儿用户名
  • {}登录:登录名。 您可以使用相同的登录为旧服务器上使用或用户映射到不同的登录名

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



Answer 3:

在SQL Server 2012中,用户“DBO”不能被改变。



文章来源: SQL map a login to an existing user