異種データベース間の双方向レプリケーションツールDBMotoでは、スクリプトを使用することでカラムの結合・分割を行いながらデータを同期することも可能です。今回の記事では双方向レプリケーションにおいてカラムの結合・分割を実現するサンプルスクリプトとその設定方法をご紹介いたします。
1.カラムの結合
今回は例として、下記図のようにAS/400の2つの数値型カラムを結合して、SQL Serverの日付型カラムへとレプリケーションを行います。
まずはDBMoto管理画面左上にあるグローバルスクリプトボタンをクリックし、ポップアップされたDBMotoグローバルスクリプト画面で下記スクリプトをコピーします。VBスクリプトなのでスクリプト言語はVBに設定します。
Imports System Imports System.Data Imports Microsoft.VisualBasic Imports DBMotoPublic Imports DBMotoScript Namespace DBRS Public Class GlobalScript : Inherits IGlobalScript 'AS/400 to SQL Server CONVERTTODATETIME Public Shared Function CONVERTTODATETIME (objDate As Object, objTime As Object) As Object If (objDate Is Nothing OrElse objDate Is System.DBNull.Value) Or (objTime Is Nothing OrElse objTime Is System.DBNull.Value) Then CONVERTTODATETIME = System.DBNull.Value Else CONVERTTODATETIME = New DateTime(Left(objDate.ToString(),4) , Mid(objDate.ToString(),5,2), Right(objDate.ToString(),2), Left(objTime.ToString(),2), Mid(objTime.ToString(),3,2), Right(objTime.ToString(),2)) End If End Function End Class Public Class MappingRule : Inherits IMappingRule End Class Public Class CreateTableRule : Inherits ICreateTableRule End Class Public Class GlobalEvents : Inherits IGlobalEvents End Class End Namespace
その後、レプリケーションプロパティのフィールドマッピング設定から結合するカラムを指定します。今回はC2カラムとC3カラムを結合するので、C2カラムから出ている矢印を右クリック > 関数へのマッピング画面で下記関数を入力します。
CONVERTTODATETIME([C2],[C3])
関数入力後、指定したカラムからマッピングされていることが確認できます。
設定が完了したらレプリケーションを実行してみます。AS/400のデータが結合されSQL Serverにレプリケーションされることが確認できます。
2.カラムの分割
今度は逆にSQL Serverの日付型カラムを分割し、AS/400の2つの数値型カラムにレプリケーションを行う設定を行います。
グローバルスクリプトに下記スクリプトを追加します。
Imports System Imports System.Data Imports Microsoft.VisualBasic Imports DBMotoPublic Imports DBMotoScript Namespace DBRS Public Class GlobalScript : Inherits IGlobalScript 'AS/400 to SQL Server CONVERT TO DATETIME Public Shared Function CONVERTTODATETIME (objDate as Object, objTime as Object) as Object If (objDate Is Nothing OrElse objDate Is System.DBNull.Value) Or (objTime Is Nothing OrElse objTime Is System.DBNull.Value) Then CONVERTTODATETIME = System.DBNull.Value Else CONVERTTODATETIME = new DateTime(Left(objDate.ToString(),4) , Mid(objDate.ToString(),5,2), Right(objDate.ToString(),2), Left(objTime.ToString(),2), Mid(objTime.ToString(),3,2), Right(objTime.ToString(),2)) End if End Function 'SQL Server to AS/400 CONVERT TO NUMBER(yyyymmdd) Public Shared Function CONVERTDATETONUMBER(objDate as Object) as Object Dim dtDate as DateTime If objDate Is Nothing OrElse objDate Is System.DBNull.Value Then CONVERTDATETONUMBER = System.DBNull.Value Else dtDate = objDate CONVERTDATETONUMBER = dtDate.Year * 10000 + dtDate.Month * 100 + dtDate.Day End if End Function 'SQL Server to AS/400 CONVERT TO NUMBER(hhmmss) Public Shared Function CONVERTDATETOTIME (objDate as Object) as Object Dim dtDate as DateTime If objDate Is Nothing OrElse objDate Is System.DBNull.Value Then CONVERTDATETOTIME = System.DBNull.Value Else dtDate = objDate CONVERTDATETOTIME = dtDate.Hour * 10000 + dtDate.Minute * 100 + dtDate.Second End if End Function End Class Public Class MappingRule : Inherits IMappingRule End Class Public Class CreateTableRule : Inherits ICreateTableRule End Class Public Class GlobalEvents : Inherits IGlobalEvents End Class End Namespace
その後、レプリケーションプロパティのフィールドマッピング設定に分割するカラムを指定します。矢印ボタンをクリックし、逆向きレプリケーションの設定画面にした後、各カラムにドラック&ドロップでマッピングし、各マッピング画面でそれぞれ下記関数を入力します。
CONVERTDATETONUMBER([C2])
CONVERTDATETOTIME([C2])
下の画面はSQL ServerのC2カラムからAS/400のC3カラムにドラッグ&ドロップでマッピングした後に関数設定を行っております。
レプリケーションを実行してみると、SQL Serverのデータが分割されAS/400の各カラムにレプリケーションされることが確認できます。
関連したトピックス
- [DBMoto]数値型フィールドに入っている日時形式のデータを日時型フィールドにレプリケーションするには
- レプリケーションの際にnullを特定の値に変換する方法 その2【リアルタイムレプリケーションツールDBMoto】
- ジュリアンデートのレプリケーション【リアルタイムレプリケーションツールDBMoto】
- [DBMoto]関数を使用してレプリケーション時のデータを変換する方法(VB/C#言語選択、関数適用、ユーザ関数作成、置換関数、一括設定手順)
- [Syniti(旧DBMoto)]レコード競合(コンフリクト)発生時のレコード内容を出力する方法
- 複数の複製元サーバから1つの複製先サーバへの結合レプリケーションもDBMotoで簡単実現
- [DBMoto]「未マッピング使用」機能によるマッピング外のデータを活用したレプリケーション
- 複数のテーブルにあるレコードを1つのテーブルへ統合する際の注意点【リアルタイムレプリケーションツールDBMoto】
- Syniti Data Replication (旧DBMoto)でのスクリプトの書き方②:グローバルスクリプト
- [Syniti(DBMoto)][スクリプト] 特定カラムの値が変更となった場合、ターゲットのレコードを削除するサンプルスクリプト