例えば上記のように複数のAS/400にあるテーブル(物理ファイル)のレコードをOracleの1つのテーブルにレコード統合する場合、ソース・ターゲットのコネクション設定やレプリケーションの定義は通常と同じように作成しますが、注意が必要です。
DBMotoの初期レプリケーションであるリフレッシュは、まず最初にターゲットのレコードを削除(Truncate)するため、AS/400各サーバからリフレッシュを行ってしまうと、その都度Oracleのレコードを削除してしまうため、データの整合性が取れません。
回避策として、リフレッシュ時にレコードを削除しないように設定することが可能です。
レプリケーション定義で「リフレッシュ時にレコードを削除しない」スクリプトを記述します。
以下がそのスクリプトです。
DBMoto Ver 9以前の場合
———-
Imports Microsoft.VisualBasic Imports DBMotoPublic Imports DBMotoScript Imports DBRS.GlobalScript Imports System.Data Namespace DBRS Public Class ReplicationScript : Inherits IReplicationScript Public Overrides Sub Refresh_onBeforeTruncate(ByRef CancelTruncate As Boolean) CancelTruncate = true End Sub End Class End Namespace
DBMoto Ver 9.5以降の場合
———-
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, ByRef Filter As String) canceltruncate = True End Sub End Class End Namespace
このスクリプトは今回のように複数テーブルからの統合目的以外の場合でも、リフレッシュ時に既にあるレコードを削除したくない場合にももちろん適用できます。
関連したトピックス
- 複数の複製元サーバから1つの複製先サーバへの結合レプリケーションもDBMotoで簡単実現
- [DBMoto]「未マッピング使用」機能によるマッピング外のデータを活用したレプリケーション
- 2つのソーステーブルからターゲットの一つのレコードにレプリケーション
- [DBMoto][スクリプト]条件付きレプリケーションを行うサンプルVBスクリプト
- [Syniti(DBMoto)][スクリプト] 特定カラムの値が変更となった場合、ターゲットのレコードを削除するサンプルスクリプト
- ミラーリングおいてのレコード数を確認の方法【リアルタイムレプリケーションツールDBMoto】
- 外部DLL(COM)の使用方法【リアルタイムレプリケーションツールDBMoto】
- [Syniti(旧DBMoto)]レコード競合(コンフリクト)発生時のレコード内容を出力する方法
- [DBMoto]Oracle順序オブジェクト(シーケンス)のレプリケーションをスクリプトで実現
- レプリケーションの際にnullを特定の値に変換する方法 その2【リアルタイムレプリケーションツールDBMoto】