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

时间:2015-01-24 16:07:57

标签: oracle plsql advanced-queuing execute-as

一个特权调度程序用户 - 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。

1 个答案:

答案 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