You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无sysadmin服务器角色的SQL Server新登录账户无法登录数据库引擎问题求助

解决SQL Server登录错误18456 State 146(无需赋予sysadmin权限)

我之前也碰到过一模一样的问题,折腾了好一阵才找到根源——明明给了CONNECT SQL权限和数据库读写权限,却死活登不上,一给sysadmin就正常。分享几个你可能遗漏的关键配置点:

1. 用T-SQL确认CONNECT SQL权限是否真的生效

有时候通过SSMS GUI授予权限会因为缓存或者界面逻辑问题没真正落地,直接用T-SQL查更靠谱:

USE master;
GO
SELECT name, permission_name, state_desc 
FROM sys.server_permissions sp
JOIN sys.server_principals spri ON sp.grantee_principal_id = spri.principal_id
WHERE spri.name = 'example';

如果结果里没有CONNECT SQL且state_desc为GRANT,就手动执行授予语句:

USE master;
GO
GRANT CONNECT SQL TO [example];
GO

执行完再重新登录试试,很多时候这一步就能解决问题。

2. 检查登录账户的默认数据库设置

如果你的登录账户默认数据库是master(或者其他未映射用户的数据库),而该账户没有访问这个默认数据库的权限,也会触发类似的登录失败。

  • 右键登录账户 → 属性 → 常规
  • 把默认数据库改成你已经给了db_datareader/db_datawriter权限的目标数据库
  • 确保该登录在这个默认数据库里有至少CONNECT权限(用户映射里勾上对应的数据库,默认会创建用户并赋予CONNECT权限)

3. 排查服务器级登录触发器

有些服务器会配置自定义的登录触发器,用来限制登录来源或者验证条件,非sysadmin账户可能被拦截。可以先查一下有没有启用的触发器:

SELECT name, is_disabled 
FROM sys.server_triggers;

如果有启用的触发器,先临时禁用它(执行DISABLE TRIGGER [触发器名称] ON ALL SERVER;),然后尝试登录。如果能成功,就是触发器的逻辑限制了你的登录,需要调整触发器规则。

4. 检查权限冲突(DENY权限优先于GRANT)

如果你的登录账户属于某个被DENY CONNECT SQL权限的服务器角色或组,哪怕你单独给了GRANT权限也没用——DENY会覆盖所有GRANT。可以用下面的语句检查有没有被拒绝的权限:

USE master;
GO
SELECT name, permission_name, state_desc 
FROM sys.server_permissions sp
JOIN sys.server_principals spri ON sp.grantee_principal_id = spri.principal_id
WHERE spri.name = 'example' AND state_desc = 'DENY';

如果查到DENY权限,找到对应的授予对象(可能是某个服务器组),去掉DENY即可。

最后再试一次重启SQL Server服务

虽然你已经重启过,但有时候权限变更需要服务完全重启才能生效(尤其是涉及服务器级权限的时候),可以再试一次,确保所有配置都加载到位。

按上面的步骤排查下来,基本能解决问题,不用给账户赋予过高的sysadmin权限。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 05:52:42