如何代表不同用户执行oracle DMBS_AQ.REGISTER?

How to execute oracle DMBS_AQ.REGISTER behalf of different user?

一个特权调度程序用户 - 用户 1 收到电子邮件通知,而另外两个(用户 2、用户 3)没有。

我想在 user3 架构上执行下面的代码,我们在 user2 上成功地尝试了这个(代码直接在具有临时 sys.dbms_aq 访问权限的架构上执行)所以他现在收到他的通知。已为用户 1 上的机器人用户代理启用数据库访问。

如您所见,我知道 'what' 解决了问题,但不知道如何解决:-)

问题是 - 我们无法直接访问第二个帐户 (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。

这是我的工作解决方案

>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