外部キーが設定された親子テーブルのリフレッシュの注意点と簡単設定方法


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)に違反しました – 子レコードがあります

関連したトピックス

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください