建立提取訂閱
本主題描述如何使用 SQL Server Management Studio、Transact-SQL 或 Replication Management Objects (RMO),在 SQL Server 2012 中建立提取訂閱。
為 P2P 複寫設定提取訂閱可透過指令碼來進行,但無法透過精靈進行。
本主題內容
若要建立提取訂閱,請使用:
SQL Server Management Studio
Transact-SQL
Replication Management Objects (RMO)
使用 SQL Server Management Studio
使用「新增訂閱精靈」在「發行者」或「訂閱者」端建立提取訂閱。 依照精靈中各頁面進行:
指定發行者和發行集。
選取要執行複寫代理程式的位置。 對於提取訂閱,根據發行集類型在 [散發代理程式位置] 頁面或 [合併代理程式位置] 頁面上選取 [在訂閱者端執行每一個代理程式 (提取訂閱)]。
指定訂閱者與訂閱資料庫。
指定複寫代理程式要連接用的登入和密碼:
針對快照集和交易式發行集的訂閱,請於 [散發代理程式安全性] 頁面指定認證。
針對合併式發行集的訂閱,請於 [合併代理程式安全性] 頁面指定認證。
如需有關各代理程式需要的權限資訊,請參閱<複寫代理程式安全性模型>。
指定同步處理排程,以及訂閱者要初始化的時間。
指定合併式發行集的其他選項:訂閱類型;參數化篩選的值;以及如果針對 Web 同步處理啟用該發行集時,透過 HTTPS 同步處理的資訊。
為交易式發行集指定其他選項,以允許更新訂閱:訂閱者是否應立即在發行者端認可變更,或者應寫入佇列;認證用來連接訂閱者和發行者。
選擇性的編寫訂閱指令碼。
若要從發行者建立提取訂閱
連接到 Microsoft SQL Server Management Studio 的發行者,然後展開伺服器節點。
展開 [複寫] 資料夾,然後展開 [本機發行集] 資料夾。
以滑鼠右鍵按一下您要建立一個或多個訂閱的發行集,然後按一下 [新增訂閱]。
在新增訂閱精靈中完成頁面。
若要從訂閱者建立提取訂閱
連接到 SQL Server Management Studio 中的訂閱者,然後展開伺服器節點。
展開 [複寫] 資料夾。
以滑鼠右鍵按一下 [區域訂閱] 資料夾,然後按一下 [新增訂閱]。
在新增訂閱精靈的 [發行集] 頁面上,從 [發行者] 下拉式清單中,選取 <Find SQL Server Publisher> 或 <Find Oracle Publisher>。
連接到 [連接到伺服器] 對話方塊中的發行者。
選取 [發行集] 頁面上的發行集。
在新增訂閱精靈中完成頁面。
[回到頁首]
使用 Transact-SQL
您可以使用複寫預存程序以程式設計的方式建立提取訂閱。 使用哪些預存程序要依訂閱所屬的發行集類型而定。
若要建立快照式或交易式發行集的提取訂閱
在「發行者」上,藉由執行 sp_helppublication (Transact-SQL) 來確認發行集支援提取訂閱。
如果結果集中 allow_pull 的值為 1,則發行集支援提取訂閱。
如果 allow_pull 的值為 0,請執行 sp_changepublication (Transact-SQL),將 @property 指定為 allow_pull,並將 @value 指定為 true。
在「訂閱者」上,執行 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 整合式驗證」連接到「散發者」。
(選擇性) @distributor_security_mode 的值 0,以及 @distributor_login 和 @distributor_password 的 Microsoft SQL Server 登入資訊 (如果您在連接到散發者時需要使用「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 指定為 allow_pull,並將 @value 指定為 true。
在「訂閱者」上,執行 sp_addmergepullsubscription (Transact-SQL)。 指定 @publisher、@publisher_db、@publication 和下列參數:
@subscriber_type:將客訂閱指定為 local,並將主訂閱指定為 global。
@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 整合式驗證」連接到「發行者」。
(選擇性) @distributor_security_mode 的值 0,以及 @distributor_login 和 @distributor_password 的 SQL Server 登入資訊 (如果您在連接到散發者時需要使用「SQL Server 驗證」)。
(選擇性) @publisher_security_mode 的值 0,以及 @publisher_login 和 @publisher_password 的 SQL Server 登入資訊 (如果您在連接到「發行者」時需要使用「SQL Server 驗證」)。
此訂閱之「合併代理程式」作業的排程。 如需詳細資訊,請參閱<建立交易式發行集的可更新訂閱>。
在「發行者」上,執行 sp_addmergesubscription (Transact-SQL)。 指定 @publication、@subscriber、@subscriber_db,並將 @subscription_type 的值指定為 pull。 如此會註冊提取訂閱。
範例 (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
[回到頁首]
使用 Replication Management Objects (RMO)
用於建立提取訂閱的 RMO 類別依該訂閱所屬的發行集類型而定。
若要建立快照式或交易式發行集的提取訂閱
使用 ServerConnection 類別建立到「訂閱者」和「發行者」的連接。
使用步驟 1 中的發行者連接建立 TransPublication 類別的執行個體。 指定 Name、DatabaseName 和 ConnectionContext。
呼叫 LoadProperties 方法。 如果此方法傳回 false,則表示步驟 2 中指定的屬性不正確,或伺服器上不存在該發行集。
在 Attributes 屬性和 AllowPull 之間執行位元運算邏輯 AND (Visual C# 中的 & 和 Visual Basic 中的 And)。 如果結果為 None,請將 Attributes 設定為位元邏輯 OR 的結果 (Visual C# 中為 |且 Visual Basic 中為 Or),而且請在 Attributes 與 AllowPull 之間設定。 然後呼叫 CommitPropertyChanges 以啟用提取訂閱。
如果訂閱資料庫不存在,可使用 Database 類別建立它。 如需詳細資訊,請參閱<建立、改變和移除資料庫>。
建立 TransPullSubscription 類別的執行個體。
設定下列訂閱屬性:
將 ConnectionContext 設為到步驟 1 中建立之「訂閱者」的 ServerConnection。
將 DatabaseName 設為訂閱資料庫的名稱。
將 PublisherName 設為「發行者」的名稱。
將 PublicationDBName 設為發行集資料庫的名稱。
將 PublicationName 設為發行集的名稱。
SynchronizationAgentProcessSecurity 的 Login 和 Password (或 SecurePassword) 欄位,為「散發代理程式」在「訂閱者」上執行時所使用的 Microsoft Windows 帳戶提供認證。 此帳戶用於建立到「訂閱者」的本機連接,以及使用「Windows 驗證」建立遠端連接。
[!附註]
當訂閱是由 sysadmin 固定伺服器角色的成員建立時,不需要設定 SynchronizationAgentProcessSecurity,但還是建議您對其進行設定。 在這種情況下,代理程式會模擬「SQL Server Agent」帳戶。 如需詳細資訊,請參閱<複寫代理程式安全性模型>。
(選擇性) CreateSyncAgentByDefault 的 true 值,以建立用於同步處理訂閱的代理程式作業。 如果指定 false (預設值),則只能以程式設計的方式同步處理訂閱,而且您在從 SynchronizationAgent 屬性存取此物件時必須指定其他屬性 TransSynchronizationAgent。 如需詳細資訊,請參閱<同步處理提取訂閱>。
[!附註]
並非所有 Microsoft SQL Server 版本都可使用 SQL Server Agent。 如需 SQL Server 版本所支援功能的清單,請參閱<SQL Server 2012 版本支援的功能>。 當您為 Express 訂閱者指定值 true 時,不會建立代理程式作業。 不過,在「訂閱者」上會儲存重要的訂閱相關中繼資料。
(選擇性) 在使用「SQL Server 驗證」連接到「散發者」時,設定 DistributorSecurity 的 SqlStandardLogin 和 SqlStandardPassword (或 SecureSqlStandardPassword) 欄位。
呼叫 Create 方法。
使用步驟 2 中 TransPublication 類別的執行個體,呼叫 MakePullSubscriptionWellKnown 方法,以使用「發行者」註冊提取訂閱。 如果此註冊已存在,則會發生例外狀況。
若要建立合併式發行集的提取訂閱
使用 ServerConnection 類別建立到「訂閱者」和「發行者」的連接。
使用步驟 1 中的發行者連接建立 MergePublication 類別的執行個體。 指定 Name、DatabaseName 和 ConnectionContext。
呼叫 LoadProperties 方法。 如果此方法傳回 false,則表示步驟 2 中指定的屬性不正確,或伺服器上不存在該發行集。
在 Attributes 屬性和 AllowPull 之間執行位元運算邏輯 AND (Visual C# 中的 & 和 Visual Basic 中的 And)。 如果結果為 None,請將 Attributes 設定為位元邏輯 OR 的結果 (Visual C# 中為 |且 Visual Basic 中為 Or),而且請在 Attributes 與 AllowPull 之間設定。 然後呼叫 CommitPropertyChanges 以啟用提取訂閱。
如果訂閱資料庫不存在,可使用 Database 類別建立它。 如需詳細資訊,請參閱<建立、改變和移除資料庫>。
建立 MergePullSubscription 類別的執行個體。
設定下列訂閱屬性:
將 ConnectionContext 設為到步驟 1 中建立之「訂閱者」的 ServerConnection。
將 DatabaseName 設為訂閱資料庫的名稱。
將 PublisherName 設為「發行者」的名稱。
將 PublicationDBName 設為發行集資料庫的名稱。
將 PublicationName 設為發行集的名稱。
SynchronizationAgentProcessSecurity 的 Login 和 Password (或 SecurePassword) 欄位,為「合併代理程式」在「訂閱者」上執行時所使用的 Microsoft Windows 帳戶提供認證。 此帳戶用於建立到「訂閱者」的本機連接,以及使用「Windows 驗證」建立遠端連接。
[!附註]
當訂閱是由 sysadmin 固定伺服器角色的成員建立時,不需要設定 SynchronizationAgentProcessSecurity,但還是建議您對其進行設定。 在這種情況下,代理程式會模擬「SQL Server Agent」帳戶。 如需詳細資訊,請參閱<複寫代理程式安全性模型>。
(選擇性) CreateSyncAgentByDefault 的 true 值,以建立用於同步處理訂閱的代理程式作業。 如果指定 false (預設值),則只能以程式設計的方式同步處理訂閱,而且您在從 SynchronizationAgent 屬性存取此物件時必須指定其他屬性 MergeSynchronizationAgent。 如需詳細資訊,請參閱<同步處理提取訂閱>。
(選擇性) 在使用「SQL Server 驗證」連接到「散發者」時,設定 DistributorSecurity 的 SqlStandardLogin 和 SqlStandardPassword (或 SecureSqlStandardPassword) 欄位。
(選擇性) 在使用「SQL Server 驗證」連接到「發行者」時,設定 PublisherSecurity 的 SqlStandardLogin 和 SqlStandardPassword (或 SecureSqlStandardPassword) 欄位。
呼叫 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 同步處理可以從網際網路對其進行同步處理。 用於建立「合併代理程式」作業的 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
[回到頁首]