2009-03-17 19 views
2

私はsqlplusセッションから 'sysdba'として実行するpl/sqlスクリプトを持っています。sqlplusセッションのpl/sqlコードブロックでユーザーを切り替える

スクリプトの実行中に別のユーザーに切り替えたいので、そのユーザーのdbリンク作成を行うことができます。これが行われた後、スクリプトは「sysdba」に戻っていく必要があります。

私は、以下を使用してみました:

BEGIN 

<do some stuff as sysdba> 

execute immediate 'connect ' || in_owner || '/' || v_password; 

<create db link for user> 

<switch back to sysdba> 
END; 

「接続」が「即時実行」で実行できないコマンドであるようだが。

どのようにすればよいでしょうか?

ありがとうございます!

答えて

1

私はOrcleでこれをどうやって行うのか分かりませんが、単純な解決策は、PL/SQLブロックではなくSQLスクリプトに入れることです。

BEGIN 

<do some stuff as sysdba> 

END; 

connect scott/tiger; 

<create db link for user> 

<switch back to sysdba> 

BEGIN 

<do other stuff> 

END; 

EDIT: 下記のコメントに基づき、私はあなたに別の解決策を示します。 まだ純粋なPLSQLスクリプトではなく、一部のPLSQLでSQLスクリプトを使用します。 今回は、リンクを作成して実行するSQLスクリプトを動的に生成します。 複雑なことは、各ユーザーのパスワードを把握する方法にあります。これが動作しない場合

BEGIN 
<do some stuff as sysdba> 
END; 

set serverout on; 
spool create_links.sql 
BEGIN 
    for <loop over each user> loop 
     dbms_output.put_line('connect ' || user || '/' || pass ';'); 
     dbms_output.put_line('<create db link for user>;'); 
    end loop; 
END; 
spool off; 

@@create_links.sql; 

<switch back to sysdba> 

BEGIN 

<do other stuff> 

END; 

最後に、あなたは動的に「AUTHID CURRENT_USER」を使用してトリガーを作成する手順を記述することができます。これにより、プロシージャは所有者ではなく呼び出し元として実行されます。プロシージャを定義するときにAUTHIDキーワードを使用する方法については、hereを参照してください。

+0

私の元の質問が十分にはっきりしていないことがわかります。ユーザーの下のアクションは、複数のユーザスルーループことができるようになります。 は をBEGIN <バックに切り替える エンドループ <ユーザーxとのリンクを作成する>ユーザー スルー ループ sysdbaなど、いくつかの機能を追加> END; –

+0

darreljnzが正しいです、最も簡単な方法は、スクリプトを動的に生成することです。 CREATE DATABASE LINKコマンドが別のスキーマでデータベースリンクを作成することをサポートしていればいいと思いますが、最初の考えはありましたが、代わりに1つのパブリックデータベースリンクを持つことは可能でしょうか?私は、各ユーザが自分のユーザ名とパスワードを使って別のデータベースに接続したいと思っています。 –

0

dblinkを作成する前に別のスキーマに変更できますか?

ALTER SESSION SET CURRENT_SCHEMA = in_owner; 
<create db link for user> 
ALTER SESSION SET CURRENT_SCHEMA = 'sysdba'; 
関連する問題