複数の複製元サーバから1つの複製先サーバへの結合レプリケーションもDBMotoで簡単実現


■2015/06/05記事改訂

DBMotoを使用すると、複数の複製元サーバ(ソース)のテーブルを1つの複製先サーバ(ターゲット)へまとめてレプリケーションすることも可能です。

●各複製元サーバのテーブルそのものを複製先サーバに集約したい場合

この場合はテーブル自体を集約するのみとなりますので、設定上はテーブルA同士、テーブルB同士、テーブルC同士でそれぞれレプリケーション定義を作成するキトで簡単に実現できます。

●各複製元サーバのテーブルのレコードを複製先サーバのテーブルに集約したい場合

この場合はテーブルの集約ではなくレコードの集約となりますので、少し設定の工夫が必要です。注意点としては以下の2つが挙げられます。

1. リフレッシュ時に複製先のレコードを削除しないようにする必要がある。
2. 結合時にPKが重複しないように考慮する必要がある。

1番については、リフレッシュの仕様としてレコード登録時にまずは複製先テーブルのレコードを一度削除します。今回のように各複製元サーバからリフレッシュを行う場合、毎回削除するわけにはいかないので、リフレッシュ時にレコードを削除しないように設定します。これはDBMotoのスクリプト機能を利用します。

※設定するスクリプト

Imports System
Imports System.Data
Imports Microsoft.VisualBasic
Imports DBMotoPublic
Imports DBMotoScript
Imports DBRS.GlobalScript

Namespace DBRS
Public Class ReplicationScript : Inherits IReplicationScript

Public Overrides Sub Refresh_onBeforeTruncate(ByRef CancelTruncate As Boolean)
CancelTruncate = True
End Sub
End Class
End Namespace

スクリプトを設定する場合は、レプリケーションオプションにてUse Scriptにチェックを入れ、Scriptボタンを押下します。

次にスクリプト記述画面が表示されるので、上記のスクリプトをコピペします。

最後にトランケートを行うレプリケーションを先頭、このスクリプトを設定したレプリケーションを後続にした、レプリケーションのグループを構成してください。
これを行えば、レプリケーションの動作順序が保障されるので、同時にレプリケーションが動作した際に不意にデータの連携を失うといった可能性がなくなります。
DBMotoの各レプリケーションをグループ化する際の利点とは?


2番については、複製元の各テーブルのレコードを結合した際に、PKが重複している可能性を考慮して、必ず重複しないフィールドを別途用意しておきます。

上記の例では、NO・NAMEは複製元・複製先共通のフィールドです。NOがPKの場合、このままだとPK重複エラーが発生してしまいますので、以下のフィールドを複製先テーブルに準備します。

SPIDフィールド・・・重複を認めない値としたいため、オートインクリメント(自動採番)とします。
SERVERフィールド・・・こちらは必須ではありませんが、複製元のどのサーバからのレコードかを識別するためにサーバごとに番号を割り振ります。

これらをもとに、DBMotoのフィールドマッピング画面にて以下の設定を行います。

SERVERフィールドを右クリックし、「Map to Expression」を選択します。

入力画面に識別したい値を入力します。ここでは”1″と設定しています。ここで設定した値は常に固定値としてレプリケーション時に挿入されます。

設定後は以下の表示になります。なお、SPIDに関してはオートインクリメントで自動採番されることを想定しているため、マッピング対象とはしないでおきます。

以上で設定は完了です。

関連したトピックス