ソース掲示板




すべてから検索

キーワード   条件 表示 現行ログ 過去ログ トピックス 名前 本文

  メンテナンス 前画面に戻る

対象スレッド 件名: 別スキーマ間のテーブルコピー
名前: lightbox
処理選択
パスワード

件名 別スキーマ間のテーブルコピー
名前 lightbox
コメント
@DIV
ユーザーが [[SELECT ANY TABLE 権限]] を持っておれば、Oracle 接続内で実行すれば
良い事なのですが、ユーザーが自分のスキーマしか見れない場合の特殊な方法です。

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

詳細な解説は後にまわすとして、実際に簡単に実現する方法から説明します。
@END

@C:red(http://winofsql.jp/VA003334/download051208135120.htm(ここから SQLの窓 Build C++)) をダウンロードします
そして、解凍して WinOfSql.exe を実行して下さい。

次に、ツールバーの「O」ボタンをクリックして、
そこにある「ODBC アドミニストレータ」ボタンをクリックして下さい

http://lightbox.cocolog-nifty.com/photos/app/odbc_admin.png

そこから、Microsoft ODBC for Oracle を使用して、DSN を二つ作成します
( 名前が二つ必要なだけなので、接続先は同じで良いです )

http://lightbox.cocolog-nifty.com/photos/app/odbc_admin_2.png

http://lightbox.cocolog-nifty.com/photos/app/odbc_admin_3.png
http://lightbox.cocolog-nifty.com/photos/app/odbc_admin_4.png

それぞれの接続を別々の二つのユーザで確認し、
さらに以下の SQL で、SELECT ANY TABLE 権限 が無い事を確認します
( ※ @C:red(どちらかに、SELECT ANY TABLE 権限 があるとエラーになります、その場合は後述する方法で実行可能です) )

@DIV
select PRIVILEGE 
 from USER_SYS_PRIVS

 union

select PRIVILEGE 
 from ROLE_SYS_PRIVS 

 order by PRIVILEGE
@END

もし、存在したら、SYSTEM ユーザから以下の SQL で削除して下さい。

@DIV
revoke SELECT ANY TABLE from ユーザー
@END
※ ロールで付与されている場合は、ロールから削除する必要がありますが、他への影響に注意して下さい

次に、コピー元のユーザを「COPY_IN」のDSN から開いて、コピーしたいテーブルを複数選択します

http://lightbox.cocolog-nifty.com/photos/app/oracle_copy.jpg

メニューより「処理」=>「エクスポート」=>「Oracle」を選びます

http://lightbox.cocolog-nifty.com/photos/app/oracle_copy_2.jpg


@DIV
● 接続を出力先にします
( 出力先に同名テーブルがあると、追加処理用の確認ダイアログが表示されます )
● 必要であれば、チェックボックスで出力先に主キーを付加するように指示します
@END

http://lightbox.cocolog-nifty.com/photos/app/oracle_copy.png

@DIV
これで、普通のテーブルであればコピーされるたと思いますが、この方法では
テーブル作成は、SQLの窓が行っていますし、片方のユーザーまたは両方のユーザーで
SELECT ANY TABLE 権限があるとエラーになります。

[[そこで、http://lightbox.matrix.jp/ginpro/patio.cgi?mode=view2&f=249&no=13&type=ref&opt=text-align:left;margin-left:5px;&xml=y(次のセクション)では 上記処理の 元々の SQL を書いて実行する方法を説明します]]
@END