質問: 2` のとき、Bの企業に関するデータ バックアップ時は企業コードに関係なく「expdp」でDBをまるまるエクスポートしたいと考えています。 そして、今回お聞きしたいのが以下のリストア部分になります。 DBの復元時は企業コードを指定し、コードに関するデータのみ個別に復元させられないかと考えています。 一度、一時テーブルにインポートしてから企業コードごとにインサートし直せば良いとは思うのですが、もっと効率的にできないものかと検討しています。 何かいい手段があればご教授頂けませんでしょうか?
回答: impdpにはQUERYオプションがあります。 使用例をリンク先から抜粋: ``` impdp oracle/oracle \ DIRECTORY=DMPDIR \ TABLES=TEST \ TABLE_EXISTS_ACTION=append \ QUERY=\"WHERE ID \>= 10\" \ CONTENT=data_only \ DUMPFILE=TEST.dmp \ LOGFILE=TEST_IMP.log ``` パラメータファイルを使わないと記号のエスケープが必要になる点や、表別名として`KU$`を用いるTipsを意識しないと思わぬ結果になりかねない点にご注意ください。 また、DATA_OPTIONSオプションに`SKIP_CONSTRAINT_ERRORS`を指定することで対応可能かもしれません。 リストア先の企業テーブルを特定の企業コードに絞って配置し、リストアテーブルに企業テーブルの外部キーを作成することで意図的に制約エラーを発生されることができます。 このパラメータを使ったことがないので推測ですが、企業テーブルを書き換えるだけで外部キーをつけた全テーブルが対応可能です。 しかしログがエラーで大変な長さになりそうです。 また素直に考えると全行インサートしてエラーを発生させるこちらよりもQUERYの方が高速と予想されます。 ※QUERY使用例のリンク先も、対象が明確な時は`QUERY`オプションが、そうでない時は`DATA_OPTIONS`オプションの方が実用的だとまとめています。