2012-12-11 161 views
0

我正在使用oracle 11.2。oracle触发器执行DBMS_AQ获取的权限不足错误

数据库用户:

  1. AQADM:用户所拥有的队列,并具有AQ_ADMINISTRATOR_ROLE
  2. SCOTT:JMS用户,有以下特权。

我有以下存储过程,编译OK。并且它从表上的触发器被调用。

CREATE OR REPLACE PROCEDURE scott.PROC_JMS_ENQUEUE (NAME  VARCHAR, 
              MESSAGE  IN VARCHAR) 
AS 
    msg     SYS.AQ$_JMS_TEXT_MESSAGE; 
    queue_options  DBMS_AQ.ENQUEUE_OPTIONS_T; 
    msg_props   DBMS_AQ.MESSAGE_PROPERTIES_T; 
    msg_id    RAW (16); 
    no_consumers_error EXCEPTION; 
    PRAGMA EXCEPTION_INIT (no_consumers_error, -24033); 
BEGIN 
-- Ensure what is sent will be a JMS message 
msg := SYS.AQ$_JMS_TEXT_MESSAGE.CONSTRUCT(); 
msg.set_text (MESSAGE); 

--ENQUEUE 
DBMS_AQ.ENQUEUE (queue_name   => 'aqadm.my_queue', 
       enqueue_options  => queue_options, 
       message_properties => msg_props, 
       payload    => msg, 
       msgid    => msg_id); 
    -- Without the following, the procedure will die if none 
    -- Is listening for cache control 
EXCEPTION 
WHEN no_consumers_error 
THEN 
    -- Output it in case, but otherwise swallow 
    DBMS_OUTPUT.PUT_LINE (
    'No interested parties are listening to messages'); 
END; 
/

我具有以下GRANT到用户

GRANT EXECUTE ON AQ_USER_ROLE TO scott; 
GRANT EXECUTE ON SYS.DBMS_AQ TO scott; 
GRANT EXECUTE ON SYS.DBMS_AQIN TO scott; 
--GRANT EXECUTE ON SYS.DBMS_AQJMS_INTERNAL TO scott; 
--GRANT EXECUTE ON SYS.DBMS_TRANSFORM TO scott; 
GRANT EXECUTE ANY PROCEDURE TO scott; 

在i执行上述的存储过程,或者火灾触发代码更新表,我得到以下错误:

exec PROC_JMS_ENQUEUE('Test Message','Dam'); 

ORA-01031: insufficient privileges 
ORA-06512: at "SYS.DBMS_AQ", line 169 
ORA-06512: at "SCOTT.PROC_JMS_ENQUEUE", line 19 
ORA-06512: at line 1 

编辑: 以下是权限视图,全部授权为SYS,如SYSDBA enter image description hereenter image description here

回答

0

通常,当从sqlplus中执行时一些代码对你的作品,但在执行时从触发由同一原因所致,不工作:

用户拥有PRIVS。直接授予(Type = Priviledge)或间接授予(Type = Role)。当代码作为触发器执行时,只能直接使用priv。可用。即。您没有AQ_USER_ROLE的任何资助。检查AQ_USER_ROLE定义(我认为这个角色已被弃用),并将这些权限直接授予SCOTT。