次の方法で共有


トランザクション アーティクル - スキーマの変更を反映するようにカスタム プロシージャを再生成する

適用対象:SQL ServerAzure SQL Managed Instance

既定では、トランザクション レプリケーションでは、パブリケーション内の各テーブル アーティクルについて、内部プロシージャによって生成されるストアド プロシージャを介してサブスクライバーのすべてのデータ変更が行われます。 3 つのプロシージャ (挿入、更新、削除用にそれぞれ 1 つ) がサブスクライバーにコピーされ、挿入、更新、または削除がサブスクライバーにレプリケートされるときに実行されます。

SQL Server パブリッシャー上のテーブルにスキーマ変更が加えられた場合、レプリケーションでは、新しいプロシージャが新しいスキーマと一致するように、同じ内部スクリプト プロシージャのセットを呼び出すことによって、これらのプロシージャが自動的に再生成されます (スキーマ変更のレプリケーションは Oracle パブリッシャーではサポートされていません)。

1 つ以上の既定のプロシージャを置き換えるカスタム プロシージャを指定することもできます。 スキーマの変更がプロシージャに影響する場合は、カスタム プロシージャを変更する必要があります。 たとえば、スキーマ変更によって削除される列をプロシージャが参照している場合には、その列への参照をプロシージャから削除する必要があります。

レプリケーションで新しいカスタム プロシージャをサブスクライバーに反映するには、2 つの方法があります。

  • カスタム スクリプト手順を使用して、レプリケーションで使用される既定値を置き換える
  • 新しいカスタム プロシージャ定義を含むスクリプトを使用する

カスタム スクリプト手順を使用して、レプリケーションで使用される既定値を置き換える

sp_addarticleを実行するときは、@schema_option0x02 ビットがtrueされていることを確認します。

カスタム ストアド プロシージャ定義は、ラッパー ストアド プロシージャ内で動的 Transact-SQL を使用してスクリプト化する必要があります。 このラッパー ストアドプロシージャには、int 型の@artid パラメーターを必ず含めて、サブスクライバーでの作成を確実に行う必要があります。

sp_register_custom_scripting実行し、@type パラメーターにinsertupdate、またはdeleteの値と、@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 ストアド プロシージャをスクリプト化するストアド プロシージャを作成します。 これは、前に示したラッパー ストアド プロシージャです。

    このストアド プロシージャから 0 以外の値が返されると、サブスクライバーで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 パラメーターにはパブリッシャーのスクリプトへのパスを指定します。

次回に関連スキーマが変更されると、各サブスクライバーでは、DDL コマンドと同じトランザクション内でこのスクリプトが実行されます。 スキーマ変更が完了すると、スクリプトの登録が解除されます。 後続のスキーマ変更後にスクリプトを実行するには、スクリプトを再登録する必要があります。