本主题介绍如何使用 SQL Server Management Studio、Transact-SQL 或复制管理对象(RMO)在 SQL Server 2014 中创建请求订阅。
可以通过脚本来设置 P2P 复制的拉取订阅,但无法通过向导进行设置。
使用 SQL Server Management Studio
使用“新建订阅向导”在发布服务器或订阅者处创建拉取订阅。 请按照向导中的各个页面进行操作:
指定出版商和出版。
选择复制代理将运行的位置。 对于拉取订阅,请在分发代理位置页或合并代理位置页中选择在其订阅服务器上运行每个代理(拉取订阅),具体取决于发布的类型。
指定订阅者和订阅数据库。
指定用于复制代理建立连接的登录名和密码:
对于快照发布和事务发布的订阅,请在 “分发代理安全性 ”页上指定凭据。
对于合并发布的订阅,请在“合并代理安全”页上指定凭据。
有关每个代理所需权限的信息,请参阅 R复制代理安全模式。
指定同步计划以及何时应初始化订阅服务器。
为合并发布指定其他选项:订阅类型、参数化筛选的值,以及如果发布启用了 Web 同步,则通过 HTTPS 进行同步的信息。
为允许更新订阅的事务性发布指定其他选项:订阅服务器应立即在发布服务器上提交更改,还是将其写入队列,以及用于订阅服务器连接到发布服务器时使用的凭据。
(可选)编写订阅脚本。
从发布者创建拉取订阅
在 SQL Server Management Studio 中连接到发布服务器,然后展开该服务器节点。
展开 “复制 ”文件夹,然后展开 “本地发布” 文件夹。
右键单击要为其创建一个或多个订阅的发布,然后单击“ 新建订阅”。
完成“新建订阅向导”中的页面。
从订阅方创建拉取订阅
在 SQL Server Management Studio 中连接到订阅服务器,然后展开服务器节点。
展开 “复制 ”文件夹。
右键单击 “本地订阅 ”文件夹,然后单击“ 新建订阅”。
在“新建订阅向导”的“发布”页上,从<下拉列表中选择“<”或“>查找 Oracle 发布者”。
在“连接到服务器”对话框中连接到发布者。
在 “发布 ”页上选择一个出版物。
完成“新建订阅向导”中的页面。
使用 Transact-SQL
可以使用复制存储过程以编程方式创建拉取订阅。 使用的存储过程将取决于订阅所属的发布类型。
创建快照或事务发布的拉取订阅
在发布服务器上,通过执行 sp_helppublication(Transact-SQL)来验证发布是否支持请求订阅。
如果结果集中 allow_pull 值为 1,则发布支持请求订阅。
如果allow_pull值为0,则执行sp_changepublication(Transact-SQL),并指定allow_pull为@property以及
true
为@value。
在订阅服务器上,执行sp_addpullsubscription(Transact-SQL)。 指定 @publisher 和 @publication。 有关更新订阅的信息,请参阅 创建事务发布的可更新订阅。
在订阅端,执行sp_addpullsubscription_agent(Transact-SQL)。 指定以下内容:
@publisher、@publisher_db和@publication参数。
订阅服务器上分发代理使用的 Microsoft Windows 凭据,用户名为 @job_login,密码为 @job_password。
注释
使用 Windows 集成身份验证建立的连接始终使用 由@job_login 和 @job_password指定的 Windows 凭据。 分发代理始终使用 Windows 集成身份验证与订阅服务器建立本地连接。 默认情况下,代理将使用 Windows 集成身份验证连接到分发服务器。
(可选)如果连接到分发服务器时需要使用 SQL Server 身份验证,则@distributor_security_mode值为 0,Microsoft@distributor_login和@distributor_password的 SQL Server 登录信息。
此订阅分发代理作业的日程安排。 有关详细信息,请参阅 指定同步计划。
在发布服务器上,执行 sp_addsubscription(Transact-SQL) 来注册拉式订阅。 指定 @publication、 @subscriber和 @destination_db。 为@subscription_type指定值为pull。
创建合并发布的提取订阅
在发布服务器上,通过执行 sp_helpmergepublication(Transact-SQL)来验证发布是否支持请求订阅。
如果结果集中 allow_pull 值为 1,则发布支持请求订阅。
如果allow_pull的值为 0,则执行sp_changemergepublication(Transact-SQL),指定@property和
true
@value的allow_pull。
在订阅服务器上,执行sp_addmergepullsubscription(Transact-SQL)。 指定 @publisher、 @publisher_db、 @publication和以下参数:
@subscriber_type - 为客户端订阅指定 本地 ,并为服务器订阅指定 全局 。
@subscription_priority - 指定订阅的优先级(0.00 到 99.99)。 这仅适用于服务器订阅。
有关详细信息,请参阅 高级合并复制冲突检测和解决。
在订阅服务器上,执行sp_addmergepullsubscription_agent(Transact-SQL)。 指定下列参数:
@publisher、 @publisher_db和 @publication。
订阅服务器上的合并代理使用 Windows 凭据来运行 @job_login 和 @job_password。
注释
使用 Windows 集成身份验证建立的连接始终使用 由@job_login 和 @job_password指定的 Windows 凭据。 合并代理始终使用 Windows 集成身份验证与订阅服务器建立本地连接。 默认情况下,代理将使用 Windows 集成身份验证连接到分发服务器和发布服务器。
(可选)如果连接到分发服务器时需要使用 SQL Server 身份验证,则@distributor_security_mode值为 0,@distributor_login和@distributor_password的 SQL Server 登录信息。
(可选)如果连接到发布服务器时需要使用 SQL Server 身份验证,则@publisher_security_mode的值为0,并提供@publisher_login和@publisher_password的 SQL Server 登录信息。
此订阅的合并代理任务的日程安排。 有关详细信息,请参阅 创建事务性发布的可更新订阅。
在发布者处,执行sp_addmergesubscription (Transact-SQL)。 为@subscription_type指定@publication、@subscriber、@subscriber_db和拉取值。 这会注册请求订阅。
示例 (Transact-SQL)
以下示例创建事务发布的请求订阅。 第一批在订阅服务器上执行,第二批在发布服务器上执行。 使用 sqlcmd 脚本变量在运行时提供登录名和密码值。
-- This script uses sqlcmd scripting variables. They are in the form
-- $(MyVariable). For information about how to use scripting variables
-- on the command line and in SQL Server Management Studio, see the
-- "Executing Replication Scripts" section in the topic
-- "Programming Replication Using System Stored Procedures".
-- Execute this batch at the Subscriber.
DECLARE @publication AS sysname;
DECLARE @publisher AS sysname;
DECLARE @publicationDB AS sysname;
SET @publication = N'AdvWorksProductTran';
SET @publisher = $(PubServer);
SET @publicationDB = N'AdventureWorks2012';
-- At the subscription database, create a pull subscription
-- to a transactional publication.
USE [AdventureWorks2012Replica]
EXEC sp_addpullsubscription
@publisher = @publisher,
@publication = @publication,
@publisher_db = @publicationDB;
-- Add an agent job to synchronize the pull subscription.
EXEC sp_addpullsubscription_agent
@publisher = @publisher,
@publisher_db = @publicationDB,
@publication = @publication,
@distributor = @publisher,
@job_login = $(Login),
@job_password = $(Password);
GO
-- This script uses sqlcmd scripting variables. They are in the form
-- $(MyVariable). For information about how to use scripting variables
-- on the command line and in SQL Server Management Studio, see the
-- "Executing Replication Scripts" section in the topic
-- "Programming Replication Using System Stored Procedures".
-- Execute this batch at the Publisher.
DECLARE @publication AS sysname;
DECLARE @subscriber AS sysname;
DECLARE @subscriptionDB AS sysname;
SET @publication = N'AdvWorksProductTran';
SET @subscriber = $(SubServer);
SET @subscriptionDB = N'AdventureWorks2012Replica';
-- At the Publisher, register the subscription, using the defaults.
EXEC sp_addsubscription
@publication = @publication,
@subscriber = @subscriber,
@destination_db = @subscriptionDB,
@subscription_type = N'pull',
@status = N'subscribed';
GO
以下示例创建合并发布的请求订阅。 第一批在订阅服务器上执行,第二批在发布服务器上执行。 使用 sqlcmd 脚本变量在运行时提供登录名和密码值。
-- This script uses sqlcmd scripting variables. They are in the form
-- $(MyVariable). For information about how to use scripting variables
-- on the command line and in SQL Server Management Studio, see the
-- "Executing Replication Scripts" section in the topic
-- "Programming Replication Using System Stored Procedures".
-- Execute this batch at the Subscriber.
DECLARE @publication AS sysname;
DECLARE @publisher AS sysname;
DECLARE @publicationDB AS sysname;
DECLARE @hostname AS sysname;
SET @publication = N'AdvWorksSalesOrdersMerge';
SET @publisher = $(PubServer);
SET @publicationDB = N'AdventureWorks2012';
SET @hostname = N'adventure-works\david8';
-- At the subscription database, create a pull subscription
-- to a merge publication.
USE [AdventureWorks2012Replica]
EXEC sp_addmergepullsubscription
@publisher = @publisher,
@publication = @publication,
@publisher_db = @publicationDB;
-- Add an agent job to synchronize the pull subscription.
EXEC sp_addmergepullsubscription_agent
@publisher = @publisher,
@publisher_db = @publicationDB,
@publication = @publication,
@distributor = @publisher,
@job_login = $(Login),
@job_password = $(Password),
@hostname = @hostname;
GO
-- Execute this batch at the Publisher.
DECLARE @myMergePub AS sysname;
DECLARE @mySub AS sysname;
DECLARE @mySubDB AS sysname;
SET @myMergePub = N'AdvWorksSalesOrdersMerge';
SET @mySub = N'MYSUBSERVER';
SET @mySubDB = N'AdventureWorks2012Replica';
-- At the Publisher, register the subscription, using the defaults.
USE [AdventureWorks2012]
EXEC sp_addmergesubscription @publication = @myMergePub,
@subscriber = @mySub, @subscriber_db = @mySubDB,
@subscription_type = N'pull';
GO
使用复制管理对象 (RMO)
用于创建请求订阅的 RMO 类取决于订阅所属的发布类型。
创建快照或事务发布的拉式订阅
使用 ServerConnection 类创建与订阅服务器和发布服务器的连接。
使用步骤 1 中的 Publisher 连接创建 TransPublication 类的实例。 指定 Name和 DatabaseNameConnectionContext。
调用 LoadProperties 方法。 如果此方法返回
false
,则步骤 2 中指定的属性不正确,或者服务器上不存在发布。在 Visual C# 中的
&
和 Visual Basic 中的And
之间,在 Attributes 属性和 AllowPull 之间执行按位逻辑 AND 操作。 如果结果为None,则将Attributes设置为|
和Or
之间按位逻辑 OR 运算(在 Visual C# 中为Attributes,在 Visual Basic 中为AllowPull)的结果。 然后,调用 CommitPropertyChanges 来启用拉取订阅。如果订阅数据库不存在,请使用 Database 该类创建它。 有关详细信息,请参阅 创建、更改和删除数据库。
创建 TransPullSubscription 类的一个实例。
设置以下订阅属性:
在步骤 1 中创建的 ServerConnection,指向 ConnectionContext 订阅者。
DatabaseName 的订阅数据库的名称。
发布者的名称 PublisherName.
PublicationDBName发布数据库的名称。
发布物名称为PublicationName。
在订阅服务器上运行的分发代理使用 Microsoft Windows 帐户的凭据由 SynchronizationAgentProcessSecurity 提供。Login、Password 或 SecurePassword* 字段指定这些凭据。 此帐户用于与订阅服务器建立本地连接,并使用 Windows 身份验证进行远程连接。
注释
当订阅由固定服务器角色的成员SynchronizationAgentProcessSecurity创建时,不需要设置
sysadmin
,但建议这样做。 在这种情况下,代理将模拟 SQL Server 代理帐户。 有关详细信息,请参阅 复制代理安全模式。(可选)
true
的值用于 CreateSyncAgentByDefault 创建用来同步订阅的代理作业。 如果指定false
(默认值),则只能以编程方式同步订阅,并且当您通过SynchronizationAgent属性访问此对象时,必须指定TransSynchronizationAgent的其他属性。 有关详细信息,请参阅 同步请求订阅。注释
SQL Server 代理在每个版本的 MicrosoftSQL Server 中不可用。 有关 SQL Server 各版本支持的功能列表,请参阅 SQL Server 2014 各版本支持的功能。 为 Express 订阅者指定值
true
时,不会创建代理作业。 然而,与订阅相关的重要元数据存储在订阅方。(可选)在使用 SQL Server 身份验证连接到分发服务器时,设置 DistributorSecurity 的 SqlStandardLogin 和 SqlStandardPassword 或 SecureSqlStandardPassword 字段。
调用 Create 方法。
使用步骤 2 中的类实例 TransPublication ,调用 MakePullSubscriptionWellKnown 方法向发布服务器注册请求订阅。 如果此注册已存在,将发生异常。
为合并发布创建拉式订阅
使用 ServerConnection 类创建与订阅服务器和发布服务器的连接。
使用步骤 1 中的 Publisher 连接创建 MergePublication 类的实例。 指定Name和 DatabaseNameConnectionContext。
调用 LoadProperties 方法。 如果此方法返回
false
,则步骤 2 中指定的属性不正确,或者服务器上不存在发布。在 Visual C# 中的
&
和 Visual Basic 中的And
之间,在 Attributes 属性和 AllowPull 之间执行按位逻辑 AND 操作。 如果结果为None,则将Attributes设置为|
和Or
之间按位逻辑 OR 运算(在 Visual C# 中为Attributes,在 Visual Basic 中为AllowPull)的结果。 然后,调用 CommitPropertyChanges 以启用拉取订阅。如果订阅数据库不存在,请使用 Database 该类创建它。 有关详细信息,请参阅 创建、更改和删除数据库。
创建 MergePullSubscription 类的一个实例。
设置以下订阅属性:
在 ServerConnection 步骤 1 中创建的 ConnectionContext订阅服务器。
DatabaseName 的订阅数据库的名称。
发布服务器的名称。PublisherName
PublicationDBName发布数据库的名称。
发布物名称为PublicationName。
在订阅服务器上运行的合并代理的Microsoft Windows帐户中,Login和Password或SecurePassword*字段SynchronizationAgentProcessSecurity用于提供凭据。 此帐户用于与订阅服务器建立本地连接,并使用 Windows 身份验证进行远程连接。
注释
当订阅由固定服务器角色的成员SynchronizationAgentProcessSecurity创建时,不需要设置
sysadmin
,但建议这样做。 在这种情况下,代理将模拟 SQL Server 代理帐户。 有关详细信息,请参阅 复制代理安全模式。(可选)用于CreateSyncAgentByDefault创建用于同步订阅的代理作业的值
true
。 如果指定false
(默认值),则只能以编程方式同步订阅,并且必须指定从SynchronizationAgent属性访问此对象时的其他属性MergeSynchronizationAgent。 有关详细信息,请参阅 同步请求订阅。(可选) SqlStandardLogin 设置使用 SQL Server 身份验证连接到分发服务器的和 SqlStandardPassword 或 SecureSqlStandardPassword 字段 DistributorSecurity 。
(可选)使用 SQL Server 身份验证连接到发布服务器时,设置 SqlStandardLogin 的 SqlStandardPassword 和 SecureSqlStandardPassword 或 PublisherSecurity 字段。
调用 Create 方法。
使用步骤 2 中的类实例 MergePublication ,调用 MakePullSubscriptionWellKnown 方法向发布服务器注册拉取订阅。 如果此注册已存在,将发生异常。
示例(RMO)
此示例创建事务发布的请求订阅。 Microsoft用于创建分发代理作业的 Windows 帐户凭据在运行时传递。
// Define the Publisher, publication, and databases.
string publicationName = "AdvWorksProductTran";
string publisherName = publisherInstance;
string subscriberName = subscriberInstance;
string subscriptionDbName = "AdventureWorks2012Replica";
string publicationDbName = "AdventureWorks2012";
//Create connections to the Publisher and Subscriber.
ServerConnection subscriberConn = new ServerConnection(subscriberName);
ServerConnection publisherConn = new ServerConnection(publisherName);
// Create the objects that we need.
TransPublication publication;
TransPullSubscription subscription;
try
{
// Connect to the Publisher and Subscriber.
subscriberConn.Connect();
publisherConn.Connect();
// Ensure that the publication exists and that
// it supports pull subscriptions.
publication = new TransPublication();
publication.Name = publicationName;
publication.DatabaseName = publicationDbName;
publication.ConnectionContext = publisherConn;
if (publication.IsExistingObject)
{
if ((publication.Attributes & PublicationAttributes.AllowPull) == 0)
{
publication.Attributes |= PublicationAttributes.AllowPull;
}
// Define the pull subscription.
subscription = new TransPullSubscription();
subscription.ConnectionContext = subscriberConn;
subscription.PublisherName = publisherName;
subscription.PublicationName = publicationName;
subscription.PublicationDBName = publicationDbName;
subscription.DatabaseName = subscriptionDbName;
// Specify the Windows login credentials for the Distribution Agent job.
subscription.SynchronizationAgentProcessSecurity.Login = winLogin;
subscription.SynchronizationAgentProcessSecurity.Password = winPassword;
// Make sure that the agent job for the subscription is created.
subscription.CreateSyncAgentByDefault = true;
// By default, subscriptions to transactional publications are synchronized
// continuously, but in this case we only want to synchronize on demand.
subscription.AgentSchedule.FrequencyType = ScheduleFrequencyType.OnDemand;
// Create the pull subscription at the Subscriber.
subscription.Create();
Boolean registered = false;
// Verify that the subscription is not already registered.
foreach (TransSubscription existing
in publication.EnumSubscriptions())
{
if (existing.SubscriberName == subscriberName
&& existing.SubscriptionDBName == subscriptionDbName)
{
registered = true;
}
}
if (!registered)
{
// Register the subscription with the Publisher.
publication.MakePullSubscriptionWellKnown(
subscriberName, subscriptionDbName,
SubscriptionSyncType.Automatic,
TransSubscriberType.ReadOnly);
}
}
else
{
// Do something here if the publication does not exist.
throw new ApplicationException(String.Format(
"The publication '{0}' does not exist on {1}.",
publicationName, publisherName));
}
}
catch (Exception ex)
{
// Implement the appropriate error handling here.
throw new ApplicationException(String.Format(
"The subscription to {0} could not be created.", publicationName), ex);
}
finally
{
subscriberConn.Disconnect();
publisherConn.Disconnect();
}
' Define the Publisher, publication, and databases.
Dim publicationName As String = "AdvWorksProductTran"
Dim publisherName As String = publisherInstance
Dim subscriberName As String = subscriberInstance
Dim subscriptionDbName As String = "AdventureWorks2012Replica"
Dim publicationDbName As String = "AdventureWorks2012"
'Create connections to the Publisher and Subscriber.
Dim subscriberConn As ServerConnection = New ServerConnection(subscriberName)
Dim publisherConn As ServerConnection = New ServerConnection(publisherName)
' Create the objects that we need.
Dim publication As TransPublication
Dim subscription As TransPullSubscription
Try
' Connect to the Publisher and Subscriber.
subscriberConn.Connect()
publisherConn.Connect()
' Ensure that the publication exists and that
' it supports pull subscriptions.
publication = New TransPublication()
publication.Name = publicationName
publication.DatabaseName = publicationDbName
publication.ConnectionContext = publisherConn
If publication.IsExistingObject Then
If (publication.Attributes And PublicationAttributes.AllowPull) = 0 Then
publication.Attributes = publication.Attributes _
Or PublicationAttributes.AllowPull
End If
' Define the pull subscription.
subscription = New TransPullSubscription()
subscription.ConnectionContext = subscriberConn
subscription.PublisherName = publisherName
subscription.PublicationName = publicationName
subscription.PublicationDBName = publicationDbName
subscription.DatabaseName = subscriptionDbName
subscription.Description = "Pull subscription to " + publicationDbName _
+ " on " + subscriberName + "."
' Specify the Windows login credentials for the Distribution Agent job.
subscription.SynchronizationAgentProcessSecurity.Login = winLogin
subscription.SynchronizationAgentProcessSecurity.Password = winPassword
' Make sure that the agent job for the subscription is created.
subscription.CreateSyncAgentByDefault = True
' By default, subscriptions to transactional publications are synchronized
' continuously, but in this case we only want to synchronize on demand.
subscription.AgentSchedule.FrequencyType = ScheduleFrequencyType.OnDemand
' Create the pull subscription at the Subscriber.
subscription.Create()
Dim registered As Boolean = False
' Verify that the subscription is not already registered.
For Each existing As TransSubscription In publication.EnumSubscriptions()
If existing.SubscriberName = subscriberName And _
existing.SubscriptionDBName = subscriptionDbName Then
registered = True
End If
Next existing
If Not registered Then
' Register the subscription with the Publisher.
publication.MakePullSubscriptionWellKnown( _
subscriberName, subscriptionDbName, _
SubscriptionSyncType.Automatic, _
TransSubscriberType.ReadOnly)
End If
Else
' Do something here if the publication does not exist.
Throw New ApplicationException(String.Format( _
"The publication '{0}' does not exist on {1}.", _
publicationName, publisherName))
End If
Catch ex As Exception
' Implement the appropriate error handling here.
Throw New ApplicationException(String.Format( _
"The subscription to {0} could not be created.", publicationName), ex)
Finally
subscriberConn.Disconnect()
publisherConn.Disconnect()
End Try
此示例创建合并发布的请求订阅。 用于创建合并代理作业的 Windows 帐户凭据在运行时传递。
// Define the Publisher, publication, and databases.
string publicationName = "AdvWorksSalesOrdersMerge";
string publisherName = publisherInstance;
string subscriberName = subscriberInstance;
string subscriptionDbName = "AdventureWorks2012Replica";
string publicationDbName = "AdventureWorks2012";
string hostname = @"adventure-works\garrett1";
//Create connections to the Publisher and Subscriber.
ServerConnection subscriberConn = new ServerConnection(subscriberName);
ServerConnection publisherConn = new ServerConnection(publisherName);
// Create the objects that we need.
MergePublication publication;
MergePullSubscription subscription;
try
{
// Connect to the Subscriber.
subscriberConn.Connect();
// Ensure that the publication exists and that
// it supports pull subscriptions.
publication = new MergePublication();
publication.Name = publicationName;
publication.DatabaseName = publicationDbName;
publication.ConnectionContext = publisherConn;
if (publication.LoadProperties())
{
if ((publication.Attributes & PublicationAttributes.AllowPull) == 0)
{
publication.Attributes |= PublicationAttributes.AllowPull;
}
// Define the pull subscription.
subscription = new MergePullSubscription();
subscription.ConnectionContext = subscriberConn;
subscription.PublisherName = publisherName;
subscription.PublicationName = publicationName;
subscription.PublicationDBName = publicationDbName;
subscription.DatabaseName = subscriptionDbName;
subscription.HostName = hostname;
// Specify the Windows login credentials for the Merge Agent job.
subscription.SynchronizationAgentProcessSecurity.Login = winLogin;
subscription.SynchronizationAgentProcessSecurity.Password = winPassword;
// Make sure that the agent job for the subscription is created.
subscription.CreateSyncAgentByDefault = true;
// Create the pull subscription at the Subscriber.
subscription.Create();
Boolean registered = false;
// Verify that the subscription is not already registered.
foreach (MergeSubscription existing
in publication.EnumSubscriptions())
{
if (existing.SubscriberName == subscriberName
&& existing.SubscriptionDBName == subscriptionDbName
&& existing.SubscriptionType == SubscriptionOption.Pull)
{
registered = true;
}
}
if (!registered)
{
// Register the local subscription with the Publisher.
publication.MakePullSubscriptionWellKnown(
subscriberName, subscriptionDbName,
SubscriptionSyncType.Automatic,
MergeSubscriberType.Local, 0);
}
}
else
{
// Do something here if the publication does not exist.
throw new ApplicationException(String.Format(
"The publication '{0}' does not exist on {1}.",
publicationName, publisherName));
}
}
catch (Exception ex)
{
// Implement the appropriate error handling here.
throw new ApplicationException(String.Format(
"The subscription to {0} could not be created.", publicationName), ex);
}
finally
{
subscriberConn.Disconnect();
publisherConn.Disconnect();
}
' Define the Publisher, publication, and databases.
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publisherName As String = publisherInstance
Dim subscriberName As String = subscriberInstance
Dim subscriptionDbName As String = "AdventureWorks2012Replica"
Dim publicationDbName As String = "AdventureWorks2012"
Dim hostname As String = "adventure-works\garrett1"
'Create connections to the Publisher and Subscriber.
Dim subscriberConn As ServerConnection = New ServerConnection(subscriberName)
Dim publisherConn As ServerConnection = New ServerConnection(publisherName)
' Create the objects that we need.
Dim publication As MergePublication
Dim subscription As MergePullSubscription
Try
' Connect to the Subscriber.
subscriberConn.Connect()
' Ensure that the publication exists and that
' it supports pull subscriptions.
publication = New MergePublication()
publication.Name = publicationName
publication.DatabaseName = publicationDbName
publication.ConnectionContext = publisherConn
If publication.LoadProperties() Then
If (publication.Attributes And PublicationAttributes.AllowPull) = 0 Then
publication.Attributes = publication.Attributes _
Or PublicationAttributes.AllowPull
End If
' Define the pull subscription.
subscription = New MergePullSubscription()
subscription.ConnectionContext = subscriberConn
subscription.PublisherName = publisherName
subscription.PublicationName = publicationName
subscription.PublicationDBName = publicationDbName
subscription.DatabaseName = subscriptionDbName
subscription.HostName = hostname
' Specify the Windows login credentials for the Merge Agent job.
subscription.SynchronizationAgentProcessSecurity.Login = winLogin
subscription.SynchronizationAgentProcessSecurity.Password = winPassword
' Make sure that the agent job for the subscription is created.
subscription.CreateSyncAgentByDefault = True
' Create the pull subscription at the Subscriber.
subscription.Create()
Dim registered As Boolean = False
' Verify that the subscription is not already registered.
For Each existing As MergeSubscription In _
publication.EnumSubscriptions()
If existing.SubscriberName = subscriberName Then
registered = True
End If
Next
If Not registered Then
' Register the local subscription with the Publisher.
publication.MakePullSubscriptionWellKnown( _
subscriberName, subscriptionDbName, _
SubscriptionSyncType.Automatic, _
MergeSubscriberType.Local, 0)
End If
Else
' Do something here if the publication does not exist.
Throw New ApplicationException(String.Format( _
"The publication '{0}' does not exist on {1}.", _
publicationName, publisherName))
End If
Catch ex As Exception
' Implement the appropriate error handling here.
Throw New ApplicationException(String.Format( _
"The subscription to {0} could not be created.", publicationName), ex)
Finally
subscriberConn.Disconnect()
publisherConn.Disconnect()
End Try
本示例在 MSsubscription_properties中创建合并发布的拉取订阅,而无需创建关联的代理作业和订阅元数据。 用于创建合并代理作业的 Windows 帐户凭据在运行时传递。
// Define the Publisher, publication, and databases.
string publicationName = "AdvWorksSalesOrdersMerge";
string publisherName = publisherInstance;
string subscriberName = subscriberInstance;
string subscriptionDbName = "AdventureWorks2012Replica";
string publicationDbName = "AdventureWorks2012";
//Create connections to the Publisher and Subscriber.
ServerConnection subscriberConn = new ServerConnection(subscriberName);
ServerConnection publisherConn = new ServerConnection(publisherName);
// Create the objects that we need.
MergePublication publication;
MergePullSubscription subscription;
try
{
// Connect to the Subscriber.
subscriberConn.Connect();
// Ensure that the publication exists and that
// it supports pull subscriptions.
publication = new MergePublication();
publication.Name = publicationName;
publication.DatabaseName = publicationDbName;
publication.ConnectionContext = publisherConn;
if (publication.LoadProperties())
{
if ((publication.Attributes & PublicationAttributes.AllowPull) == 0)
{
publication.Attributes |= PublicationAttributes.AllowPull;
}
// Define the pull subscription.
subscription = new MergePullSubscription();
subscription.ConnectionContext = subscriberConn;
subscription.PublisherName = publisherName;
subscription.PublicationName = publicationName;
subscription.PublicationDBName = publicationDbName;
subscription.DatabaseName = subscriptionDbName;
// Specify that an agent job not be created for this subscription. The
// subscription can only be synchronized by running the Merge Agent directly.
// Subscripition metadata stored in MSsubscription_properties will not
// be available and must be specified at run time.
subscription.CreateSyncAgentByDefault = false;
// Create the pull subscription at the Subscriber.
subscription.Create();
Boolean registered = false;
// Verify that the subscription is not already registered.
foreach (MergeSubscription existing
in publication.EnumSubscriptions())
{
if (existing.SubscriberName == subscriberName
&& existing.SubscriptionDBName == subscriptionDbName
&& existing.SubscriptionType == SubscriptionOption.Pull)
{
registered = true;
}
}
if (!registered)
{
// Register the local subscription with the Publisher.
publication.MakePullSubscriptionWellKnown(
subscriberName, subscriptionDbName,
SubscriptionSyncType.Automatic,
MergeSubscriberType.Local, 0);
}
}
else
{
// Do something here if the publication does not exist.
throw new ApplicationException(String.Format(
"The publication '{0}' does not exist on {1}.",
publicationName, publisherName));
}
}
catch (Exception ex)
{
// Implement the appropriate error handling here.
throw new ApplicationException(String.Format(
"The subscription to {0} could not be created.", publicationName), ex);
}
finally
{
subscriberConn.Disconnect();
publisherConn.Disconnect();
}
' Define the Publisher, publication, and databases.
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publisherName As String = publisherInstance
Dim subscriberName As String = subscriberInstance
Dim subscriptionDbName As String = "AdventureWorks2012Replica"
Dim publicationDbName As String = "AdventureWorks2012"
'Create connections to the Publisher and Subscriber.
Dim subscriberConn As ServerConnection = New ServerConnection(subscriberName)
Dim publisherConn As ServerConnection = New ServerConnection(publisherName)
' Create the objects that we need.
Dim publication As MergePublication
Dim subscription As MergePullSubscription
Try
' Connect to the Subscriber.
subscriberConn.Connect()
' Ensure that the publication exists and that
' it supports pull subscriptions.
publication = New MergePublication()
publication.Name = publicationName
publication.DatabaseName = publicationDbName
publication.ConnectionContext = publisherConn
If publication.LoadProperties() Then
If (publication.Attributes And PublicationAttributes.AllowPull) = 0 Then
publication.Attributes = publication.Attributes _
Or PublicationAttributes.AllowPull
End If
' Define the pull subscription.
subscription = New MergePullSubscription()
subscription.ConnectionContext = subscriberConn
subscription.PublisherName = publisherName
subscription.PublicationName = publicationName
subscription.PublicationDBName = publicationDbName
subscription.DatabaseName = subscriptionDbName
' Specify that an agent job not be created for this subscription. The
' subscription can only be synchronized by running the Merge Agent directly.
' Subscripition metadata stored in MSsubscription_properties will not
' be available and must be specified at run time.
subscription.CreateSyncAgentByDefault = False
' Create the pull subscription at the Subscriber.
subscription.Create()
Dim registered As Boolean = False
' Verify that the subscription is not already registered.
For Each existing As MergeSubscription In _
publication.EnumSubscriptions()
If existing.SubscriberName = subscriberName Then
registered = True
End If
Next
If Not registered Then
' Register the local subscription with the Publisher.
publication.MakePullSubscriptionWellKnown( _
subscriberName, subscriptionDbName, _
SubscriptionSyncType.Automatic, _
MergeSubscriberType.Local, 0)
End If
Else
' Do something here if the publication does not exist.
Throw New ApplicationException(String.Format( _
"The publication '{0}' does not exist on {1}.", _
publicationName, publisherName))
End If
Catch ex As Exception
' Implement the appropriate error handling here.
Throw New ApplicationException(String.Format( _
"The subscription to {0} could not be created.", publicationName), ex)
Finally
subscriberConn.Disconnect()
publisherConn.Disconnect()
End Try
此示例创建合并发布的拉取订阅,该订阅可以使用 Web 同步通过 Internet 进行同步。 用于创建合并代理作业的 Windows 帐户凭据在运行时传递。 有关详细信息,请参阅 “配置 Web 同步”。
// Define the Publisher, publication, and databases.
string publicationName = "AdvWorksSalesOrdersMerge";
string publisherName = publisherInstance;
string subscriberName = subscriberInstance;
string subscriptionDbName = "AdventureWorks2012Replica";
string publicationDbName = "AdventureWorks2012";
string hostname = @"adventure-works\garrett1";
string webSyncUrl = "https://" + publisherInstance + "/WebSync/replisapi.dll";
//Create connections to the Publisher and Subscriber.
ServerConnection subscriberConn = new ServerConnection(subscriberName);
ServerConnection publisherConn = new ServerConnection(publisherName);
// Create the objects that we need.
MergePublication publication;
MergePullSubscription subscription;
try
{
// Connect to the Subscriber.
subscriberConn.Connect();
// Ensure that the publication exists and that
// it supports pull subscriptions and Web synchronization.
publication = new MergePublication();
publication.Name = publicationName;
publication.DatabaseName = publicationDbName;
publication.ConnectionContext = publisherConn;
if (publication.LoadProperties())
{
if ((publication.Attributes & PublicationAttributes.AllowPull) == 0)
{
publication.Attributes |= PublicationAttributes.AllowPull;
}
if ((publication.Attributes & PublicationAttributes.AllowWebSynchronization) == 0)
{
publication.Attributes |= PublicationAttributes.AllowWebSynchronization;
}
// Define the pull subscription.
subscription = new MergePullSubscription();
subscription.ConnectionContext = subscriberConn;
subscription.PublisherName = publisherName;
subscription.PublicationName = publicationName;
subscription.PublicationDBName = publicationDbName;
subscription.DatabaseName = subscriptionDbName;
subscription.HostName = hostname;
// Specify the Windows login credentials for the Merge Agent job.
subscription.SynchronizationAgentProcessSecurity.Login = winLogin;
subscription.SynchronizationAgentProcessSecurity.Password = winPassword;
// Enable Web synchronization.
subscription.UseWebSynchronization = true;
subscription.InternetUrl = webSyncUrl;
// Specify the same Windows credentials to use when connecting to the
// Web server using HTTPS Basic Authentication.
subscription.InternetSecurityMode = AuthenticationMethod.BasicAuthentication;
subscription.InternetLogin = winLogin;
subscription.InternetPassword = winPassword;
// Ensure that we create a job for this subscription.
subscription.CreateSyncAgentByDefault = true;
// Create the pull subscription at the Subscriber.
subscription.Create();
Boolean registered = false;
// Verify that the subscription is not already registered.
foreach (MergeSubscription existing
in publication.EnumSubscriptions())
{
if (existing.SubscriberName == subscriberName
&& existing.SubscriptionDBName == subscriptionDbName
&& existing.SubscriptionType == SubscriptionOption.Pull)
{
registered = true;
}
}
if (!registered)
{
// Register the local subscription with the Publisher.
publication.MakePullSubscriptionWellKnown(
subscriberName, subscriptionDbName,
SubscriptionSyncType.Automatic,
MergeSubscriberType.Local, 0);
}
}
else
{
// Do something here if the publication does not exist.
throw new ApplicationException(String.Format(
"The publication '{0}' does not exist on {1}.",
publicationName, publisherName));
}
}
catch (Exception ex)
{
// Implement the appropriate error handling here.
throw new ApplicationException(String.Format(
"The subscription to {0} could not be created.", publicationName), ex);
}
finally
{
subscriberConn.Disconnect();
publisherConn.Disconnect();
}
' Define the Publisher, publication, and databases.
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publisherName As String = publisherInstance
Dim subscriberName As String = subscriberInstance
Dim subscriptionDbName As String = "AdventureWorks2012Replica"
Dim publicationDbName As String = "AdventureWorks2012"
Dim hostname As String = "adventure-works\garrett1"
Dim webSyncUrl As String = "https://" + publisherInstance + "/WebSync/replisapi.dll"
'Create connections to the Publisher and Subscriber.
Dim subscriberConn As ServerConnection = New ServerConnection(subscriberName)
Dim publisherConn As ServerConnection = New ServerConnection(publisherName)
' Create the objects that we need.
Dim publication As MergePublication
Dim subscription As MergePullSubscription
Try
' Connect to the Subscriber.
subscriberConn.Connect()
' Ensure that the publication exists and that
' it supports pull subscriptions and Web synchronization.
publication = New MergePublication()
publication.Name = publicationName
publication.DatabaseName = publicationDbName
publication.ConnectionContext = publisherConn
If publication.LoadProperties() Then
If (publication.Attributes And PublicationAttributes.AllowPull) = 0 Then
publication.Attributes = publication.Attributes _
Or PublicationAttributes.AllowPull
End If
If (publication.Attributes And PublicationAttributes.AllowWebSynchronization) = 0 Then
publication.Attributes = publication.Attributes _
Or PublicationAttributes.AllowWebSynchronization
End If
' Define the pull subscription.
subscription = New MergePullSubscription()
subscription.ConnectionContext = subscriberConn
subscription.PublisherName = publisherName
subscription.PublicationName = publicationName
subscription.PublicationDBName = publicationDbName
subscription.DatabaseName = subscriptionDbName
subscription.HostName = hostname
subscription.CreateSyncAgentByDefault = True
' Specify the Windows login credentials for the Merge Agent job.
subscription.SynchronizationAgentProcessSecurity.Login = winLogin
subscription.SynchronizationAgentProcessSecurity.Password = winPassword
' Enable Web synchronization.
subscription.UseWebSynchronization = True
subscription.InternetUrl = webSyncUrl
' Specify the same Windows credentials to use when connecting to the
' Web server using HTTPS Basic Authentication.
subscription.InternetSecurityMode = AuthenticationMethod.BasicAuthentication
subscription.InternetLogin = winLogin
subscription.InternetPassword = winPassword
' Create the pull subscription at the Subscriber.
subscription.Create()
Dim registered As Boolean = False
' Verify that the subscription is not already registered.
For Each existing As MergeSubscription In _
publication.EnumSubscriptions()
If existing.SubscriberName = subscriberName Then
registered = True
End If
Next
If Not registered Then
' Register the local subscription with the Publisher.
publication.MakePullSubscriptionWellKnown( _
subscriberName, subscriptionDbName, _
SubscriptionSyncType.Automatic, _
MergeSubscriberType.Local, 0)
End If
Else
' Do something here if the publication does not exist.
Throw New ApplicationException(String.Format( _
"The publication '{0}' does not exist on {1}.", _
publicationName, publisherName))
End If
Catch ex As Exception
' Implement the appropriate error handling here.
Throw New ApplicationException(String.Format( _
"The subscription to {0} could not be created.", publicationName), ex)
Finally
subscriberConn.Disconnect()
publisherConn.Disconnect()
End Try