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

Posted

技术标签:

【中文标题】如何代表不同的用户执行 oracle DMBS_AQ.REGISTER?【英文标题】:How to execute oracle DMBS_AQ.REGISTER behalf of different user? 【发布时间】:2015-01-24 16:07:57 【问题描述】:

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

这是我的工作解决方案

>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

【讨论】:

以上是关于如何代表不同的用户执行 oracle DMBS_AQ.REGISTER?的主要内容,如果未能解决你的问题,请参考以下文章

oracle 查看视图

第五讲 Oracle用户

oracle 视图sql语句怎么写

oracle中如何建用户并给用户不同的角色

oracle 视图sql语句怎么写

温故而知新之Oracle 父子游标