我有一个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'运行的命令。
知道怎么做到这一点吗?
谢谢!
答案 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';