■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に関してはオートインクリメントで自動採番されることを想定しているため、マッピング対象とはしないでおきます。
以上で設定は完了です。
関連したトピックス
- 複数のテーブルにあるレコードを1つのテーブルへ統合する際の注意点【リアルタイムレプリケーションツールDBMoto】
- [DBMoto]「未マッピング使用」機能によるマッピング外のデータを活用したレプリケーション
- 2つのソーステーブルからターゲットの一つのレコードにレプリケーション
- [DBMoto][スクリプト]条件付きレプリケーションを行うサンプルVBスクリプト
- [Syniti(DBMoto)][スクリプト] 特定カラムの値が変更となった場合、ターゲットのレコードを削除するサンプルスクリプト
- 外部DLL(COM)の使用方法【リアルタイムレプリケーションツールDBMoto】
- ミラーリングおいてのレコード数を確認の方法【リアルタイムレプリケーションツールDBMoto】
- [Syniti(旧DBMoto)]レコード競合(コンフリクト)発生時のレコード内容を出力する方法
- レプリケーションの際にnullを特定の値に変換する方法 その2【リアルタイムレプリケーションツールDBMoto】
- [DBMoto]Oracle順序オブジェクト(シーケンス)のレプリケーションをスクリプトで実現