如何代表不同用户执行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
一个特权调度程序用户 - 用户 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