共用方式為


交易文章 - 重新生成自訂流程以反映架構變更

適用於:SQL ServerAzure SQL 受控執行個體

根據預設,事務複製會透過內部程序為發行集中的每個資料表文章生成的儲存過程,在訂閱者端進行所有資料變更。 這三個程式(每一個用於插入、更新和刪除)會複製到訂閱者,並在插入、更新或刪除複寫至訂閱者時執行。

對 SQL Server 發行者上的數據表進行架構變更時,複寫會藉由呼叫同一組內部腳本程式自動重新產生這些程式,讓新程式符合新的架構(Oracle 發行者不支援架構變更的復寫)。

您也可以指定自訂程式來取代一或多個預設程式。 如果架構變更會影響程式,則應該變更自定義程式。 例如,如果程序參考在架構變更中被刪除的欄位,則應從程序中移除該欄位的參考。

複寫可透過兩種方式將新的自訂的程序傳播給訂閱者:

  • 使用自訂文本程式取代複寫所使用的預設值
  • 使用包含新自定義程式定義的腳本

使用自訂文本程式取代複寫所使用的預設值

當您執行 sp_addarticle指令時,請確保 @schema_option0x02 位被設置為 true

備註

自定義預存程式的定義必須在一個包裝預存程式中使用動態 Transact-SQL 來編寫腳本。 這個封裝儲存過程也必須包含 @artid 參數,且其類型為 int,以確保它在訂閱者上建立。

執行sp_register_custom_scripting,並為insert 參數指定updatedelete 之一的值,並為@value 參數指定自定義腳本程序的名稱。

當模式更改時,複寫會呼叫此預存程序以生成新使用者自訂預存程序的定義,然後將該程序分發至每位訂閱者。

範例

在此範例中,假設已設定發行者和訂閱者,而且您想要建立自定義 delete 預存程式。

  1. 在訂閱者上,建立數據表來展示自定義刪除腳本。

    USE [SubscriberDB];
    GO
    
    CREATE TABLE DeleteLogging (id INT PRIMARY KEY);
    GO
    
  2. 從發行者新增文章。 請注意 @schema_option@ins_cmd@upd_cmd@del_cmd 參數的值:

    USE [PublisherDB];
    
    EXECUTE sp_addarticle
        @publication = N'PubName1',
        @article = N'Purchases',
        @source_owner = N'dbo',
        @source_object = N'Purchases',
        @type = N'logbased',
        @description = NULL,
        @creation_script = NULL,
        @pre_creation_cmd = N'drop',
        @schema_option = 0x000000000803509F,
        @identityrangemanagementoption = N'manual',
        @destination_table = N'Purchases',
        @destination_owner = N'dbo',
        @vertical_partition = N'false',
        @ins_cmd = N'CALL sp_MSins_dboPurchases',  -- default
        @del_cmd = N'CALL custom_delete',          -- custom
        @upd_cmd = N'SCALL sp_MSupd_dboPurchases'; -- default
    GO
    
  3. 建立一個預存程序來匯出您想在訂閱者上使用的custom_delete預存程序腳本。 這是包裝函式預存程式,如先前所示。

    從這個預存程式傳回非零值會導致 custom_delete 在訂閱者上建立。 應該 SELECT 會傳回將在訂閱者上使用之預存程式的完整 CREATE 定義。

    請注意必要 @artid 參數的使用。

    USE [PublisherDB];
    GO
    
    CREATE OR ALTER PROCEDURE script_custom_delete (@artid INT)
    AS
    BEGIN
        SELECT 'CREATE OR ALTER PROCEDURE custom_delete
                  @pkc1 INT
              AS
              BEGIN
                  INSERT INTO DeleteLogging (id) VALUES (@pkc1)
              END';
        RETURN 0;
    END
    GO
    
  4. 在發行者上註冊自定義腳本。

    USE [PublisherDB];
    GO
    
    EXECUTE sp_register_custom_scripting
        @type = 'delete',
        @value = 'script_custom_delete',
        @publication = 'PubName1',
        @article = 'Purchases';
    GO
    
  5. 新增訂用帳戶。 在此範例中 @sync_type ,參數會設定為 replication support only,因此不會使用快照集。

    USE [PublisherDB];
    GO
    
    EXECUTE sp_addsubscription
        @publication = N'PubName1',
        @subscriber = @@SERVERNAME,
        @destination_db = N'SubscriberDB',
        @subscription_type = N'Push',
        @sync_type = N'replication support only',
        @article = N'all',
        @update_mode = N'read only',
        @subscriber_type = 0;
    GO
    

使用包含新自定義程式定義的腳本

當您執行 sp_addarticle時,請將 @schema_option0x02 位設定為 false ,讓復寫不會在訂閱者端自動產生自定義程式。

在每次架構變更之前,請先建立新的腳本檔案,然後執行 sp_register_custom_scripting,並將腳本註冊到複製程序中。 請為 custom_script 參數指定的值,並設定 @value 參數在 Publisher 上的腳本路徑。

在每次更動相關結構描述時,此指令碼會在相同的交易中執行於每個「訂閱者」,與 DDL 命令同步執行。 架構更改後,指令碼將被取消註冊。 您必須重新註冊腳本,讓腳本在後續的架構變更之後執行。