如何: 建立提取訂閱 (複寫 Transact-SQL 程式設計)

您可以使用複寫預存程序以程式設計的方式建立提取訂閱。使用哪些預存程序要依訂閱所屬的發行集類型而定。

若要建立快照式或交易式發行集的提取訂閱

  1. 在「發行者」上,藉由執行 sp_helppublication (Transact-SQL) 來確認發行集支援提取訂閱。

    • 如果結果集中 allow_pull 的值為 1,則發行集支援提取訂閱。

    • 如果 allow_pull 的值為 0,請執行 sp_changepublication (Transact-SQL),將 @property 指定為 allow_pull,並將 @value 指定為 true。

  2. 在「訂閱者」上,執行 sp_addpullsubscription (Transact-SQL)。指定 @publisher@publication。如需更新訂閱的資訊,請參閱<如何:建立交易式發行集的可更新訂閱 (複寫 Transact-SQL 程式設計)>。

  3. 在「訂閱者」上,執行 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 驗證」)。

    • 此訂閱之「散發代理程式」作業的排程。如需詳細資訊,請參閱<如何:指定同步排程 (複寫 Transact-SQL 程式設計)>。

  4. 在「發行者」上,執行 sp_addsubscription (Transact-SQL),以註冊提取訂閱。指定 @publication@subscriber@destination_db。將 @subscription_type 的值指定為 pull

若要建立合併式發行集的提取訂閱

  1. 在「發行者」上,藉由執行 sp_helpmergepublication (Transact-SQL) 來確認發行集支援提取訂閱。

    • 如果結果集中 allow_pull 的值為 1,則發行集支援提取訂閱。

    • 如果 allow_pull 的值為 0,請執行 sp_changemergepublication (Transact-SQL),將 @property 指定為 allow_pull,並將 @value 指定為 true。

  2. 在「訂閱者」上,執行 sp_addmergepullsubscription (Transact-SQL)。指定 @publisher@publisher_db@publication 和下列參數:

    • @subscriber_type:將客訂閱指定為 local,並將主訂閱指定為 global

    • @subscription_priority:指定訂閱的優先權 (0.0099.99)。只需要對主訂閱執行此動作。

      如需詳細資訊,請參閱<進階合併式複寫衝突偵測與解決>。

  3. 在「訂閱者」上,執行 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 驗證」)。

    • 此訂閱之「合併代理程式」作業的排程。如需詳細資訊,請參閱<如何:指定同步排程 (複寫 Transact-SQL 程式設計)>。

  4. 在「發行者」上,執行 sp_addmergesubscription (Transact-SQL)。指定 @publication@subscriber@subscriber_db,並將 @subscription_type 的值指定為 pull。如此會註冊提取訂閱。

範例

下列範例會建立交易式發行集的提取訂閱。第一批次在「訂閱者」上執行,而第二批次在「發行者」上執行。登入和密碼值是在執行階段使用 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'AdventureWorks2008R2';

-- At the subscription database, create a pull subscription 
-- to a transactional publication.
USE [AdventureWorks2008R2Replica]
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'AdventureWorks2008R2Replica';

-- 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'AdventureWorks2008R2';
SET @hostname = N'adventure-works\david8';

-- At the subscription database, create a pull subscription 
-- to a merge publication.
USE [AdventureWorks2008R2Replica]
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'AdventureWorks2008R2Replica';

-- At the Publisher, register the subscription, using the defaults.
USE [AdventureWorks2008R2]
EXEC sp_addmergesubscription @publication = @myMergePub, 
@subscriber = @mySub, @subscriber_db = @mySubDB, 
@subscription_type = N'pull';
GO