DBMotoで外部キーが設定された親子テーブルを共に全件リフレッシュによるレプリケーションを行う場合には注意が必要です。
参照されるテーブルAを親、参照するテーブルB(外部キー設定)を子とした場合、
登録する場合はAから、削除する場合はBからである必要があります。
DBMotoでテーブルAとBをグループ化してリフレッシュを行う場合は通常下記の手順がとられます。
1-1. テーブルAをTruncate
1-2. テーブルAにInsert
1-3. テーブルBをTruncate
1-4. テーブルBにInsert
しかしこの手順では外部キー制約違反のエラーが発生してしまいます。
これを実際には下記の手順で行わなければなりません。
2-1. テーブルBをTruncate
2-2. テーブルAをTruncate
2-3. テーブルAにInsert
2-4. テーブルBにInsert
この手順の処理を行うために、
DBMotoで下記の通り設定変更を行います。
まずDBMotoで 2-3/2-4 のInsert処理を順番通りに行うためにグループに所属する各テーブルの処理優先順位を設定します。
しかしこのままだとTruncateの2-1/2-2の処理もこの優先順位通りになってしまいます。
Truncateは逆の順序で行う必要があるため、[Truncate Inverse]の設定を True にします。
以上で正常にリフレッシュレプリケーションを行うことが可能になります。
ただ、少数のテーブルであらば、これでも問題ありませんが、数か増えてくるといちいちボタンで並び替えは手間となります。このような場合には右下の鍵マークをクリックします。
上記のreplication2, 3, 1とグループに追加されていますが、依存関係としては1, 2, 3となるべきものです。そこで鍵マークをクリックすると手動で動かさなくとも、DBMotoが読み取っている外部キー情報に基づき下記のように自動で並び替えをしてくれます。
例えば、Oracleで下記のエラーが発生する場合には上記手順にてグループ化し、リフレッシュを実行してください。
ORA-02291: 整合性制約(string.string)に違反しました – 親キーがありません
ORA-02292: 整合性制約(string.string)に違反しました – 子レコードがあります
関連したトピックス
- 初期同期(リフレッシュ)がより便利に! ステージングリフレッシュ機能
- AS/400でのレコード全消去時における、DBMotoによるミラーリング動作
- DBMoto5 FAQ: 2006-7【リアルタイムレプリケーションツールDBMoto】
- テーブル一括作成やマッピングをカスタマイズ:グローバルスクリプト[Syniti Replicate]
- DBMotoレプリケーションに必要なPostgreSQLユーザ権限
- 初期同期(リフレッシュ)をもっと柔軟にリフレッシュフィルタ機能[DBMoto]
- レプリケーション対象テーブル構成変更後のSyniti Data Replication (旧DBMoto) マッピング対応について
- [DBMoto][スクリプト]条件付きレプリケーションを行うサンプルVBスクリプト
- 2つのソーステーブルからターゲットの一つのレコードにレプリケーション
- IDENTITYカラム設定のエラーについて【リアルタイムレプリケーションツールDBMoto】