複数のテーブルにあるレコードを1つのテーブルへ統合する際の注意点【リアルタイムレプリケーションツールDBMoto】


例えば上記のように複数の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

このスクリプトは今回のように複数テーブルからの統合目的以外の場合でも、リフレッシュ時に既にあるレコードを削除したくない場合にももちろん適用できます。

関連したトピックス