SSMS 2018执行SQL脚本报错:用户'MHT.sam'不存在的问题咨询
排查SQL Server中“User or role 'MHT.sam' does not exist”错误的方案
我帮你梳理几个实用的排查方向,一步步定位问题:
先确认当前数据库上下文是否正确
很多时候这个错误是因为执行脚本时,你当前连接的数据库并不是sam所在的库。先执行这条语句查看当前数据库:SELECT DB_NAME();如果结果不是你创建
sam的目标库,记得在脚本开头加上USE [你的数据库名];,或者在SSMS的数据库下拉列表里切换到正确的库再执行脚本。检查用户的实际存在性和引用格式
首先在目标数据库里执行这条查询,确认sam确实存在且类型正确:SELECT name, type_desc FROM sys.database_principals WHERE name = 'sam';结果里应该能看到
sam,且type_desc为SQL_USER(对应你创建的“SQL user without login”类型)。
另外要注意MHT.sam的引用格式:- 如果
MHT是数据库名称,正确的引用应该是[MHT].[sam](用方括号避免名称冲突); - 如果
MHT是服务器名/域名,那完全不需要加——因为“SQL user without login”是数据库级专属用户,和服务器登录名无关,直接用sam或者[sam]即可,加服务器名反而会让SQL Server找不到这个用户。
- 如果
核对脚本中引用用户的具体场景
你是在什么语句里用到MHT.sam?比如授权、执行上下文切换?举两个常见场景的修正例子:- 如果是切换执行上下文:
错误写法:EXECUTE AS USER = 'MHT.sam';
正确写法(当前库为MHT时):EXECUTE AS USER = 'sam';
跨库引用时:EXECUTE AS USER = '[MHT].[sam]'; - 如果是给用户授权:
错误写法:GRANT SELECT ON dbo.YourTable TO MHT.sam;
正确写法(当前库正确时):GRANT SELECT ON dbo.YourTable TO sam;
- 如果是切换执行上下文:
确认用户的角色分配状态
虽然你说已经分配了角色,但可以再验证一下,执行这两条语句查看sam是否在角色成员列表中:EXEC sp_helprolemember 'db_datareader'; EXEC sp_helprolemember 'db_datawriter';或者用更直观的查询:
SELECT dp.name AS UserName, dr.name AS RoleName FROM sys.database_role_members drm JOIN sys.database_principals dp ON drm.member_principal_id = dp.principal_id JOIN sys.database_principals dr ON drm.role_principal_id = dr.principal_id WHERE dp.name = 'sam';排查大小写或拼写错误
如果你的数据库排序规则是区分大小写的(比如SQL_Latin1_General_CP1_CS_AS),那Sam和sam会被视为不同用户。仔细检查脚本里的拼写、大小写是否和你创建的用户完全一致。
内容的提问来源于stack exchange,提问作者sazr




