SQL Server里怎么把登录和密码从一个实例搬到另一个,过程和注意点讲讲
- 问答
- 2026-01-12 04:45:33
- 3
根据微软官方文档(MSDN)和常见的数据库管理员实践,将SQL Server的登录名和密码从一个实例迁移到另一个实例,尤其是在不同服务器之间迁移时,不能简单地通过备份还原用户数据库来完成,因为登录名信息存储在master系统数据库中,以下是详细的过程和需要注意的关键点。
核心原理:为什么还原数据库不够?
来源(微软支持文档KB918992):登录名是服务器级别的对象,每个登录名在SQL Server内部都有一个唯一的安全标识符(SID),当你仅还原用户数据库时,数据库中的用户(数据库用户)虽然被还原了,但这个用户是映射到原服务器上某个登录名的SID的,在新服务器上,如果同名的登录名不存在,或者存在但SID不同,就会导致“孤立用户”问题,表现为用户无法登录,或者登录后无法访问其数据库。
迁移的关键在于两步:一是在新服务器上重新创建登录名,并确保其密码和SID与原服务器一致(尤其是对于SQL身份验证登录);二是将新登录名与已还原数据库中的用户重新正确关联。
迁移方法一:使用T-SQL脚本(适用于所有版本,最常用)
这种方法通过脚本获取原登录名的信息,然后在新服务器上执行创建。
-
在原服务器上生成创建登录名的脚本:
- 你需要识别出需要迁移的登录名,重点关注那些有权限访问你所要迁移的数据库的SQL身份验证登录名和Windows身份验证登录名。
- 对于SQL Server 2005及以上版本,一个可靠的方法是查询系统视图,你可以运行一个查询,来生成每个登录名的CREATE LOGIN语句,关键点在于,对于SQL登录,必须获取其密码哈希值和SID,并在新服务器上使用相同的值创建。
- 一个常用的查询脚本示例(来源:基于sys.sql_logins系统视图):
SELECT 'CREATE LOGIN [' + name + '] ' + CASE WHEN type IN ('U', 'G') THEN 'FROM WINDOWS WITH DEFAULT_DATABASE=[' + default_database_name + ']' ELSE 'WITH PASSWORD=' + CONVERT(VARCHAR(256), password_hash, 1) + ' HASHED, SID=' + CONVERT(VARCHAR(256), sid, 1) + ', DEFAULT_DATABASE=[' + default_database_name + '], CHECK_POLICY=ON' END FROM sys.server_principals WHERE type IN ('S', 'U', 'G') -- S:SQL登录, U:Windows用户, G:Windows组 AND name NOT LIKE '##%##' -- 排除系统内部账户 AND name NOT IN ('sa', 'NT AUTHORITY\SYSTEM', 'NT SERVICE\MSSQLSERVER'); -- 排除不需要迁移的系统账户 - 执行这个查询后,你会得到一系列完整的CREATE LOGIN语句,将这些脚本结果保存到文本文件中。
-
在新服务器上执行脚本并修复用户映射:
- 将上一步保存的脚本拿到新的SQL Server实例上执行,这会创建出与原服务器SID和密码完全相同的登录名。
- 将你的用户数据库备份还原到新服务器上。
- 数据库中的用户很可能已经是孤立用户,你需要将登录名与数据库用户重新映射。
- 在新服务器上,连接到刚还原的数据库,执行以下命令来修复指定用户的映射:
USE [你的数据库名]; EXEC sp_change_users_login 'Update_One', '数据库用户名', '登录名';
- 你也可以先使用
EXEC sp_change_users_login 'Report';来列出所有孤立用户,然后再逐个修复。
迁移方法二:使用SSMS的生成脚本向导(适用于SQL Server 2008及以后版本)
这是一种图形化界面操作,相对简单。
-
在原服务器上操作:
- 在SQL Server Management Studio (SSMS) 中,连接到原实例。
- 右键点击要迁移的登录名(可以在“安全性”->“登录名”下多选),选择“编写登录脚本为”->“CREATE 到”->“新查询编辑器窗口”或“文件”。
- 重要注意点: 在点击“脚本”按钮之前,务必点击“脚本向导”的“高级”按钮(如果可用),在高级选项中,找到“脚本登录名”相关设置,一定要选择“脚本登录名和密码”(或类似选项,如“包括SID”和“包括密码”),默认情况下,它可能只生成创建登录名的框架而不包含密码哈希,那样就失去了意义。
- 将生成的脚本保存下来。
-
在新服务器上操作:
- 执行生成的脚本以创建登录名。
- 还原用户数据库。
- 和使用T-SQL方法一样,使用
sp_change_users_login存储过程修复孤立用户。
关键的注意点和潜在问题
- Windows身份验证登录名: 迁移Windows用户或组要简单得多,因为它们的SID由Windows域控制器管理,只要新服务器在同一个域(或可信域)中,并且能识别该Windows账户,直接创建登录名即可,SID会自动匹配,通常不会产生孤立用户。
- 服务器角色和权限: 以上方法主要迁移了登录名本身和其默认数据库,登录名在原服务器上可能拥有的服务器级别角色(如sysadmin、serveradmin)和权限(如CREATE DATABASE)不会被自动迁移,你需要在创建登录名后,手动将这些角色和权限重新授予新服务器上的登录名,你可以通过编写脚本
sp_helpsrvrolemember来辅助完成。 - 作业所有者: 如果登录名是SQL Server代理作业的所有者,这些作业也需要被迁移,并且作业的所有者信息需要更新为新服务器上对应的登录名。
- 链接服务器: 如果登录名被配置为链接服务器的映射账户,这些配置也需要在新服务器上重新设置。
- 密码策略: 在新服务器上创建SQL登录名时,如果新服务器的密码策略(如密码复杂性要求)比原服务器严格,可能会导致创建失败,需要手动调整。
- 测试!测试!测试! 在生产环境进行迁移前,一定要在测试环境中完整演练整个流程,验证迁移后的登录名能否成功登录,能否正常访问数据库,权限是否正确。
迁移SQL Server登录名的核心是保证SID的一致性,最可靠和可控的方法是使用T-SQL脚本,明确地携带密码哈希和SID信息,图形界面方法虽然方便,但需要注意高级设置,否则容易遗漏关键信息,无论哪种方法,迁移后都要仔细检查和重新配置服务器级别的权限和设置,并进行充分的测试,以确保应用能平滑过渡到新的数据库服务器。

本文由革姣丽于2026-01-12发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/79109.html
