Error 18456 根本原因需据错误日志中State值精准定位:State 5为仅Windows认证模式、State 7为账号禁用/锁定、State 8为密码不匹配、State 40为默认数据库不可用,盲目改密码无效。

Navicat 连接 SQL Server 报 Error 18456,不是密码错了就一定得改密码——90% 的情况是登录请求根本没走到“比对密码”那一步,而是卡在更前面的验证环节。先看日志里的 State 值,再动手改配置,否则容易反复折腾。
查错误日志里的 State 码,别猜原因
SSMS 弹窗只显示“用户 'sa' 登录失败”,但真实原因藏在 SQL Server 错误日志里。直接执行这条命令:
EXEC xp_readerrorlog 0, 1, N'Login failed', N'18456', NULL, NULL, N'desc';
重点看返回结果中 Text 列末尾的完整描述,尤其是带 State 的那一段,比如:
-
State 5:SQL Server 处于“仅 Windows 身份验证模式”,sa根本不被接受 -
State 7:账号被禁用(is_disabled = 1)或密码错误+账户锁定双重问题 -
State 8:密码确实不匹配(但注意:也可能是密码策略强制要求复杂度,旧密码被系统拒绝) -
State 40:sa的默认数据库(通常是master)不可用或脱机
没看到 State 就别急着重置密码——你可能在修一个不存在的问题。
确认并启用混合身份验证模式
SQL Server 默认安装是“仅 Windows 身份验证”,此时哪怕 sa 密码正确、账户启用,也会报 18456(State 5 或 State 58)。
必须手动切换为“SQL Server 和 Windows 身份验证模式”:
- 在 SSMS 中右键服务器 → “属性” → “安全性” → 改选“SQL Server 和 Windows 身份验证模式”
- 改完必须重启
SQL Server (MSSQLSERVER)服务(仅靠“重新连接”没用) - 如果无法启动 SSMS,也可用注册表修改:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQLXX.MSSQLSERVER\MSSQLServer\LoginMode,把值改成2
注意:改注册表前务必备份,且版本号 MSSQLXX 要和你实际安装的主版本一致(如 SQL Server 2022 是 MSSQL16)。
用 Windows 身份验证登录后检查 sa 状态
只要 Windows 身份验证能连上(主机填 . 或 localhost,认证方式选“Windows 身份验证”),就能进库操作 sa:
运行以下查询确认关键状态:
SELECT name, is_disabled, is_policy_checked, is_expiration_checked,<br> LOGINPROPERTY(name, 'IsLocked') AS is_locked,<br> LOGINPROPERTY(name, 'BadPasswordCount') AS bad_password_count<br>FROM sys.sql_logins<br>WHERE name = 'sa';
重点关注这几项是否都满足:
-
is_disabled = 0(否则执行ALTER LOGIN sa ENABLE;) -
is_locked = 0(若为 1,需等锁定期过或执行ALTER LOGIN sa UNLOCK;) -
bad_password_count = 0(非零说明近期输错多次,触发了账户锁定策略) -
is_policy_checked = 1时,密码必须满足 Windows 密码策略(含大小写字母、数字、符号),简单密码如123456会被拒绝
重置密码时务必用强密码,例如:ALTER LOGIN sa WITH PASSWORD = 'P@ssw0rd2026!';
TCP/IP 协议未启用会导致连接超时,而非 18456
如果你在 Navicat 里填的是虚拟机 IP 或远程地址,却收到 18456 + 08001 混合报错,大概率是网络层没通:
- 打开
SQL Server 配置管理器→ “SQL Server 网络配置” → 对应实例的“协议” → 确保TCP/IP是“已启用” - 双击 TCP/IP → “IP 地址”页签 → 拉到最下面,确认
IPAll中的TCP Port有值(如1433),且TCP Dynamic Ports为空 - 防火墙要放行对应端口(Windows 防火墙入站规则里添加端口
1433或程序sqlservr.exe)
这个环节出问题,Navicat 可能先报 08001(连不上服务器),重试几次后 SQL Server 日志里才出现 18456(因客户端不断重连触发失败记录)。所以看到 18456 同时伴随连接超时,优先查网络配置。
真正麻烦的不是改哪一行命令,而是日志里那个不起眼的 State 值——它决定了你是该重启服务、该解锁账号、还是该去关防火墙。很多人修了一下午,最后发现日志里写着 State 5,而自己一直在重设密码。


















