当我执行此SQL时:

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


我得到以下错误:用户名。


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

#1 楼

这意味着登录名[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值。奇怪,我不记得我为帐户R2Server \ AAOUser使用了dbo。想知道下一步该怎么做。

–杰克
13年2月22日在9:06

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

–玛丽安
13年2月22日在9:16

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

–杰克
13年2月22日在9:18



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

–玛丽安
13年2月22日在9:29

我将使用sys.server_principals和sys.database_principals。 sysusers和syslogins仅用于向后兼容。

–亚伦·伯特兰(Aaron Bertrand)
13年2月22日在14:23

#2 楼

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

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


在SSMS中打开Login属性
->(安全|登录|用户ID失败|属性|用户映射)。
您可能会看到DB已被检查并具有角色已分配
(完全正常)。
请注意给出错误的数据库权限,仅供参考。
取消选中该数据库并保存登录。
现在重新运行您的数据库查询以将登录名/角色添加到目标数据库中。
它应该可以正常工作。


评论


当我转到第3步时,我得到:无法删除用户'dbo'。 (Microsoft SQL Server,错误:15150)

– bkwdesign
17年12月21日在19:10

我还得到了不能删除用户'dbo'的信息。错误信息。我运行了该脚本,该脚本删除了有问题的用户映射并解决了该问题:USE DATABASE_NAME;将DATABASE :: DATABASE_NAME上的授权更改为[sa]。有关更多信息,这是我使用的来源:blog.sql-assistance.com/index.php/cannot-drop-the-user-dbo

–Sherlock电子表格
19 Mar 1 '19 at 14:04