本文档介绍了如何使用 sp_help_revlogin 存储过程从 Cloud SQL for SQL Server 实例导出 SQL Server 登录信息、安全标识符 (SID) 和密码哈希。
迁移数据库、设置数据库同步或维护读取副本和灾难恢复 (DR) 副本时,您必须在目标实例上重新创建具有匹配 SID 和密码哈希的用户登录信息。这有助于确保数据库用户仍映射到其相应的服务器登录名并保留其权限。
Cloud SQL for SQL Server 在 msdb 数据库中提供 sp_help_revlogin 存储过程,用于生成 Transact-SQL (T-SQL) 脚本以重新创建用户登录信息。
准备工作
所需的角色
如需获得配置数据库标志所需的权限,请让管理员向您授予项目的以下 IAM 角色:
- Cloud SQL Admin (
roles/cloudsql.admin) - Cloud SQL Editor (
roles/cloudsql.editor)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
此预定义角色包含 cloudsql.instances.update 权限,该权限是配置数据库标志所需的权限。
数据库权限
确保您有权访问默认的 sqlserver SQL Server 用户角色。
启用数据库标志
如需在 msdb 数据库中安装 sp_help_revlogin 存储过程,请在实例上启用 cloud sql enable sp_help_revlogin 数据库标志。
Google Cloud 控制台
- 在 Google Cloud 控制台中,前往 Cloud SQL 实例页面。
- 点击实例名称,打开其概览页面。
- 点击修改。
- 在自定义实例部分,展开标志。
- 点击添加标志。
- 从可用标志列表中选择 cloud sql enable sp_help_revlogin。
- 将标志值设置为 on。
- 点击保存。
gcloud CLI
使用 gcloud CLI 启用该标志:
gcloud sql instances patch INSTANCE_NAME \ --database-flags="cloud sql enable sp_help_revlogin=on"
将 INSTANCE_NAME 替换为您的 Cloud SQL 实例的名称。
使用受支持的客户端工具进行连接
sp_help_revlogin 存储过程使用 T-SQL PRINT 语句(信息性消息)而不是表格结果集(SELECT 语句)输出生成的 CREATE LOGIN 脚本。
使用以下工具之一连接到 Cloud SQL 实例:
- SQL Server Management Studio (SSMS):连接到实例,执行该过程,然后在消息标签页中查看生成的脚本。或者,在执行查询之前,按 Ctrl+T 将执行输出模式切换为结果转文本。
- Visual Studio Code:使用 MSSQL 扩展程序进行连接,执行该过程,然后在消息标签页中查看生成的脚本。
sqlcmd 实用程序:连接到实例,并将生成的脚本直接输出到 SQL 文件:
sqlcmd -S INSTANCE_IP \ -U USERNAME \ -P PASSWORD -d msdb \ -Q "EXEC dbo.sp_help_revlogin" -o output_logins.sql替换以下内容:
INSTANCE_IP:Cloud SQL 实例的 IP 地址。USERNAME:您的管理数据库用户名(例如sqlserver)。PASSWORD:您的数据库用户密码。
使用 sp_help_revlogin 导出登录信息
连接到 msdb 数据库并运行 sp_help_revlogin 存储过程。
如需导出所有客户登录信息,请执行以下操作:
EXEC msdb.dbo.sp_help_revlogin;如需导出特定登录信息,请执行以下操作:
EXEC msdb.dbo.sp_help_revlogin @login_name = 'LOGIN_NAME';将
LOGIN_NAME替换为要导出的登录名。
在目标实例上重新创建登录信息
- 从查询输出中复制生成的
CREATE LOGIN语句。 - 连接到目标 SQL Server 实例。
- 在查询窗口中或使用
sqlcmd执行生成的语句。
生成的语句会使用原始 SID、默认数据库和密码哈希在目标实例上创建登录名。如需详细了解在实例之间转移登录信息时的注意事项,请参阅有关在 SQL Server 实例之间转移登录信息和密码的 Microsoft 文档。
将登录信息与读取副本同步
当 Cloud SQL 创建读取副本或灾难恢复 (DR) 副本时,它会从主实例复制现有登录信息。但是,在副本创建后在主实例上创建的登录信息不会自动复制。
虽然读取副本上的用户数据库是只读的,但您可以连接到读取副本,并在副本的 master 数据库中执行由 sp_help_revlogin 生成的 CREATE LOGIN 语句。
我们建议您定期从主实例导出新登录信息,并在只读副本和灾难恢复副本上重新创建这些登录信息。日常同步可确保用户能够向读取副本进行身份验证,并且应用可以在切换、副本故障切换或副本提升后立即重新连接。
限制和排除的登录
sp_help_revlogin 会自动从导出内容中排除以下类型的登录信息:
- Google Cloud 服务账号和内部管理账号。
- 内部 SQL Server 系统账号(前缀为
##的登录名)。 - 分配给
sysadmin固定服务器角色的登录名。 - 分配给受限管理服务器角色的登录信息。
停用数据库标志
如果您不再需要存储过程,请将该标志设置为 off(或从实例中移除该标志):
Google Cloud 控制台
- 在 Google Cloud 控制台中,前往 Cloud SQL 实例页面。
- 点击实例名称,打开其概览页面。
- 点击修改。
- 在自定义实例部分,展开标志。
- 找到 cloud sql enable sp_help_revlogin,并将其值设置为 off(或点击删除 以移除该标志)。
- 点击保存。
gcloud CLI
gcloud sql instances patch INSTANCE_NAME \ --database-flags="cloud sql enable sp_help_revlogin=off"
如果设置为 off 或移除,Cloud SQL 会自动从 msdb 数据库中删除 dbo.sp_help_revlogin。
后续步骤
- 如需详细了解 SQL Server 用户,请参阅 SQL Server 用户。
- 如需详细了解如何配置数据库标志,请参阅配置数据库标志。
- 如需详细了解支持的存储过程,请参阅 SQL Server 存储过程。
- 如需详细了解如何转移登录名和密码,请参阅在 SQL Server 实例之间转移登录名和密码。