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, и эта процедура работает. Но не делать то же самое при использовании процедуры постановки в очередь.