使用 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 身份验证:

以下值定义这这些存储过程的安全模式:

  • 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 身份验证