Как создать пользователя очереди в оракуле?

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

Я хочу создать схему _USER, которая имеет доступ к очередям, чтобы я мог подключить к ней приложение, а не напрямую к схеме _OWNER.

Вот что я пробовал:

BEGIN 
    
    FOR Q IN (SELECT * FROM ALL_QUEUES WHERE owner = 'AQ_OWNER') LOOP 
    DBMS_OUTPUT.PUT_LINE('queue = ' ||Q.NAME); 
    
    DBMS_AQADM.GRANT_QUEUE_PRIVILEGE('ALL','AQ_OWNER.'||Q.NAME ,'AQ_USER',FALSE); 
    END LOOP;
    
END; 

но когда я помещаю сообщение в очередь, в приложении ничего не происходит.


person Dinu Nicolae    schedule 02.02.2021    source источник


Ответы (1)


Как насчет небольшой помощи вашего администратора баз данных?

Вот что мой пользователь SCOTT видит в all_queues:

SQL> select owner, name from all_queues;

OWNER                          NAME
------------------------------ ------------------------------
SYS                            SRVQUEUE
SYS                            SCHEDULER_FILEWATCHER_Q
SYS                            SCHEDULER$_EVENT_QUEUE

Однако я хотел бы увидеть некоторые другие данные. SYS всемогущий все видит:

SQL> show user
USER is "SYS"
SQL> select owner, name from dba_queues;

OWNER                          NAME
------------------------------ ------------------------------
SYS                            SYS$SERVICE_METRICS
SYS                            AQ$_SYS$SERVICE_METRICS_TAB_E
SYSTEM                         DEF$_AQERROR
SYSTEM                         AQ$_DEF$_AQERROR_E
SYSTEM                         DEF$_AQCALL
SYSTEM                         AQ$_DEF$_AQCALL_E
SYS                            AQ$_KUPC$DATAPUMP_QUETAB_E
<snip>

По-прежнему подключен как SYS, я создам представление, в котором будут отображаться данные только для выбранного мной владельца (в моей базе данных XE особо выбирать нечего, поэтому я буду использовать значения, принадлежащие SYSTEM). Затем предоставьте привилегию select пользователю SCOTT:

SQL> create or replace view v_dba_queues as
  2  select name
  3  from dba_queues
  4  where owner = 'SYSTEM';

View created.

SQL> grant select on v_dba_queues to scott;

Grant succeeded.

Вернемся к SCOTT: чтобы упростить себе жизнь, я сначала создам синоним:

SQL> connect scott/tiger
Connected.
SQL> create synonym v_dba_queues for sys.v_dba_queues;

Synonym created.

Окончательно:

SQL> select * from v_dba_queues;

NAME
------------------------------
DEF$_AQERROR
AQ$_DEF$_AQERROR_E
DEF$_AQCALL
AQ$_DEF$_AQCALL_E

SQL>

По сути, вы бы сделали то же самое; просто ваше представление будет содержать данные для owner = 'QUEUE_OWNER'. Посмотрите, поможет ли это.

person Littlefoot    schedule 02.02.2021