オプションでfull=yをつけると既存のユーザー等はなくなってしまうのでしょうか?
なくなりません。そのまま残ります。
ユーザーが既に存在しています等のエラーを返さずにインポートするにはどうすればいいでしょうか?
ユーザーやオブジェクトが存在していると、
ORA-31684: オブジェクト型xxx:"yyy"はすでに存在します
のエラーが発生します。
【方法1】
一番手っ取り早いのが新環境の対象ユーザーをドロップしてインポートする事です。
SQL
1--ユーザー(user_name)を所有するオブジェクトを含めて削除する。
2DROP USER user_name CASCADE;
3--この後、インポートを実行する。
【方法1の問題点】
ただしこの方法だとドロップしたユーザーに付与されていた権限が
正常にインポートされない場合があります。
エクスポート/インポート処理に権限はデフォルトで含められますが、
インポートされるのはそのオブジェクトがインポートされた時です。
すでにそのオブジェクトが存在していて上記エラー(ORA-31684)のためにスキップされると、
権限が付与されません。
【方法1の問題点の対処方法】
impdpでは処理内容をファイルに出力できるオプションがあります。
以下のようにして権限付与のためのSQLのみをsqlファイルに出力します。
SQL
1--権限付与SQLのみをgrant_only.sqlファイルに出力する。
2impdp system/password directory=dp_dir dumpfile=dp_name.dmp include=grant sqlfile=grant_only.sql
出力したファイルから@grant_only.sqlでsqlを実行するか、
必要な部分のみを抜き出して実行するなどをすれば解決できます。
ただし定期的にインポートすることを考えると手間がかかりますね。
あらかじめ抜き出したSQLをファイルに保存しておいて@実行するのも良いですが、
旧環境で新たな権限付与された時に漏れが生じないように気を配る必要があります。
【方法2】
方法1では対象ユーザーをオブジェクトを含めて削除することで、
ORA-31684エラーを回避する方法をとりました。
方法2ではユーザーのみを残してユーザーが所持するオブジェクトのみを
すべてドロップしてからインポートすることで権限の問題を回避します。
コードのサンプルは長くなるのでここでは割愛しますが、
参考になるOracle Code TipsのURLを2つ紹介します。
自スキーマ内のオブジェクトを削除する [Tips# 121]
全オブジェクトの削除 [Tips# 1427]
対象が複数ユーザー存在するようでしたらそれぞれのユーザーで上記を実行するか、
user_objectsの代わりにsystemユーザーでdba_objectsに問い合わせて、
owner列でユーザーを指定すると良いと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。