在sqlplus会话中切换pl / sql代码块中的用户

时间:2009-03-17 15:53:43

标签: plsql

我有一个pl / sql脚本,我从sqlplus会话运行为'sysdba'。

在执行脚本期间,我想切换到另一个用户,这样我就可以为该用户创建一些数据库链接。完成此操作后,脚本应返回'sysdba'进行一些完成。

我尝试使用以下内容:

BEGIN

<do some stuff as sysdba>

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

<create db link for user>

<switch back to sysdba>
END;

然而,似乎'connect'是一个无法使用'execute immediate'运行的命令。

知道怎么做到这一点吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

我不知道你是如何在Orcle中这样做的,但简单的解决方案是将它放在你的SQL脚本而不是PL / 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;

编辑: 根据您的评论,我有另一种解决方案。 仍然使用SQL脚本与一些PLSQL而不是纯PLSQL脚本。 这一次,动态生成一个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

答案 1 :(得分:0)

您可以在创建dblink之前更改为其他架构吗?

ALTER SESSION SET CURRENT_SCHEMA = in_owner;
<create db link for user>
ALTER SESSION SET CURRENT_SCHEMA = 'sysdba';