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

GCP Cloud SQL MSSQL数据库从存储桶恢复后无法访问问题求助

问题根因

你遇到的是MSSQL经典的孤立用户问题:你从备份恢复的数据库中存储的数据库用户SID,和新Cloud SQL实例上已创建的服务器登录名SID不匹配,导致权限映射失败,触发安全上下文报错。

操作步骤
  • 第一步:使用创建Cloud SQL实例时设置的sqlserver管理员账号,通过SSMS或者sqlcmd工具连接到你的Cloud SQL实例。
  • 第二步:查询当前恢复数据库中的孤立用户列表,确认需要修复的用户:
USE [user_db] --替换为你的实际数据库名
GO
EXEC sp_change_users_login 'Report'
GO

执行后返回的结果就是当前所有未映射到服务器登录名的孤立用户。

  • 第三步:根据你的实际情况选择修复方式:

    1. 服务器端已经存在对应登录名,只需要完成SID映射:
    USE [user_db]
    GO
    EXEC sp_change_users_login 'Update_One', N'[数据库用户名]', N'[服务器登录名]'
    GO
    

    示例:如果数据库用户名和服务器登录名都叫app_user,命令为:
    EXEC sp_change_users_login 'Update_One', N'app_user', N'app_user'

    1. 服务器端还没有创建对应登录名,先创建登录名再做映射:
    -- 创建服务器登录名
    USE master
    GO
    CREATE LOGIN [app_user] WITH PASSWORD = N'设置符合复杂度要求的密码', CHECK_EXPIRATION = OFF, CHECK_POLICY = ON
    GO
    
    -- 映射到数据库用户
    USE [user_db]
    GO
    EXEC sp_change_users_login 'Update_One', N'app_user', N'app_user'
    GO
    
  • 第四步:验证映射结果,确认修复完成:

USE [user_db]
GO
SELECT dp.name AS 数据库用户名, sp.name AS 匹配的服务器登录名
FROM sys.database_principals dp
LEFT JOIN sys.server_principals sp ON dp.sid = sp.sid
WHERE dp.type = 'S' AND dp.name NOT IN ('dbo', 'guest', 'INFORMATION_SCHEMA', 'sys')
GO

如果查询结果中你的目标用户对应的匹配的服务器登录名列不为空,说明映射成功,可直接用该登录名访问数据库测试。

特殊场景说明

如果你需要将某个登录名映射为数据库的dbo用户,使用以下命令即可:

USE [user_db]
GO
ALTER AUTHORIZATION ON DATABASE::[user_db] TO [你的服务器登录名]
GO

内容的提问来源于stack exchange,提问作者Ivan Ivanov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 03:36:04