一个特权调度程序用户 - user1接收电子邮件通知,而另外两个(user2,user3)号。
我想在user3架构上执行下面的代码,我们在user2上成功尝试了这个(直接在具有临时sys.dbms_aq访问权限的架构上执行的代码),所以他现在收到他的通知。在user1上为bot用户代理启用了数据库访问。
所以当你看到我知道'什么'解决问题但不知道该怎么做: - )
问题是 - 我们没有直接访问第二个帐户(user3)如何代表user3执行此代码?
declare
reginfo1 sys.aq$_reg_info;
reginfolist sys.aq$_reg_info_list;
begin
reginfo1 := sys.aq$_reg_info('SYS.SCHEDULER$_EVENT_QUEUE:SCHED$_AGT2$_X',
1,
'plsql://SYS.SCHEDULER$_JOB_EVENT_HANDLER',
null);
reginfolist := sys.aq$_reg_info_list(reginfo1);
dbms_aq.register(reginfolist, 1);
end;
已经尝试在user3上创建过程并执行立即匿名块但它仍然在DBA_QUEUE_SUBSCRIBERS中注册USER#1而不是3。
unix上的数据库版本为11.2.0.3.0。
答案 0 :(得分:0)
这是我的工作解决方案
>sqlplus user1
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
SQL> grant execute on sys.dbms_aq to user1;
Grant succeeded.
SQL> alter user user3 grant connect through user1;
User altered.
SQL> connect user1[user3]
Enter password:
Connected.
SQL> create or replace procedure sched_not_add_q as
2 reginfo1 sys.aq$_reg_info;
3 reginfolist sys.aq$_reg_info_list;
4 begin
5 reginfo1 := sys.aq$_reg_info('SYS.SCHEDULER$_EVENT_QUEUE:SCHED$_AGT2$_3',
6 1,
7 'plsql://SYS.SCHEDULER$_JOB_EVENT_HANDLER',
8 null);
9 reginfolist := sys.aq$_reg_info_list(reginfo1);
10 dbms_aq.register(reginfolist, 1);
11 end;
12 /
Procedure created.
SQL> exec sched_not_add_q;
PL/SQL procedure successfully completed.
SQL> drop procedure sched_not_add_q;
Procedure dropped.
SQL> connect user1
Connected.
SQL> revoke execute on sys.dbms_aq from user3;
Revoke succeeded.
SQL> alter user user3 revoke connect through user1;
User altered.
SQL> exit;
>
构想基于: http://www.oracle.com/technetwork/issue-archive/2013/13-mar/o23asktom-1906478.html