Oracle Advanced QUEUE не существует - это другая схема

У меня та же проблема, которая описана в этом выпуске: предоставить разрешение очередям другой схеме в Oracle.

Но данные разрешения другому пользователю не работают вообще.

Моя очередь:

   DBMS_AQADM.create_queue_table (
      queue_table          => 'event_queue_tab',
      queue_payload_type   => 't_event_queue_payload',
      multiple_consumers   => TRUE,
      comment              => 'Queue Table For Event Messages',
      secure => false);

   -- Create the event queue.
   DBMS_AQADM.create_queue (queue_name    => 'event_queue',
                            queue_table   => 'event_queue_tab');

   -- Start the event queue.
   DBMS_AQADM.start_queue (queue_name => 'event_queue');

Эта очередь, созданная с использованием схемы USER1, В этой схеме у меня есть пакет pkg1 с процедурой, когда я это называю, ее очередь:

PROCEDURE proc1
   IS
      PRAGMA AUTONOMOUS_TRANSACTION;
      l_enqueue_options      DBMS_AQ.ENQUEUE_OPTIONS_T;
      l_message_properties   DBMS_AQ.MESSAGE_PROPERTIES_T;
      l_message_handle       RAW (16);
      l_queue_msg            t_event_queue_payload;
   BEGIN
      l_queue_msg := t_event_queue_payload ('give_me_a_prod');

      DBMS_AQ.enqueue (queue_name           => 'event_queue',
                       enqueue_options      => l_enqueue_options,
                       message_properties   => l_message_properties,
                       payload              => l_queue_msg,
                       msgid                => l_message_handle);
      COMMIT;
   EXCEPTION
      WHEN OTHERS
      THEN
         DBMS_OUTPUT.put_line (
            SQLERRM || ' - ' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
   END proc1;

У меня есть вторая схема USER2, у которой есть права на выполнение pkg1 по определенной роли (ROLE1). Но когда он вызывает proc1, получит следующую ошибку:

ORA-24010: QUEUE USER2.EVENT_QUEUE does not exist - ORA-06512: at "SYS.DBMS_AQ", line 180
ORA-06512: at "USER1.PKG1", line 1808

Я выполнил эту команду привилегий в USER1, но безуспешно:

BEGIN
   DBMS_AQADM.grant_queue_privilege (privilege      => 'ALL',
                                     queue_name     => 'USER1.event_queue',
                                     grantee        => 'USER2',
                                     grant_option   => TRUE);
END;

Я действительно начинаю понимать, как работает Ad.Queues. Я что-то здесь упускаю? Благодарю.

РЕДАКТИРОВАТЬ1: После предоставления предоставлены привилегии для этой очереди:

SELECT grantee,
       owner,
       name,
       grantor,
       enqueue_privilege,
       dequeue_privilege
  FROM queue_privileges
 WHERE name = upper('event_queue');

ROLE1   USER1   EVENT_QUEUE USER1   1   1
USER2   USER1   EVENT_QUEUE USER1   1   1

1 ответ

Решение

Просто предположение, это как-то связано с синонимами? Потому что сообщение об ошибке говорит, что USER2.QUEUE не существует. Может быть, он не может коснуться очереди User1, потому что внутренне пытается найти ее в своей собственной схеме? Попробуйте указать имя очереди в процедуре как user1.event_queue.

Я имею в виду:

PROCEDURE proc1
   IS
      PRAGMA AUTONOMOUS_TRANSACTION;
      l_enqueue_options      DBMS_AQ.ENQUEUE_OPTIONS_T;
      l_message_properties   DBMS_AQ.MESSAGE_PROPERTIES_T;
      l_message_handle       RAW (16);
      l_queue_msg            t_event_queue_payload;
   BEGIN
      l_queue_msg := t_event_queue_payload ('give_me_a_prod');

      DBMS_AQ.enqueue (queue_name           => 'user1.event_queue',
                       enqueue_options      => l_enqueue_options,
                       message_properties   => l_message_properties,
                       payload              => l_queue_msg,
                       msgid                => l_message_handle);
      COMMIT;
   EXCEPTION
      WHEN OTHERS
      THEN
         DBMS_OUTPUT.put_line (
            SQLERRM || ' - ' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
END proc1;

Почему я так говорю? Потому что, когда вы даете разрешение, вы явно упоминаете схему USER1 перед event_queue, и эта процедура работает. Но не делать то же самое при использовании процедуры постановки в очередь.

Другие вопросы по тегам