web-dev-qa-db-ja.com

Oracle Datapump:スキーマの複製時に完全修飾オブジェクトを変更する

私はエレガントな解決策を見つけられなかった問題に直面しました:

スキーマを複製する必要があります同じデータベース内なので、datapumpのremap_schemaインポートパラメータを使用します。

問題は、PL/SQLパッケージに多数の完全修飾オブジェクト名select * from FROM_SCHEMA_A.table_nameなど)が含まれていることです。これらの修飾子は複製されます。これにより、複製されたパッケージが無効になります。

私はcould明らかにgrant all on FROM_SCHEMA_A ... to TO_SCHEMA_Aで問題を解決しましたが、これは私が望んでいることではありません。修飾された名前も変更したいのですが。

エクスポートパラメータ

content=metadata_only
directory=DATAPUMP_DIR
dumpfile=clone_schema.dmp
schemas=from_schema_a
exclude=trigger

インポートパラメータ

directory=DATAPUMP_DIR
dumpfile=clone_schema.dmp
remap_schema=from_schema_a:to_schema_a
transform=OID:n
3

権限を付与すると(上記のように)、問題は解消されたように見えるかもしれませんが、SCHEMA_Bで実行されているコードが、必要としない限り、SCHEMA_Aのテーブルのデータにアクセスしている可能性があります。

残念ながら、datapumpのremap_schemaオプションは実際に実行しようとしていることをサポートしていないため、この問題に対する簡単な答えはありません。しかし、あなたは次のオプションを試すことができます(私は以前にそれをやったことがあります)、

  1. すべてのplsqlコードおよび/またはビュー定義を抽出します(datapumpは、sqlfileオプションを指定したimpdpを使用してこれを行うことができます)。
  2. sedまたはその他の任意のツールを使用して、SCHEMA_Aを置き換えます。 SCHEMA_Bに。接頭辞付きのオブジェクトが表示されます。時折不要な行が変更される可能性があるので、それを追跡して回避策を実装する必要があることに注意してください。
  3. impdpテーブル、インデックス、SCHEMA_Bへの制約
  4. sqlplusを使用してSCHEMA_Bに接続し、手順2で変更したスクリプトを実行して、すべてのplsqlコードを読み込み、ビューやその他の依存オブジェクトを作成します。

面倒ですが、ソーススキーマを修正するまでは、選択肢が多すぎるとは思いません。幸運なことに、コードがそれほど頻繁に変更されない状況にある場合は、変換されたファイルを保持し、何かが壊れるまでこれらの手動の手順を回避できます。

ああ、あなたのpl/sqlコードが "schema_a.package_nameの作成または置換"のように見える場合、不運なことに、remap_schemaはそれをサポートしません(11.2まで、私は12cでまだテストしていません)。

2
Raj