使用 Microsoft Entra 身份验证配置复制 – 由 Azure Arc 启用的 SQL Server
适用于: SQL Server 2022 (16.x)
本文提供使用已启用 Azure Arc 的 SQL Server 的 Microsoft Entra ID(以前称为 Azure Active Directory)身份验证配置事务复制和快照复制的步骤。
概述
Microsoft Entra 复制身份验证支持是在 SQL Server 2022 的累积更新 6 中引入的,并在累积更新 12 中正式发布。 使用 Microsoft Entra 身份验证进行复制时,唯一不同的步骤是第一步。 具体而言,创建 Microsoft Entra 登录并授予 sysadmin 权限。
之后,像平常一样在复制存储过程中使用 Microsoft Entra 登录来配置事务或快照复制。
注意
从 SQL Server 2022 CU 6 开始,通过使用会话跟踪标志 11561 来禁用复制的 Microsoft Entra 身份验证。
先决条件
要使用 Microsoft Entra 身份验证配置复制,必须满足以下先决条件:
- Azure-Arc 从累积更新 6 开始启用 SQL Server 2022。
- 为复制拓扑中的每台服务器配置 Microsoft Entra 身份验证。 查看教程:为 SQL Server 设置 Microsoft Entra 身份验证,以了解更多信息。
- SQL Server Management Studio (SSMS) v19.1 或更高版本或 Azure Data Studio。
- 连接到发布服务器和订阅服务器的用户属于 sysadmin 固定服务器角色成员。
- 必须使用受信任的证书颁发机构 (CA) 颁发的证书或自签名证书对连接进行加密。
- 如果使用自签名证书,则必须将其导入客户端计算机并安装到受信任的证书列表中,以使客户端信任 SQL Server。 无法通过在 SQL Server Management Studio (SSMS) 中选择“信任服务器证书”选项来绕过此要求,因为该选项对复制不起作用。
限制
目前,使用 Microsoft Entra 身份验证配置复制存在以下限制:
- 目前只能使用 Transact-SQL (T-SQL) 和复制存储过程、SSMS v19.1 或更高版本中的复制向导或 Azure Data Studio 配置复制。 目前,无法使用 RMO 复制对象或其他命令行语言配置复制。
- 复制拓扑中的每台服务器必须至少在 SQL Server 2022 CU 6 上运行。 不支持以前版本的 SQL Server。
根据 Microsoft Entra ID 创建 SQL 登录
创建 Microsoft Entra 登录,并为其授予 sysadmin
角色。
要创建 Microsoft Entra 登录并将其分配为 sysadmin
,请使用以下 Transact-SQL (T-SQL) 命令:
USE master
CREATE LOGIN [login_name] FROM EXTERNAL PROVIDER
EXEC sp_addsrvrolemember @loginame='login_name', @rolename='sysadmin'
例如,要为 newuser@tenant.com
添加登录名,请使用以下命令:
USE master
CREATE LOGIN [newuser@tenant.com] FROM EXTERNAL PROVIDER
EXEC sp_addsrvrolemember @loginame='newuser@tenant.com', @rolename='sysadmin'
创建分发数据库
使用 sp_adddistributiondb 创建分布式数据库。
下面是在分发服务器上创建分发数据库的示例脚本:
EXEC sp_adddistributiondb @database = N'distribution_db',
@data_folder = N'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER22\MSSQL\DATA',
@log_folder = N'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER22\MSSQL\DATA',
@log_file_size = 2, @min_distretention = 0, @max_distretention = 72,
@history_retention = 48, @deletebatchsize_xact = 5000,
@deletebatchsize_cmd = 2000, @security_mode = 1
以下示例在分发数据库中创建表 UIProperties
,然后设置 SnapshotFolder
属性,以便快照代理获知写入复制快照的位置:
USE [distribution_db]
IF (not exists (SELECT * FROM sysobjects WHERE NAME = 'UIProperties' and TYPE = 'U '))
CREATE TABLE UIProperties(id int)
IF (exists(SELECT * FROM::fn_listextendedproperty('SnapshotFolder', 'user', 'dbo', 'table', 'UIProperties', null, null)))
EXEC sp_updateextendedproperty N'SnapshotFolder', N' C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER22\MSSQL\DATA',
'user', dbo, 'table', 'UIProperties'
ELSE
EXEC sp_addextendedproperty N'SnapshotFolder', N' C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER22\MSSQL\DATA',
'user', dbo, 'table', 'UIProperties'
以下脚本将发布服务器配置为使用分发服务器数据库,并定义 AD 用户登录名以及用于复制的密码:
EXEC sp_adddistpublisher @publisher = N'publisher_db', @distribution_db = N'distribution_db',
@security_mode = 0, @login = N'newuser@tenant.com', @password = N'password',
@working_directory = N'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER22\MSSQL\ReplData',
@trusted = N'false', @thirdparty_flag = 0, @publisher_type = N'MSSQLSERVER'
启用复制
请使用 sp_replicationdboption 在发布服务器数据库(例如 testdb
)上启用复制,如以下示例所示:
EXEC sp_replicationdboption @dbname = N'testdb', @optname = N'publish', @value = N'true'
添加发布
使用 sp_addpublication 添加发布。
你可以配置事务复制或快照复制。
按照以下步骤创建事务复制。
首先,配置日志读取器代理:
USE [AdventureWorksDB]
EXEC [AdventureWorksDB].sys.sp_addlogreader_agent @job_login = null, @job_password = null,
@publisher_security_mode = 2, @publisher_login = N'newuser@tenant.com',
@publisher_password = N'<password>', @job_name = null
GO
接下来,创建事务发布:
use [AdventureWorksDB]
exec sp_addpublication @publication = N'AdvWorksProducTrans',
@description = N'Publication of database ''AdventureWorksDB'' from Publisher 'N'publisher_db''.',
@sync_method = N'concurrent', @retention = 0, @allow_push = N'true', @allow_pull = N'true',
@allow_anonymous = N'false', @enabled_for_internet = N'false', @snapshot_in_defaultfolder = N'true',
@compress_snapshot = N'false', @ftp_port = 21, @allow_subscription_copy = N'false',
@add_to_active_directory = N'false', @repl_freq = N'continuous', @status = N'active',
@independent_agent = N'true', @immediate_sync = N'false', @allow_sync_tran = N'true',
@allow_queued_tran = N'true', @allow_dts = N'false', @replicate_ddl = 1,
@allow_initialize_from_backup = N'false', @enabled_for_p2p = N'false',
@enabled_for_het_sub = N'false', @conflict_policy = N'pub wins'
然后,使用 @publisher_login
的 Microsoft Entra 登录并为发布服务器定义密码,为发布服务器创建快照代理并存储快照文件:
use [AdventureWorksDB]
exec sp_addpublication_snapshot @publication = N'AdvWorksProducTrans', @frequency_type = 1,
@frequency_interval = 1, @frequency_relative_interval = 1, @frequency_recurrence_factor = 0,
@frequency_subday = 8, @frequency_subday_interval = 1, @active_start_time_of_day = 0,
@active_end_time_of_day = 235959, @active_start_date = 0, @active_end_date = 0,
@job_login = null, @job_password = null, @publisher_security_mode = 2,
@publisher_login = N'newuser@tenant.com', @publisher_password = N'<password>'
最后,将项目 TestPub
添加到发布:
use [AdventureWorksDB]
exec sp_addarticle @publication = N'AdvWorksProducTrans', @article = N'testtable',
@source_owner = N'dbo', @source_object = N'testtable', @type = N'logbased',
@description = null, @creation_script = null, @pre_creation_cmd = N'drop',
@schema_option = 0x000000000803509D, @identityrangemanagementoption = N'manual',
@destination_table = N'testtable', @destination_owner = N'dbo', @vertical_partition = N'false'
创建订阅
使用 sp_addsubscription 添加订阅服务器,然后使用发布服务器上的 sp_addpushsubscription_agent 创建推送订阅,或使用订阅服务器上的 sp_addpullsubscription_agent 创建请求订阅。 使用 @subscriber_login
的Microsoft Entra 登录。
以下未例脚本添加订阅:
USE [testdb]
EXEC sp_addsubscription @publication = N'testpub', @subscriber = N'<subscription_server>',
@destination_db = N'testdb', @subscription_type = N'Push', @sync_type = N'automatic',
@article = N'all', @update_mode = N'read only', @subscriber_type = 0
以下示例脚本在发布服务器上添加一个推送订阅代理:
EXEC sp_addpushsubscription_agent @publication = N'testpub', @subscriber = N'<subscription server.',
@subscriber_db = N'testdb', @job_login = null, @job_password = null, @subscriber_security_mode = 2,
@subscriber_login = N'newuser@tenant.com', @subscriber_password = 'password', @frequency_type = 64,
@frequency_interval = 0, @frequency_relative_interval = 0, @frequency_recurrence_factor = 0,
@frequency_subday = 0, @frequency_subday_interval = 0, @active_start_time_of_day = 0,
@active_end_time_of_day = 235959, @active_start_date = 20220406, @active_end_date = 99991231, @enabled_for_syncmgr = N'False', @dts_package_location = N'Distributor'
复制存储过程
在 SQL Server 2022 的 CU 6 中修改了这些复制存储过程中的以下参数,以支持用于复制的 Microsoft Entra 身份验证:
- sp_addpullsubscription_agent:
@distributor_security_mode
- sp_addpushsubscription_agent:
@subscriber_security_mode
- sp_addmergepullsubscription_agent:
@publisher_security_mode
、@distributor_security_mode
- sp_addmergepushsubscription_agent:
@subscriber_security_mode
、@publisher_security_mode
- sp_addlogreader_agent:
@publisher_security_mode
- sp_changelogreader_agent:
@publisher_security_mode
- sp_addpublication_snapshot:
@publisher_security_mode
- sp_changepublication_snapshot:
@publisher_security_mode
以下值定义这这些存储过程的安全模式:
- 0 指定 SQL Server 身份验证。
- 1 指定 Windows 身份验证。
- 2 指定从 SQL Server 2022 CU 6 开始使用的 Microsoft Entra 密码身份验证。
- 3 指定从 SQL Server 2022 CU 6 开始使用的 Microsoft Entra 集成身份验证。
- 4 指定从 SQL Server 2022 CU 6 开始使用的 Microsoft Entra 令牌身份验证。
后续步骤
要了解更多信息,请查阅 SQL Server 复制和适用于 SQL Server 的 Microsoft Entra 身份验证