SQL Server 2017 CU22下Always On副本间登录名自动转移方法咨询
关于SQL Server 2017 CU22 Always On可用性组自动同步登录名的方案
嘿,我来帮你梳理下这个问题——SQL Server的Always On可用性组本身不会自动同步登录名和相关的服务器级别权限,不过有几种可靠的方法可以实现自动(或半自动化)的同步,适配你用的2017 CU22版本:
1. 改用包含数据库用户(最推荐)
如果你的业务场景允许,这是最省心的方案:
- 将数据库配置为部分包含或完全包含模式,执行命令:
ALTER DATABASE [YourDB] SET CONTAINMENT = PARTIAL;; - 创建包含数据库用户,这类用户不需要映射到服务器级登录名,身份验证直接在数据库内部完成;
- 当可用性组故障转移时,包含数据库用户会跟着数据库一起同步到新主副本,完全不需要额外处理登录名的迁移。
2. 系统存储过程+SQL代理作业自动同步
微软官方提供了专用存储过程来生成登录名的迁移脚本,你可以基于它们做自动化:
- 先在主副本创建
sp_help_revlogin和sp_hexadecimal存储过程(脚本可直接从SQL Server官方文档获取,复制执行即可); - 创建一个SQL代理作业,定期调用这两个存储过程,生成包含登录名、密码哈希、服务器角色权限的完整脚本;
- 通过链接服务器或者作业步骤的跨实例执行,将生成的脚本自动在辅助副本上运行,实现定期同步。如果是可读辅助副本,还可以设置作业在主副本故障转移后自动切换执行目标。
3. PowerShell脚本自动化同步
写一个PowerShell脚本,实现登录名的对比和同步:
- 脚本逻辑:连接主副本,获取所有服务器登录名及其密码哈希、权限信息;
- 连接辅助副本,对比缺失的登录名或权限不一致的条目;
- 自动生成并执行同步脚本,确保两边登录名完全一致;
- 将这个脚本配置为Windows任务计划或者SQL代理作业,定时运行,实现近乎实时的同步。
注意事项
- 无论用哪种方案,都要在测试环境先验证故障转移后的登录和权限情况,确保业务不受影响;
- 如果你用到了Azure AD登录,SQL Server 2017 CU22对这类登录的同步支持已经比较完善,但需要注意脚本中要包含AD登录的相关逻辑;
- 对于SQL代理作业,要确保作业的所有者和代理账户在所有副本实例上都有足够的权限,故障转移后能正常执行。
内容的提问来源于stack exchange,提问作者newbieuser
相关产品推荐
相关产品推荐

