インポートオプション REMAP_SCHEMA のトリガーに対する制限

メモ:  Category:oracle

しばらく放置していたのですが、 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 はトリガーの所有者のみに影響します。」ではないでしょうか。

bluenote by BBB