【Oracle】impdpでTABLE_EXISTS_ACTION=REPLACEを指定してもテーブル以外は置換してくれないっぽい
背景
あるスキーマのオブジェクトをまるごと他のスキーマへ移行したかった。
先行資料
すでにタイトルの内容を含んだ記事はQiitaにあった。
table_exists_action = replaceではテーブルを削除できても、ビューやパッケージなどのオブジェクトは削除できない。それらのオブジェクトを削除するコマンドは現在impdpにはないので、きちんとリカバリを実行するのならば、ビューやパッケージを削除するdrop文を作るかスキーマ自体を一度削除してからimpdpするしかない。
この記事の目的
上記記事と同じことを書いても仕方ないので、公式ドキュメントの記載とか、他のスキーマへの移行とかその辺を調べます。
公式ドキュメントの記載
たしかにTABLE_EXIST_ACTIONは表に限定してるっぽい書き方。 他のオブジェクトではないとまでは明示的に書いていないが、オプションの説明の内容を見ても表限定っぽい。
用途
インポート・ユーティリティに対して、作成しようとしている表がすでに存在する場合に行う操作を指定します。
結局、他のスキーマへ移行するには
権限があればユーザーごと作り直しがはやそう。(DBAs-Oracle.com: How to Restore schema using Impdp)
そこまでの権限がないユーザーの場合は、user_objectsからdrop文を生成してdrop後、 recyclebinを掃除?(sql - Delete all contents in a schema in Oracle - Stack Overflow)
user_objectsからまるごとdropしてもディレクトリオブジェクトが巻き込まれてインポートできなくなる心配はなさそう。
すべてのディレクトリは1つのネームスペースに作成されるため、個々のユーザーのスキーマで所有されるわけではありません。ディレクトリに対するオブジェクト権限を特定ユーザーに付与することによって、そのディレクトリ構造内に格納されているBFILEへのアクセスを制限できます。
雑記
1.用意してもらった環境を使ってるだけだとわからないことも多い。でも自分がインフラやDBAをやりたいかというとまだわからない。
2.調べる過程で論理バックアップと物理バックアップという分類があることを知った。
3.無効なユニークインデックスがあるとインポートできないなんて制約があったのね。
データ・ポンプでは、無効な一意索引を持つ表は、ロードされません。データを表にロードするには、その索引を削除するかまたは再度有効にする必要があります。
4.結局なんでテーブルだけTABLE_EXISTS_ACTION=REPLACEみたいな指定ができて、他のオブジェクトはできないのかはよくわからなかった