レプリケーションの際にnullを特定の値に変換する方法 その1【リアルタイムレプリケーションツールDBMoto】


片方向レプリケーションで、ソースがNULLを許可するフィールド、ターゲットがNULLを許可しない(NOT NULL)フィールド同士でマッピングしていたとします。

この場合、ソースにNULLデータの更新があるとミラーリングによってターゲットにもNULLデータをレプリケーションしますので、NOT NULL制約違反によりエラーとなってしまいます。

DBMotoではスクリプトとExpression機能を使用することで、特定の値の更新があった際に別の値へ変換することができます。

■スクリプトの準備

以下のスクリプトを使用します。このスクリプトは「NULLもしくは空文字が更新されたときに、特定の値を返す」機能のメソッドです。
————-
Public Shared Function SetVAL(obj as Object, obj1 as Object) as Object
If obj is DBNull.Value Then
Return obj1
End if
If obj is nothing Then
Return obj
End if
If String.IsNullOrEmpty(obj.ToString()) = True  Then
Return obj1
Else
Return obj
End If
End Function

————-

スクリプトを適用するため、metadataを右クリックし、「グローバルスクリプト」を選択します。

グローバルスクリプト内に上記スクリプトを埋め込みます。

■マッピング画面でのスクリプト適用

フィールドマッピング画面にて対象のフィールドの矢印部分を右クリックし、Map To Expressionを選択します。

User Functionからグローバルスクリプトで設定した関数を選択し、第1引数にDBのフィールド名、第2引数に変換したい文字列を設定します。ここでは「”NODATA”」という文字列を設定しました。

以上で設定は完了です。この状態でソースにNULLや空文字の更新があった場合、スクリプトを介してターゲットに対しては「NODATA」という文字列でレプリケーションするようになります。

今回はNULLから特定の値への変換方法について紹介しましたが、もちろんNULL以外のデータからの変換も同様の記述で可能です。

■注意点

今回紹介の方法は、設定するフィールドが少ない場合には最適です。ただし、設定するフィールドが多い場合は、テーブルのフィールドごとに設定する必要がある分、設定に時間を要するというデメリットがありました。
同じテーブル内の同じデータタイプであれば、設定を1回で済ますことが可能で、設定に要する時間の短縮化が期待できます。
方法については以下の記事をご参照ください。
レプリケーションの際にnullを特定の値に変換する方法 その2

関連したトピックス