インポートオプション REMAP_SCHEMA のトリガーに対する制限
しばらく放置していたのですが、 impdp で別のスキーマにインポートを行うとトリガーのコンパイルでエラーが発生していました。ドキュメントにも記載されていたのですが、 impdp の REMAP_SCHEMA オプションには「トリガーの場合、 REMAP_SCHEMA はトリガーの所有者のみに影響します。」という制限事項があり、これが影響していました。
インポートがトリガーコンパイルでコケる
そもそも、「 ORA-00942 : 表またはビューが存在しません。」とエラーを出力してくれているので気付かなければいけないのですが、考えることを放置しておりました・・・
今回のケースでは、Aスキーマから別のサーバーのBスキーマーへ開発環境を構築するために、次のようにインポートを行いました。
impdp ユーザー/パスワード DIRECTORY=DPDUMP_DIR DUMPFILE=ダンプファイル名.DMP REMAP_SCHEMA=インポート元スキーマA:インポート先スキーマB
順調にテーブルが作成され、進んでいくのですが途中から次のエラーが出力されます。
ORA-39083: オブジェクト型TRIGGERの作成が次のエラーで失敗しました:
ORA-00942: 表またはビューが存在しません。
エラー文は次のとおりです:
これは、元のスキーマを次のように作成しており、 3行目の「ON Aスキーマ.テーブル名」のようにスキーマも指定してトリガーを作成していました。
CREATE TRIGGER "Aスキーマ"."トリガー名"
BEFORE INSERT OR UPDATE
ON Aスキーマ.テーブル名
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
DECLARE
・・・・・
END;
エラー出力されたログを確認すると、トリガー名に指定したスキーマは置き換えられていましたが「ON Aスキーマ.テーブル名」の部分は置き換えられていませんでした。
CREATE TRIGGER "Bスキーマ"."トリガー名" <--- インポート先のスキーマ
BEFORE INSERT OR UPDATE
ON Aスキーマ.テーブル名 <--- インポート元のスキーマ
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
DECLARE
・・・・・
END;
とりあえずの解決策として、インポート元のトリガーを「ON テーブル名」と修正することで対応しました。ドキュメントでいう「トリガーの場合、 REMAP_SCHEMA はトリガーの所有者のみに影響します。」ではないでしょうか。