ソース掲示板




すべてから検索

キーワード   条件 表示 現行ログ 過去ログ トピックス 名前 本文
別スキーマ間のテーブルコピー ( No.12 )
日時: 2008/07/12 16:45
名前: lightbox



ユーザーが SELECT ANY TABLE 権限 を持っておれば、Oracle 接続内で実行すれば
良い事なのですが、ユーザーが自分のスキーマしか見れない場合の特殊な方法です。

この方法は、Oracle の為だけにあるのでは無くいろいろな使い方ができますが、
Oracle で使う場合に注意すべき事がありますし、将来確実に動くがどうかも定かではありません

詳細な解説は後にまわすとして、実際に簡単に実現する方法から説明します。
ここから SQLの窓 Build C++ をダウンロードします そして、解凍して WinOfSql.exe を実行して下さい。 次に、ツールバーの「O」ボタンをクリックして、 そこにある「ODBC アドミニストレータ」ボタンをクリックして下さい そこから、Microsoft ODBC for Oracle を使用して、DSN を二つ作成します ( 名前が二つ必要なだけなので、接続先は同じで良いです ) それぞれの接続を別々の二つのユーザで確認し、 さらに以下の SQL で、SELECT ANY TABLE 権限 が無い事を確認します ( ※ どちらかに、SELECT ANY TABLE 権限 があるとエラーになります、その場合は後述する方法で実行可能です )
select PRIVILEGE 
 from USER_SYS_PRIVS

 union

select PRIVILEGE 
 from ROLE_SYS_PRIVS 

 order by PRIVILEGE
もし、存在したら、SYSTEM ユーザから以下の SQL で削除して下さい。
revoke SELECT ANY TABLE from ユーザー
※ ロールで付与されている場合は、ロールから削除する必要がありますが、他への影響に注意して下さい 次に、コピー元のユーザを「COPY_IN」のDSN から開いて、コピーしたいテーブルを複数選択します メニューより「処理」=>「エクスポート」=>「Oracle」を選びます
● 接続を出力先にします
( 出力先に同名テーブルがあると、追加処理用の確認ダイアログが表示されます )
● 必要であれば、チェックボックスで出力先に主キーを付加するように指示します
これで、普通のテーブルであればコピーされるたと思いますが、この方法では
テーブル作成は、SQLの窓が行っていますし、片方のユーザーまたは両方のユーザーで
SELECT ANY TABLE 権限があるとエラーになります。

そこで、次のセクションでは 上記処理の 元々の SQL を書いて実行する方法を説明します