適用対象:SQL Server
Azure SQL Managed Instance
既定では、トランザクション レプリケーションでは、パブリケーション内の各テーブル アーティクルについて、内部プロシージャによって生成されるストアド プロシージャを介してサブスクライバーのすべてのデータ変更が行われます。 3 つのプロシージャ (挿入、更新、削除用にそれぞれ 1 つ) がサブスクライバーにコピーされ、挿入、更新、または削除がサブスクライバーにレプリケートされるときに実行されます。
SQL Server パブリッシャー上のテーブルにスキーマ変更が加えられた場合、レプリケーションでは、新しいプロシージャが新しいスキーマと一致するように、同じ内部スクリプト プロシージャのセットを呼び出すことによって、これらのプロシージャが自動的に再生成されます (スキーマ変更のレプリケーションは Oracle パブリッシャーではサポートされていません)。
1 つ以上の既定のプロシージャを置き換えるカスタム プロシージャを指定することもできます。 スキーマの変更がプロシージャに影響する場合は、カスタム プロシージャを変更する必要があります。 たとえば、スキーマ変更によって削除される列をプロシージャが参照している場合には、その列への参照をプロシージャから削除する必要があります。
レプリケーションで新しいカスタム プロシージャをサブスクライバーに反映するには、2 つの方法があります。
- カスタム スクリプト手順を使用して、レプリケーションで使用される既定値を置き換える
- 新しいカスタム プロシージャ定義を含むスクリプトを使用する
カスタム スクリプト手順を使用して、レプリケーションで使用される既定値を置き換える
sp_addarticleを実行するときは、@schema_option0x02
ビットがtrue
されていることを確認します。
注
カスタム ストアド プロシージャ定義は、ラッパー ストアド プロシージャ内で動的 Transact-SQL を使用してスクリプト化する必要があります。 このラッパー ストアドプロシージャには、int 型の@artid パラメーターを必ず含めて、サブスクライバーでの作成を確実に行う必要があります。
sp_register_custom_scripting実行し、@type パラメーターにinsert
、update
、またはdelete
の値と、@value パラメーターのカスタム スクリプト プロシージャの名前を指定します。
次回にスキーマが変更されると、レプリケーションによってこのストアド プロシージャが呼び出され、新しくユーザーが定義したカスタム ストアド プロシージャの定義がスクリプト化されて、プロシージャが各サブスクライバーに反映されます。
例
この例では、パブリッシャーとサブスクライバーが既に構成されており、カスタム delete
ストアド プロシージャを作成するとします。
サブスクライバーで、カスタム削除スクリプトを紹介するテーブルを作成します。
USE [SubscriberDB]; GO CREATE TABLE DeleteLogging (id INT PRIMARY KEY); GO
パブリッシャーから記事を追加します。
@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
サブスクライバーで使用する
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
パブリッシャーにカスタム スクリプトを登録します。
USE [PublisherDB]; GO EXECUTE sp_register_custom_scripting @type = 'delete', @value = 'script_custom_delete', @publication = 'PubName1', @article = 'Purchases'; GO
サブスクリプションを追加します。 この例では、
@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 コマンドと同じトランザクション内でこのスクリプトが実行されます。 スキーマ変更が完了すると、スクリプトの登録が解除されます。 後続のスキーマ変更後にスクリプトを実行するには、スクリプトを再登録する必要があります。