カスタム トランザクション プロシージャの再生成によるスキーマ変更の反映

既定では、トランザクション レプリケーションがサブスクライバ上のデータを変更する際、パブリケーション内の各テーブル アーティクルに対して内部プロシージャが生成したストアド プロシージャが必ず使われます。3 つのプロシージャ (挿入、更新、削除用に 1 つずつ) はサブスクライバにコピーされ、挿入、更新、削除がサブスクライバにレプリケートされた時点で実行されます。SQL Server パブリッシャ上のテーブルでスキーマが変更されると、レプリケーションがスクリプト作成内部プロシージャの同じセットを呼び出すことで、これらのプロシージャが自動的に再生成され、新しいプロシージャと新しいスキーマが一致します (スキーマ変更のレプリケーションは、Oracle パブリッシャではサポートされていません)。

カスタム プロシージャを指定して、1 つ以上の既定のプロシージャを置き換えることもできます。スキーマ変更によってカスタム プロシージャが影響を受ける場合は、そのプロシージャを変更する必要があります。たとえば、スキーマ変更によって削除される列をプロシージャが参照している場合には、その列への参照をプロシージャから削除する必要があります。レプリケーションで新しいカスタム プロシージャをサブスクライバに反映するには、2 つの方法があります。

  • 1 つ目のオプションは、カスタム スクリプト作成プロシージャを使用して、レプリケーションで使用する既定のプロシージャを置き換える方法です。

    1. sp_addarticle (Transact-SQL) を実行する際に、@schema_option 0x02 ビットに true を設定します。

    2. sp_register_custom_scripting (Transact-SQL) を実行し、@type パラメータの値として「insert」、「update」、または「delete」を指定し、@value パラメータにカスタム スクリプト作成プロシージャの名前を指定します。

    次回にスキーマが変更されると、レプリケーションによってこのストアド プロシージャが呼び出され、新しくユーザーが定義したカスタム ストアド プロシージャの定義がスクリプト化されて、プロシージャが各サブスクライバに反映されます。

  • 2 つ目のオプションは、新しいカスタム プロシージャの定義を含むスクリプトを使用する方法です。

    1. sp_addarticle (Transact-SQL) を実行する際に、@schema_option 0x02 ビットに false を設定し、レプリケーションによってカスタム プロシージャがサブスクライバで自動的に生成されないようにします。

    2. 各スキーマ変更の前に、新しいスクリプト ファイルを作成し、sp_register_custom_scripting (Transact-SQL) を実行してスクリプトをレプリケーションに登録します。@type パラメータの値として「custom_script」を指定し、@value パラメータにパブリッシャ上のスクリプトのパスを指定します。

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