You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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_descSQL_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),那Samsam会被视为不同用户。仔细检查脚本里的拼写、大小写是否和你创建的用户完全一致。

内容的提问来源于stack exchange,提问作者sazr

火山引擎 最新活动