【问题标题】:SQL Server User Mapping Error 15023SQL Server 用户映射错误 15023
【发布时间】:2022-05-09 19:48:19
【问题描述】:

我尝试通过转到
Security > Logins > 右键单击​​ someuser > Properties > User Mapping > Select DB > set as db_owner 将我的其他 DB 映射到用户,然后确定,但我不断收到错误消息

当前数据库中已存在用户、组或角色“someuser”。 (Microsoft SQL Server,错误:15023)

是什么导致了错误,如何将该用户映射到数据库?

【问题讨论】:

  • 它是否在“恢复”的数据库中?
  • 我恢复了数据库,但是我怎么知道它是否在恢复呢?抱歉不熟悉这个东西

标签: sql sql-server


【解决方案1】:

要修复用户和登录映射,您需要在 SQL Server Management Studio 中打开一个查询窗口。输入以下两行并将 myDB 替换为数据库名称,将 myUser 替换为正确的用户名:

USE myDB

EXEC sp_change_users_login 'Auto_Fix', 'myUser'

如果运行成功,你应该得到如下输出:

The row for user '****' will be fixed by updating its login link to a login already in existence.

The number of orphaned users fixed by updating users was 1.

The number of orphaned users fixed by adding new logins and then updating users was 0.**

您的用户现在应该已正确映射。

编辑:

解决/修复孤立用户的新方法:

在 master 数据库中,使用带有 SID 选项的 CREATE LOGIN 语句重新创建丢失的登录名,并提供数据库用户的 SID。

CREATE LOGIN <login_name>   
WITH PASSWORD = '<use_a_strong_password_here>',  
SID = <SID>;  

要将孤立用户映射到 master 中已存在的登录名,请在用户数据库中执行 ALTER USER 语句,指定登录名。

ALTER USER <user_name> WITH Login = <login_name>;  

当您重新创建丢失的登录时,用户可以使用提供的密码访问数据库。然后用户可以使用 ALTER LOGIN 语句更改登录帐户的密码。

ALTER LOGIN <login_name> WITH PASSWORD = '<enterStrongPasswordHere>';  

【讨论】:

  • sp_change_users_login 现在已弃用/删除。概述了解决此问题的新方法here tl;博士:ALTER USER &lt;user_name&gt; WITH Login = &lt;login_name&gt;;
【解决方案2】:

如果只有一两个用户,那么最简单的方法是从恢复的数据库中删除数据库用户,使用 SSMS 将数据库用户重新映射到服务器登录。如果服务器登录不存在,则只需创建它,映射用户。

选项 2:如果要迁移大量用户,请使用 sp_help_revlogin。 sp_help_revlogin 是 Microsoft 提供的存储过程,可帮助将登录信息从一台服务器迁移到另一台服务器,包括密码和 SID。这是一篇关于它的好文章 SP_HELP_REVLOGIN :http://www.databasejournal.com/features/mssql/article.php/2228611/Migrating-Logins-from-One-SQL-Server-to-Another.htm

帮助使用它的代码补丁: 在查询分析器中运行以下 T-SQL 查询。这将在结果 pan 中返回数据库中的所有现有用户。

USE YourDB
GO
EXEC sp_change_users_login 'Report'
GO

在查询分析器中运行以下 T-SQL 查询以将登录名与用户名相关联。如果用户不存在,“Auto_Fix”属性将在 SQL Server 实例中创建用户。在以下示例中,“ColdFusion”是用户名,“cf”是密码。自动修复将当前数据库中 sysusers 表中的用户条目链接到 sysxlogins 中的同名登录。

USE YourDB
GO
EXEC sp_change_users_login 'Auto_Fix', 'ColdFusion', NULL, 'cf'
GO

在查询分析器中运行以下 T-SQL 查询以将登录名与用户名相关联。 ‘Update_One’ 链接当前数据库中的指定用户登录。登录必须已经存在。必须指定用户和登录名。密码必须为NULL或未指定

USE YourDB
GO
EXEC sp_change_users_login 'update_one', 'ColdFusion', 'ColdFusion'
GO

2) 如果登录帐户有权限删除其他用户,请在查询分析器中运行以下 T-SQL。这将删除用户。

USE YourDB
GO
EXEC sp_dropuser 'ColdFusion'
GO

在数据库中再次创建相同的用户,没有任何错误。

【讨论】:

    【解决方案3】:

    如果您将权限分配给数据库用户而不先将其映射到数据库,则会引发您提到的错误。

    您应该能够删除用户,将其映射到数据库,然后将用户分配给 db_owner 角色。

    【讨论】:

    • 不是真的,我让它工作了,只是用户存在于我要映射用户的指定/选定数据库中,需要从特定数据库中删除它,但是无需删除并重新创建用户。但是感谢淘汰先生的帮助
    • 正确 - 我使用的是登录(服务器级别)和用户(数据库级别)的术语。
    【解决方案4】:

    首先删除你的用户,然后执行下面的脚本:

    USE [YOURDB]
    GO
    CREATE USER [USERNAME] FOR LOGIN [USERNAME]
    GO
    USE [YOURDB]
    GO
    ALTER USER [USERNAME] WITH DEFAULT_SCHEMA=[dbo]
    GO
    

    【讨论】:

      【解决方案5】:

      我在尝试将生产数据库复制到本地测试数据库时遇到问题。在 SSMS 中,我确保在本地执行脚本之前断开与生产服务器的连接。然而,即使我以为我已经断开连接,有人指出生产数据库的标题仍然存在,并且我得到了对象已经存在的错误。解决方案是完全退出SSMS并重新启动,此时只连接到本地测试数据库。

      【讨论】:

        【解决方案6】:

        你可以通过展开数据库 -> 安全 -> 用户来解决问题 并删除用户'someuser',然后进入用户映射并分配。 有时会发生此问题,因为数据库用户“someuser”已从 SSMS 安全部分的“登录”中删除,并且数据库仍然拥有该用户

        【讨论】:

          猜你喜欢
          • 2013-08-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-22
          • 1970-01-01
          相关资源
          最近更新 更多