如何: 建立提取訂閱 (複寫 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。如需更新訂閱的資訊,請參閱<如何:建立交易式發行集的可更新訂閱 (複寫 Transact-SQL 程式設計)>。
在「訂閱者」上,執行 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 程式設計)>。
在「發行者」上,執行 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 驗證」)。
此訂閱之「合併代理程式」作業的排程。如需詳細資訊,請參閱<如何:指定同步排程 (複寫 Transact-SQL 程式設計)>。
在「發行者」上,執行 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