Replication Management Objects Concepts
适用于: SQL Server Azure SQL 托管实例
复制管理对象(RMO)是一个托管代码程序集,用于封装 SQL Server 的复制功能。 RMO 是由 Microsoft.SqlServer.Replication 命名空间实现的。
以下几节中的主题介绍如何使用 RMO 以编程方式控制复制任务:
配置分发
本节中的主题介绍如何使用 RMO 配置发布和分发。
创建发布
本节中的主题介绍如何使用 RMO 创建、删除和修改发布和项目。
Subscribe to Publications
本节中的主题介绍如何使用 RMO 创建、删除和修改订阅。
保护复制拓扑
本节中的主题介绍如何使用 RMO 查看和修改安全设置。
同步订阅(复制)
本节中的主题介绍如何同步订阅。
监视复制
本节中的主题介绍如何以编程方式监视复制拓扑。
RMO 编程简介
RMO 设计用于对 SQL Server 复制的所有方面进行编程。 RMO 命名空间由 Microsoft.SqlServer.ReplicationMicrosoft.SqlServer.Rmo.dll 实现,它是Microsoft .NET Framework 程序集。 Microsoft.SqlServer.Replication.dll 程序集也属于 Microsoft.SqlServer.Replication 命名空间,该程序集实现了用于编程多种复制代理(快照代理、分发代理和合并代理)的托管代码接口。 该程序集的类可以从 RMO 访问以同步订阅。 Microsoft.SqlServer.Replication.BusinessLogicSupport 命名空间中的类由 Microsoft.SqlServer.Replication.BusinessLogicSupport.dll 程序集实现,这些类用于创建合并复制的自定义业务逻辑。 此程序集独立于 RMO。
部署基于 RMO 的应用程序
RMO 取决于 SQL Server Compact 以外的所有版本的复制组件和客户端连接组件。 若要基于 RMO 部署应用程序,必须安装包含复制组件和客户端连接组件的 SQL Server 版本,该版本将运行该应用程序。
RMO 入门
本部分介绍如何使用 Microsoft Visual Studio 启动简单的 RMO 项目。
创建新的 Microsoft Visual C# 项目
启动 Visual Studio。
在“文件”菜单上,单击“新建项目”。此时会显示“新建项目”对话框。
在“项目类型”对话框中,选择“Visual C# 项目”。 在“模板”窗格中,选择“Windows 应用程序”。
(可选)在“名称”中,键入新应用程序的名称。
单击“确定”加载 Visual C# Windows 模板。
在“项目”菜单中,选择“添加引用”项。 此时会显示“添加引用”对话框。
从“.NET”选项卡上的列表中选择以下程序集,然后单击“确定”。
Microsoft.SqlServer.Replication .NET Programming Interface
Microsoft.SqlServer.ConnectionInfo
Replication Agent Library
注意
使用 CTRL 键可选择多个文件。
(可选)重复步骤 6。 单击“浏览”选项卡,导航到 C:\Program Files\Microsoft SQL Server\nnn\COM,选择Microsoft.SqlServer.Replication.BusinessLogicSupport.dll,然后单击“确定”。
在 “视图” 菜单上,单击 “代码”。
在代码的命名空间语句前,键入以下 using 语句,限定 RMO 命名空间中的类型:
// These namespaces are required. using Microsoft.SqlServer.Replication; using Microsoft.SqlServer.Management.Common; // This namespace is only used when creating custom business // logic for merge replication. using Microsoft.SqlServer.Replication.BusinessLogicSupport;
创建新的 Microsoft Visual Basic .NET 项目
启动 Visual Studio。
在“文件”菜单中,选择“新建项目”。 此时将出现“新建项目”对话框。
在“项目类型”窗格中,选择“Visual Basic”。 在“模板”窗格中,选择“Windows 应用程序”。
(可选)在“名称”框中,键入新应用程序的名称。
单击“确定”加载 Visual Basic Windows 模板。
在“项目”菜单中,选择“添加引用”。 此时会显示“添加引用”对话框。
从“.NET”选项卡上的列表中选择以下程序集,然后单击“确定”。
Microsoft.SqlServer.Replication .NET Programming Interface
Microsoft.SqlServer.ConnectionInfo
Replication Agent Library
注意
使用 CTRL 键可选择多个文件。
(可选)重复步骤 6。 单击“浏览”选项卡,导航到 C:\Program Files\Microsoft SQL Server\nnn\COM,选择Microsoft.SqlServer.Replication.BusinessLogicSupport.dll,然后单击“确定”。
在 “视图” 菜单上,单击 “代码”。
在代码的任何声明前,键入以下 Imports 语句限定 RMO 命名空间中的类型。
' These namespaces are required. Imports Microsoft.SqlServer.Replication Imports Microsoft.SqlServer.Management.Common ' This namespace is only used when creating custom business ' logic for merge replication. Imports Microsoft.SqlServer.Replication.BusinessLogicSupport
连接复制服务器
RMO 编程对象要求使用类的 ServerConnection 实例连接到 SQL Server 实例。 与该服务器的连接是独立于任何 RMO 编程对象的。 然后,在创建实例的过程中或在给 RMO 对象的 P:Microsoft.SqlServer.Replication.ReplicationObject.ConnectionContex
t 属性赋值的过程中,该编程对象会传递给 RMO 对象。 采用这种方式,RMO 编程对象实例和连接对象实例可以分别创建和管理,而多个 RMO 编程对象可以重用一个连接对象。 连接复制服务器时适用下列规则:
该连接的所有属性都对给定的 ServerConnection 对象定义。
与每个 SQL Server 实例的连接必须有自己的 ServerConnection 对象。
将 ServerConnection 对象赋给正在创建的或正在服务器上访问的 RMO 编程对象的
P:Microsoft.SqlServer.Replication.ReplicationObject.ConnectionContext
属性。Connect 方法打开与服务器的连接。 必须在调用此方法后,才能对任何使用该连接的 RMO 编程对象调用任一访问服务器的方法。
由于 RMO 和 SQL Server 管理对象(SMO)都使用 ServerConnection 类连接到 SQL Server,因此 RMO 和 SMO 对象可以使用同一连接。 有关详细信息,请参阅连接到 SQL Server 的实例。
执行连接并成功登录服务器所需的所有验证信息由 ServerConnection 对象提供。
默认情况下使用 Windows 身份验证。 若要使用 SQL Server 身份验证, LoginSecure 必须设置为 false , Login 并且 Password 必须设置为有效的 SQL Server 登录和密码。 安全凭据必须始终以安全的方式存储和处理,并且尽可能在运行时才提供。
对于多线程应用程序,每个线程应使用单独的 ServerConnection 对象。
对 Disconnect 对象调用 ServerConnection 方法将关闭 RMO 对象所使用的活动的服务器连接。
设置 RMO 属性
RMO 编程对象的属性表示服务器上这些复制对象的属性。 在服务器上创建新的复制对象时,RMO 属性用于定义这些对象。 对于现有对象,RMO 属性表示现有对象的属性,其中可修改的只有可写和可设置的属性。 对新对象或现有对象都可以设置属性。
为新复制对象设置属性
在服务器上创建新的复制对象时,必须指定所有必需的属性,然后才能调用该对象的 Create 方法。 有关为新的复制对象设置属性的详细信息,请参阅配置发布和分发。
为现有复制对象设置属性
对于服务器上存在的复制对象,RMO 可能只支持更改其属性的部分或全部,具体取决于对象。 只有可写或可设置的属性才能更改。 更改属性前,必须调用 Load 或 M:Microsoft.SqlServer.Replication.ReplicationObject.LoadProperties
方法从服务器获取当前属性。 调用这些方法表示要修改现有对象。
默认情况下,更改对象属性时,RMO 会根据所使用的 ServerConnection 的执行模式向服务器提交这些更改。 尝试检索或更改对象的属性之前,可以使用 P:Microsoft.SqlServer.Replication.ReplicationObject.IsExistingObject
方法来验证服务器上是否存在该对象。 有关更改复制对象属性的详细信息,请参阅查看和修改分发服务器和发布服务器属性。
注意
多个 RMO 客户端或一个 RMO 编程对象的多个实例同时访问服务器上的同一个复制对象时,可根据服务器上该对象的当前状态,调用 RMO 对象的 Refresh 方法来更新属性。
缓存属性更改
当属性 SqlExecutionModes 设置为 CaptureSql RMO 生成的所有 Transact-SQL 语句时,可以使用其中一种执行方法在单个批处理中手动执行它们。 RMO 可以缓存属性更改并使用对象的 M:Microsoft.SqlServer.Replication.ReplicationObject.CommitPropertyChanges
方法在一个批次内将这些更改一起提交。 若要缓存属性更改,对象的 P:Microsoft.SqlServer.Replication.ReplicationObject.CachePropertyChanges
属性必须设置为 true。 缓存 RMO 中的属性更改时,ServerConnection 对象仍控制何时向服务器发送更改。 有关缓存复制对象的属性更改的详细信息,请参阅查看和修改分发服务器和发布服务器属性。
重要
虽然 ServerConnection 类支持在设置属性时声明显式事务,但这样的事务会影响内部复制事务,可能产生难以预料的结果,因此不应在 RMO 中使用。
启用 RMO 组件的 TLS 1.2 支持
通过安装更新 KB 3140245,并创建文章中提到的注册表项,可以在 Windows 2012 及更低版本上启用 RMO 组件的 TLS1.2 支持。 在 Windows 2012 R2 和更高版本上,只需创建上述文章中提到的注册表项。
示例
本示例演示如何缓存属性更改。 对事务发布属性的更改被缓存,直到将其显式发送给服务器。
// Define the server, database, and publication names
string publisherName = publisherInstance;
string publicationName = "AdvWorksProductTran";
string publicationDbName = "AdventureWorks2022";
TransPublication publication;
// Create a connection to the Publisher.
ServerConnection conn = new ServerConnection(publisherName);
try
{
// Connect to the Publisher.
conn.Connect();
// Set the required properties for the publication.
publication = new TransPublication();
publication.ConnectionContext = conn;
publication.Name = publicationName;
publication.DatabaseName = publicationDbName;
// Explicitly enable caching of property changes on this object.
publication.CachePropertyChanges = true;
// If we can't get the properties for this publication,
// throw an application exception.
if (publication.LoadProperties())
{
// Enable support for push subscriptions and disable support
// for pull subscriptions.
if ((publication.Attributes & PublicationAttributes.AllowPull) != 0)
{
publication.Attributes ^= PublicationAttributes.AllowPull;
}
if ((publication.Attributes & PublicationAttributes.AllowPush) == 0)
{
publication.Attributes |= PublicationAttributes.AllowPush;
}
// Send changes to the server.
publication.CommitPropertyChanges();
}
else
{
throw new ApplicationException(String.Format(
"Settings could not be retrieved for the publication. " +
"Ensure that the publication {0} exists on {1}.",
publicationName, publisherName));
}
}
catch (Exception ex)
{
// Do error handling here.
throw new ApplicationException(
"The publication property could not be changed.", ex);
}
finally
{
conn.Disconnect();
}