0

我正在使用 oracle 11.2。

数据库用户:

  1. AQADM:用户拥有队列,并拥有AQ_ADMINISTRATOR_ROLE
  2. 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 给用户

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 在此处输入图像描述在此处输入图像描述

4

2 回答 2

2

当我授予以下权限时它起作用了

GRANT ENQUEUE ANY QUEUE TO SCOTT;

Oracle 糟蹋了一份综合文档!

此外,出于某种原因,GRANT 必须“直接”而不是通过“角色”才能通过 PL/SQL 触发器或过程执行!!!!!!

于 2012-12-11T19:46:48.850 回答
0

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

用户有权限。直接授予(类型=特权)或间接授予(类型=角色)。当代码作为触发器执行时,只能直接 priv。可用。IE。您没有来自 AQ_USER_ROLE 的任何授权。检查 AQ_USER_ROLE 定义(我认为这个角色无论如何都已弃用)并将这些权限直接授予 SCOTT。

于 2013-01-25T11:09:58.007 回答