Oracle11g oracle触发器执行DBMS_AQ获取的权限不足错误

Oracle11g oracle触发器执行DBMS_AQ获取的权限不足错误,oracle11g,oracle-aq,Oracle11g,Oracle Aq,我正在使用oracle 11.2 数据库用户: AQADM:用户拥有队列,并具有AQ\u管理员\u角色 SCOTT:jms用户,具有以下权限 我有下面的存储过程,编译好了。它是从表上的触发器调用的 CREATE OR REPLACE PROCEDURE scott.PROC_JMS_ENQUEUE (NAME VARCHAR, MESSAGE IN VARCHAR) AS msg

我正在使用oracle 11.2

数据库用户:

  • AQADM:用户拥有队列,并具有AQ\u管理员\u角色
  • SCOTT:jms用户,具有以下权限 我有下面的存储过程,编译好了。它是从表上的触发器调用的

    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 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;
    
    当我执行上述存储过程或更新触发触发代码的表时,我得到以下错误:

    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授予

    当我批准以下内容时,它起作用了

    GRANT ENQUEUE ANY QUEUE TO SCOTT;
    


    另外,出于某种原因,为了通过PL/SQL触发器或过程执行,授权必须是“直接”而不是“角色”

    通常,当从sqlplus执行某些代码时对您有效,但从触发器执行时不起作用,原因相同:

    用户拥有特权。直接授予(类型=权限)或间接授予(类型=角色)。当代码作为触发器执行时,只有direct priv.可用。即,您没有AQ_用户_角色的任何授权。检查AQ_用户_角色 定义(一) 认为这个角色已被弃用)并将这些权限直接授予SCOTT