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
执行后返回的结果就是当前所有未映射到服务器登录名的孤立用户。
第三步:根据你的实际情况选择修复方式:
- 服务器端已经存在对应登录名,只需要完成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'- 服务器端还没有创建对应登录名,先创建登录名再做映射:
-- 创建服务器登录名 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
相关产品推荐
相关产品推荐

