MSSQLSERVER_845错误表示进程等待闩锁超时,并非连接失败或权限校验被拒;其根本原因是I/O操作延迟过长(常因系统阻塞或磁盘故障),而非数据库用户映射问题。
845错误不是连接失败,而是登录成功后权限校验被拒——问题出在数据库用户映射上,不是账号密码错,也不是网络不通。
SQL Server里用户没映射到目标数据库就会报845
你用sa或某个SQL登录名连上了实例,但Navicat填的Database字段(比如myapp)里,这个登录名根本没被映射为数据库用户。SQL Server拒绝后续操作,抛出Error: 845(实际是MSSQLSERVER_845,含义为“用户无权访问该数据库”)。
- 即使
sa有服务器级权限,也必须显式映射到具体库才能访问它 - 新建登录时默认只映射到
master,不会自动同步到其他库 - 用Windows认证登录时更常见:域账户可能有实例权限,但没在目标库建
user
检查和修复用户映射的实操步骤
用SSMS或另一个可用连接进SQL Server,执行以下验证:
- 查登录是否存在:
SELECT name, type_desc FROM sys.server_principals WHERE name = 'your_login_name'; - 查该登录在目标库是否有对应用户:
USE [myapp]; SELECT name, type_desc FROM sys.database_principals WHERE sid = SUSER_SID('your_login_name'); - 如果第二条没结果,说明没映射——运行:
CREATE USER [your_login_name] FOR LOGIN [your_login_name]; - 再给基本权限:
ALTER ROLE db_datareader ADD MEMBER [your_login_name]; ALTER ROLE db_datawriter ADD MEMBER [your_login_name];
注意:别漏掉USE [myapp]切换上下文,否则CREATE USER会建在master里,无效。
Navicat连接时Database字段填错也会触发845
填了一个不存在的库名(比如拼错成myappp),SQL Server找不到该库,就无法完成用户映射检查,直接返回845而非更明确的“数据库不存在”错误。
- 先确认库名真实存在:
SELECT name FROM sys.databases; - 避免用带空格或特殊字符的库名,如必须用,Navicat里
Database字段要加方括号,但不推荐 - 测试阶段可临时填
master看是否还报845——如果不再报,基本锁定是目标库映射问题
真正容易被忽略的是:SQL Server允许登录名存在、密码正确、端口通、实例运行,但只要目标库没做用户映射,845就会稳稳出现。它不提示“请检查映射”,只甩一个冷冰冰的错误码。


















