MSSQL数据库还原后登录失败,sp_change_users_login无效如何解决?
MSSQL数据库还原后登录失败解决方案
问题核心原因
你遇到的是SQL Server孤立用户问题:源数据库备份中携带的数据库用户SID,和目标实例上对应登录名的SID不匹配,导致身份验证时无法映射,哪怕用户名完全一致也会登录失败。你使用的sp_change_users_login未生效,大概率是该存储过程已被微软弃用,不支持Windows身份验证登录、包含数据库用户等场景,或是操作参数配置错误。
分步解决方法
第一步 确认SID匹配情况
先分别查询目标实例的登录SID,和还原后数据库内的用户SID,确认是否为孤立用户问题:
- 查询目标实例登录信息:
SELECT name, sid, type_desc FROM sys.server_principals WHERE name = N'[USER_NAME]'
- 查询还原后数据库的用户信息:
USE [DB_NAME] SELECT name, sid, type_desc FROM sys.database_principals WHERE name = N'[USER_NAME]'
若两个查询返回的SID不一致,即可确认是孤立用户问题。
第二步 按用户类型修复映射
场景1:使用SQL身份验证登录
优先使用官方推荐的ALTER USER语法修复映射,替代已弃用的sp_change_users_login:
USE [DB_NAME] ALTER USER [USER_NAME] WITH LOGIN = [USER_NAME]
若上述操作仍失效,可删除原有数据库用户后重新映射:
-- 切换到目标库删除原有用户 USE [DB_NAME] DROP USER IF EXISTS [USER_NAME] GO -- 配置登录默认数据库 USE [master] ALTER LOGIN [USER_NAME] WITH DEFAULT_DATABASE = [DB_NAME] GO -- 重新创建用户并赋权(权限按实际业务需求调整,此处以db_owner为例) USE [DB_NAME] CREATE USER [USER_NAME] FOR LOGIN [USER_NAME] EXEC sp_addrolemember N'db_owner', N'[USER_NAME]'
场景2:使用Windows身份验证登录
sp_change_users_login不支持Windows身份验证的用户,直接使用ALTER USER语法修复即可:
USE [DB_NAME] ALTER USER [域\用户名] WITH LOGIN = [域\用户名]
同时确认目标设备上对应的Windows账号未被禁用、改名,且具备访问SQL Server实例的权限。
场景3:使用包含数据库用户
若源数据库开启了包含模式,需要先开启目标实例的包含数据库认证配置:
sp_configure 'show advanced options', 1 RECONFIGURE GO sp_configure 'contained database authentication', 1 RECONFIGURE GO
配置完成后无需额外映射,包含用户会随备份还原自动生效。
第三步 验证修复结果
执行如下命令检查是否还存在孤立用户:
USE [DB_NAME] EXEC sp_change_users_login 'Report'
若输出结果中没有[USER_NAME],说明映射已修复完成,可尝试重新连接数据库。
第四步 特殊场景排查
若上述操作仍未解决问题,逐一检查以下配置:
- 确认数据库状态正常:执行
SELECT name, state_desc FROM sys.databases WHERE name = N'[DB_NAME]',返回状态应为ONLINE,若为其他状态需先排查数据库恢复故障 - 确认登录权限:执行
USE [master]; EXEC xp_logininfo N'[USER_NAME]', 'all',确认登录名有访问目标实例的权限 - 确认应用连接字符串配置正确,无实例名、用户名、密码拼写错误
内容的提问来源于stack exchange,提问作者Astinog
相关产品推荐
相关产品推荐

