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

迁移数据库至新SQL Server实例后遇权限问题求助

解决SQL Server登录名与数据库用户权限不匹配及报错15023的问题

问题原因

错误15023的本质是:数据库备份恢复时,旧实例中的toolLocation用户已被同步到新实例的目标数据库中;但你在新实例服务器级别创建了同名登录名,两者的安全标识符(SID)不匹配,导致登录名无法与数据库用户正确映射,既出现权限访问失败,又在编辑权限时触发“用户已存在”的创建报错。

解决方案

方法1:删除重复数据库用户,重新映射登录名

  1. 连接新实例,进入目标数据库,执行SQL删除已有数据库用户:
USE [你的目标数据库名]
GO
DROP USER IF EXISTS [toolLocation]
GO
  1. 在服务器级Logins找到toolLocation登录名,右键选择属性,切换到用户映射标签,勾选目标数据库,自动创建对应数据库用户并配置权限,点击确定保存。

方法2:修改数据库用户SID匹配登录名(无需删除用户)

若需保留现有数据库用户,可通过修改SID实现登录名与用户的匹配:

  1. 查询登录名的SID:
SELECT sid FROM sys.server_principals WHERE name = 'toolLocation'
  1. 复制查询到的SID值,执行SQL修改数据库用户的SID(替换<登录名SID>为实际值):
USE [你的目标数据库名]
GO
ALTER USER [toolLocation] WITH LOGIN = [toolLocation], SID = <登录名SID>
GO
  1. 验证映射结果:
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

验证操作

  1. 使用toolLocation登录新实例,尝试访问目标表,确认权限正常。
  2. 再次在SSMS中编辑该登录名的表权限,确认报错消失。

内容的提问来源于stack exchange,提问作者Eric Snyder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 03:45:39