如何代表不同的用户执行 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?的主要内容,如果未能解决你的问题,请参考以下文章