共用方式為


如何:為交易式發行集啟用更新訂閱 (複寫 Transact-SQL 程式設計)

[!附註]

未來的 Microsoft SQL Server 版本將移除這項功能。請避免在新的開發工作中使用這項功能,並規劃修改目前使用這項功能的應用程式。

當您以程式設計方式使用複寫預存程序來建立交易式發行集時,可以啟用立即訂閱或佇列更新訂閱。

安全性注意事項安全性注意事項

可能的話,會在執行階段提示使用者輸入安全性認證。如果您必須將認證儲存在指令碼檔案中,則必須維護這個檔案的安全性,使他人無法在未獲授權的情況下擅自存取。

建立可支援立即更新訂閱的發行集

  1. 必要時,請為發行集資料庫建立記錄讀取器代理程式作業。

    • 如果記錄讀取器代理程式作業已存在發行集資料庫中,請繼續進行步驟 2。

    • 如果您不確定發行的資料庫是否有記錄讀取器代理程式作業存在,請在發行集資料庫的發行者上執行sp_helplogreader_agent (Transact-SQL)。如果結果集是空的,就必須建立記錄讀取器代理程式作業。

    • 在發行者上,執行 sp_addlogreader_agent (Transact-SQL)。針對 @job_name@password 指定執行此代理程式所使用的 Microsoft Windows 認證。如果代理程式會在連接到發行者時使用 SQL Server 驗證,則也必須指定 @publisher_security_mode 的值 0,以及 @publisher_login@publisher_password 的 MicrosoftSQL Server 登入資訊。

  2. 執行 sp_addpublication (Transact-SQL),為 @allow_sync_tran 參數指定 true 的值。

  3. 在發行者上,執行 sp_addpublication_snapshot (Transact-SQL)。針對 @publication 指定步驟 2 中所使用的發行集名稱,以及針對 @job_name@password 指定快照集代理程式執行時所使用的 Windows 認證。如果代理程式會在連接到發行者時使用 SQL Server 驗證,則也必須指定 @publisher_security_mode 的值 0,以及 @publisher_login@publisher_password 的 SQL Server 登入資訊。這麼做會為發行集建立快照集代理程式作業。

  4. 將發行項加入至發行集。如需詳細資訊,請參閱<如何:定義發行項 (複寫 Transact-SQL 程式設計)>。

  5. 在訂閱者上,建立此發行集的更新訂閱。如需詳細資訊,請參閱<如何:建立交易式發行集的可更新訂閱 (複寫 Transact-SQL 程式設計)>。

建立可支援佇列更新訂閱的發行集

  1. 必要時,請為發行集資料庫建立記錄讀取器代理程式作業。

    • 如果記錄讀取器代理程式作業已存在發行集資料庫中,請繼續進行步驟 2。

    • 如果您不確定發行的資料庫是否有記錄讀取器代理程式作業存在,請在發行集資料庫的發行者上執行sp_helplogreader_agent (Transact-SQL)。如果結果集是空的,就必須建立記錄讀取器代理程式作業。

    • 在發行者上,執行 sp_addlogreader_agent (Transact-SQL)。針對 @job_name@password 指定代理程式執行所使用的 Windows 認證。如果代理程式會在連接到發行者時使用 SQL Server 驗證,則也必須指定 @publisher_security_mode 的值 0,以及 @publisher_login@publisher_password 的 SQL Server 登入資訊。

  2. 必要時,請為散發者建立佇列讀取器代理程式作業。

    • 如果佇列讀取器代理程式作業已存在散發資料庫中,請繼續進行步驟 3。

    • 如果您不確定散發資料庫是否有佇列讀取器代理程式作業存在,請在散發資料庫的散發者上執行 sp_helpqreader_agent (Transact-SQL)。如果結果集是空的,就必須建立佇列讀取器代理程式作業。

    • 在散發者上,執行 sp_addqreader_agent (Transact-SQL)。針對 @job_name@password 指定執行代理程式所使用的 Windows 認證。當佇列讀取器代理程式連接到發行者和訂閱者時,會使用這些認證。如需詳細資訊,請參閱<複寫代理程式安全性模型>。

  3. 執行 sp_addpublication (Transact-SQL),為 @allow_queued_tran 參數指定 true 的值,以及為 @conflict_policy 指定 pub winssub reinitsub wins 的值。

  4. 在發行者上,執行 sp_addpublication_snapshot (Transact-SQL)。為 @publication 指定步驟 3 中所使用的發行集名稱,以及快照集代理程式針對 @snapshot_job_name@password 執行時所使用的 Windows 認證。如果代理程式會在連接到發行者時使用 SQL Server 驗證,則也必須指定 @publisher_security_mode 的值 0,以及 @publisher_login@publisher_password 的 SQL Server 登入資訊。這麼做會為發行集建立快照集代理程式作業。

  5. 將發行項加入至發行集。如需詳細資訊,請參閱<如何:定義發行項 (複寫 Transact-SQL 程式設計)>。

  6. 在訂閱者上,建立此發行集的更新訂閱。如需詳細資訊,請參閱<如何:建立交易式發行集的可更新訂閱 (複寫 Transact-SQL 程式設計)>。

針對允許佇列更新訂閱的發行集變更衝突原則

  • 在發行集資料庫的發行者上,執行 sp_changepublication (Transact-SQL)。為 @property 指定 conflict_policy 的值,以及為 @value 指定所需的衝突原則模式 pub winssub reinitsub wins

範例

此範例會建立一個發行集,它同時支援立即訂閱和佇列更新提取訂閱。

-- To avoid storing the login and password in the script file, the values 
-- are passed into SQLCMD as scripting variables. 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".

--Declarations for adding a transactional publication
DECLARE @publicationDB AS sysname;
DECLARE @publication AS sysname;
DECLARE @login AS sysname;
DECLARE @password AS sysname;
SET @publicationDB = N'AdventureWorks'; 
SET @publication = N'AdvWorksProductTran'; 
SET @login = $(Login); 
SET @password = $(Password); 

USE [AdventureWorks]
-- Enable transactional replication on the publication database.
EXEC sp_replicationdboption 
    @dbname=@publicationDB, 
    @optname=N'publish',
    @value = N'true';

-- Execute sp_addlogreader_agent to create the agent job. 
EXEC sp_addlogreader_agent 
    @job_login = @login, 
    @job_password = @password,
    -- Explicitly specify the use of Windows Integrated Authentication (default) 
    -- when connecting to the Publisher.
    @publisher_security_mode = 1;

-- Create a transactional publication that supports immediate updating, 
-- queued updating, and pull subscriptions. 
EXEC sp_addpublication 
    @publication = @publication, 
    @status = N'active',
    @allow_sync_tran = N'true', 
    @allow_queued_tran = N'true',
    @allow_pull = N'true',
    @independent_agent = N'true',
  -- Explicitly declare the related default properties 
    @conflict_policy = N'pub wins';

-- Create a new snapshot job for the publication, using a default schedule.
EXEC sp_addpublication_snapshot 
    @publication = @publication, 
    @job_login = @login, 
    @job_password = @password,
    -- Explicitly specify the use of Windows Integrated Authentication (default) 
    -- when connecting to the Publisher.
    @publisher_security_mode = 1;
GO

--Declarations for adding an article.
DECLARE @publication AS sysname;
DECLARE @article AS sysname;
DECLARE @owner AS sysname;
SET @publication = N'AdvWorksProductTran';
SET @article = N'Product'; 
SET @owner = N'Production'; 

-- Add a horizontally and vertically filtered article for the Product table.
USE [AdventureWorks]
EXEC sp_addarticle 
    @publication = @publication, 
    @article = @article, 
    @source_table = @article, 
    @vertical_partition = N'false', 
    @type = N'logbased',
    @source_owner = @owner, 
    @destination_owner = @owner;
GO