0

私はオラクル11.2を使用しています。

データベースユーザー:

  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;

上記のストアドプロシージャを実行するか、トリガーコードを起動するテーブルを更新すると、次のエラーが発生します。

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

編集: これが特権ビューです。すべてがSYSDBAとしてSYSとして付与されます ここに画像の説明を入力してくださいここに画像の説明を入力してください

4

2 に答える 2

2

私がフォローを許可するとうまくいきました

GRANT ENQUEUE ANY QUEUE TO SCOTT;

オラクルは1つの統合されたドキュメントを吸い込みます!

また、PL / SQLトリガーまたはプロシージャを介して実行するには、GRANTが「ロール」を介さずに「直接」である必要がある理由もあります!!!!!

于 2012-12-11T19:46:48.850 に答える
0

通常、一部のコードが sqlplus から実行されたときに機能し、トリガーから実行されたときに機能しない場合は、同じ理由が原因です。

ユーザーには特権があります。直接 (Type=Priviledge) または間接的に (Type=Role) 付与されます。コードがトリガーとして実行される場合、direct priv のみ。利用可能です。すなわち。AQ_USER_ROLE からの付与はありません。AQ_USER_ROLE 定義を確認し (このロールは非推奨だと思います)、これらの特権を SCOTT に直接付与します。

于 2013-01-25T11:09:58.007 に答える