主キー(PK)もDBMoto仮想PKも指定せずに差分レプリケーションを行うには?


DBMotoで差分レプリケーション(ミラーリング)を行う場合には、
原則複製先のターゲットDB側にPKが必要です。

参考:差分レプリケーションに必要なDBの主キーとDBMotoの仮想PK
//www.climb.co.jp/blog_dbmoto/archives/1114

もしDBにもPKがなく、DBMotoの仮想PKとするための一意の(値が重複しないユニークな)フィールド(またはフィールドの組み合わせ)が存在しない場合でも、差分レプリケーションを行うことが可能な方法があります。

方法は複製元のソースDB側のレコードIDを使用します。
例えば、Oracleの場合はROWIDに該当します。

ただし、この方法をとる場合には、ターゲット側DBに対して、ソースのROWIDとマッピングを行う専用のフィールドを新たに用意する必要があります。

以下設定手順です。

ソーステーブルは下記の3フィールドです。
PKの指定はありません。

一方ターゲットテーブルはソーステーブルの3フィールドに加え、ソーステーブルのレコードIDとマッピングするためのフィールドSP_IDを用意します。
このフィールドはDBのPK又はDBMotoの仮想PKの指定が必要です。

レプリケーション定義作成時のマッピング画面ではデフォルトで下記のように表示されています。
これはソースとターゲットで共通のフィールドのみマッピングされている状態です。

ソースのレコードIDとマッピングするターゲットのフィールドSP_IDを右クリックし、「関数へのマッピング」を選択します。

関数プログラムの画面で入力欄に[!RecordID]と入力します。または、左下ペインから値⇒Log Fieldを選択し、右下ペインから !RecordID をダブルクリックすることで上の入力欄に反映されます。

マッピング画面で下記のように表示されていれば問題ありません。

この状態でレプリケーションを開始しますが、ソースのレコードIDをターゲットのフィールドSP_IDへ反映させるために、初期リフレッシュから実行します。
初期リフレッシュ完了後は下記のように表示されています。

ソース

ターゲット

ソース側に1レコードを追加してみました。正常にミラーリングされていることが確認できます。

ソース

ターゲット

関連したトピックス