首页 > 解决方案 > oracle如何创建队列用户?

问题描述

我有一个有一些队列的 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; 

但是当我将消息放入队列时,应用程序中没有任何反应。

标签: oraclequeueoracle-aq

解决方案


您的 DBA 的一点帮助如何?

这是我的用户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-owned 值)。然后授予以下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'. 看看有没有帮助。


推荐阅读