【发布时间】:2021-03-16 16:20:09
【问题描述】:
我们将架构 A 的以下特权授予用户 B,以便在 Oracle 12c 中插入队列:
GRANT CREATE SESSION TO &UNAME_ENQUEUE;
GRANT EXECUTE ON SYS.DBMS_AQ TO &UNAME_ENQUEUE;
GRANT EXECUTE ON SYS.DBMS_AQADM TO &UNAME_ENQUEUE;
GRANT EXECUTE ON SYS.DBMS_AQIN TO &UNAME_ENQUEUE;
GRANT EXECUTE ON SYS.DBMS_AQJMS TO &UNAME_ENQUEUE;
...
DBMS_AQADM.GRANT_QUEUE_PRIVILEGE (
privilege => 'ENQUEUE',
queue_name => v_queue_name,
grantee => v_grantee_name,
grant_option => FALSE);
队列表定义为:
dbms_aqadm.create_queue_table(queue_table => 'queue_name_t', queue_payload_type => 'sys.aq$_jms_message');
...
GRANT INSERT ON &USERNAME..queue_name_t TO &UNAME_ENQUEUE;
GRANT SELECT ON &USERNAME..queue_name_t TO &UNAME_ENQUEUE;
通过 JMS 接口访问队列。我们注意到对于大小大于 x 的消息,Oracle 希望将消息负载存储为 CLOB。首先,我们不知道 x。从the Specification of the JMS message type 猜测,文本消息应该是 4000,字节消息应该是 2000,因为较小的消息适合 text_vc 或 bytes_raw。然而,有效载荷只有大约 500 个字符长。 (我们确实设置了几个标题,但如果我正确理解类型,它们会进入单独的标题“字段”)。
然而,主要问题是当用户 B 想要将 CLOB 大小的消息插入模式 A 时,我们收到错误 ORA-01031: insufficient privileges。作为用户 A 授权,问题不会出现。
- 我们如何向用户 B 授予必要的权限?
- Oracle 何时选择使用 (C)LOB?
【问题讨论】: