该登录名已经有一个使用其他用户名的帐户


29

当我执行此SQL:

USE ASPState
GO
IF NOT EXISTS(SELECT * FROM sys.sysusers WHERE NAME = 'R2Server\AAOUser')
CREATE USER [R2Server\AAOUser] FOR LOGIN [R2Server\AAOUser];
GO

我收到以下错误:

该登录名已经有一个使用其他用户名的帐户。

我怎么知道这个不同的用户名是我的登录帐户?

Answers:


31

这意味着登录名[R2Server \ AAOUser]已映射到该数据库中的用户。或者,换句话说,另一个数据库用户正在使用此登录名。您可以通过以下查询查看哪个数据库用户正在使用您的登录名:

use YourDB
go
SELECT su.name as DatabaseUser
FROM sys.sysusers su
join sys.syslogins sl on sl.sid = su.sid
where sl.name = 'test' -- login

PS:不使用兼容性视图的脚本版本:

Select sp.name as LoginName, sp.type_desc as LoginType,
    dp.name as DBUser, dp.type_desc as UserType
from sys.server_principals sp
join sys.database_principals dp on dp.sid = sp.sid
where sp.name = 'test' -- your login

好的,我看到dbo正在显示的值。奇怪,我不记得我已经使用了dbo我的帐户了R2Server\AAOUser。想知道下一步该怎么做。
杰克

4
您是否使用该登录名创建了数据库以连接到服务器?如果是,则您是它的数据库所有者,不需要创建另一个用户。您已经设置好了。
玛丽安

实际上,我使用该命令aspnet_regsql -E -S .\MSSQLSERVER_R2 -ssadd来创建ASPState数据库。我想,即使我一开始就没有意识到,但我已经准备好了。
杰克

猜猜是什么:“-E->使用当前Windows凭据进行身份验证。” :-)
玛丽安

4
我会用sys.server_principalssys.database_principalssysusers并且syslogins仅用于向后兼容。
亚伦·伯特兰

4

这是一个“元数据事物” ...

有时,数据库用户在该数据库中发生的任何事情中都会被“破坏”。(如果恢复了数据库,我已经看到了类似的行为,并且恢复后的副本中的角色与您所覆盖的角色不同。这就是为什么我在下面进行尝试,从而为我解决了这个问题。)

  1. 在SSMS中打开“登录”属性->(“安全性|登录| 用户ID失败 |属性|用户映射”)。您可能会看到数据库已被检查并已分配了角色(完全正常)。

  2. 请注意提供错误的数据库上的权限,仅供参考。

  3. 取消选中该数据库并保存登录。
  4. 现在,重新运行查询以将登录名/角色添加到目标数据库中。它应该工作正常。

2
当我进入第3步时,我得到:Cannot drop the user 'dbo'. (Microsoft SQL Server, Error: 15150)
bkwdesign

我也收到Cannot drop the user 'dbo'.错误消息。我运行了该脚本,该脚本删除了有问题的用户映射并解决了问题:USE DATABASE_NAME; ALTER AUTHORIZATION ON DATABASE::DATABASE_NAME TO [sa]。有关更多信息,这是我使用的来源:blog.sql-assistance.com/index.php/cannot-drop-the-user-dbo
SherlockSpreadsheets
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.