迁移数据库至新SQL Server实例后遇权限问题求助
解决SQL Server登录名与数据库用户权限不匹配及报错15023的问题
问题原因
错误15023的本质是:数据库备份恢复时,旧实例中的toolLocation用户已被同步到新实例的目标数据库中;但你在新实例服务器级别创建了同名登录名,两者的安全标识符(SID)不匹配,导致登录名无法与数据库用户正确映射,既出现权限访问失败,又在编辑权限时触发“用户已存在”的创建报错。
解决方案
方法1:删除重复数据库用户,重新映射登录名
- 连接新实例,进入目标数据库,执行SQL删除已有数据库用户:
USE [你的目标数据库名] GO DROP USER IF EXISTS [toolLocation] GO
- 在服务器级
Logins找到toolLocation登录名,右键选择属性,切换到用户映射标签,勾选目标数据库,自动创建对应数据库用户并配置权限,点击确定保存。
方法2:修改数据库用户SID匹配登录名(无需删除用户)
若需保留现有数据库用户,可通过修改SID实现登录名与用户的匹配:
- 查询登录名的SID:
SELECT sid FROM sys.server_principals WHERE name = 'toolLocation'
- 复制查询到的SID值,执行SQL修改数据库用户的SID(替换
<登录名SID>为实际值):
USE [你的目标数据库名] GO ALTER USER [toolLocation] WITH LOGIN = [toolLocation], SID = <登录名SID> GO
- 验证映射结果:
USE [你的目标数据库名] GO SELECT dp.name AS 数据库用户名, sp.name AS 登录名 FROM sys.database_principals dp JOIN sys.server_principals sp ON dp.sid = sp.sid WHERE dp.name = 'toolLocation'
方法3:直接为数据库用户分配表权限
修复映射问题后,可直接在数据库级别给用户分配表权限:
USE [你的目标数据库名] GO -- 分配指定表的读写权限 GRANT SELECT, INSERT, UPDATE, DELETE ON [目标表名] TO [toolLocation] -- 或分配全库表的基础权限(谨慎使用) GRANT SELECT, INSERT, UPDATE, DELETE TO [toolLocation] GO
验证操作
- 使用
toolLocation登录新实例,尝试访问目标表,确认权限正常。 - 再次在SSMS中编辑该登录名的表权限,确认报错消失。
内容的提问来源于stack exchange,提问作者Eric Snyder
相关产品推荐
相关产品推荐

