如何在Oracle高级队列中向外部队列用户授予CLOB权限?
我们向用户B授予模式A上的以下权限,以便插入Oracle 12c中的队列:如何在Oracle高级队列中向外部队列用户授予CLOB权限?,oracle,oracle-aq,Oracle,Oracle Aq,我们向用户B授予模式A上的以下权限,以便插入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 E
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。从中猜测,文本消息应该是4000,字节消息应该是2000,因为较小的消息可以放入text\u vc
或bytes\u raw
。但是,有效负载只有大约500个字符长。(我们确实设置了两个标题,但如果我正确理解类型,这些标题将进入单独的标题“字段”)
然而,主要的问题是,当用户B想要将CLOB大小的消息插入模式a时,我们得到了错误ORA-01031:权限不足。作为用户a授权,问题不会出现
我们如何向用户B授予必要的权限
Oracle何时选择使用(C)LOB
一,。我们如何向用户B授予必要的权限
请为ORA-01031:权限不足提供更广泛的异常堆栈
此消息没有说明太多根本原因
这是我的想法
在OracleDB中,JMS类型的排队有一个先决条件,比如sys.aq$\uJMS\u消息
尝试为您的队列启用它
begin
dbms_aqadm.enable_jms_types(queue_table => v_queue_name);
end;
/
顺便说一句,具有LOB的有效负载需要在队列表上具有明确的选择、插入和更新权限
2.Oracle何时选择使用(C)LOB
不需要从文档中猜测。用于队列的负载类型将文本消息存储在text_vc或text_lob变量中。您编写的负载只有大约500个字符长
,正如您在类型定义字段上看到的,它被声明为varchar2(4000),这并不一定意味着它是关于字符的,它也可以是关于字节的-当没有显式声明时,它由nls参数确定(另请参见)
从V$NLS_参数t中选择*其中t.PARAMETER='NLS_LENGTH_SEMANTICS'代码>
对于aq$\u jms\u text\u消息,有两个选项,要么提供大对象数据类型作为输入参数,要么消息>=4000,这就是Oracle将其存储为clob的原因。
类似的情况也适用于aq$\u jms\u bytes\u消息(如果字节的长度\u lob为=<32767,则有效负载为RAW,而有效负载为BLOB)
SYS.AQ$\u JMS\u消息(
文本2(4000),
text_lob clob,
...
--set_text将varchar2中的有效负载设置为text_vc,如果
--payload非常感谢您的回答。事实上,用户缺少更新权限,在插入CLOB或LOB消息时似乎与此相关。
SYS.AQ$_JMS_MESSAGE (
text_vc varchar2(4000),
text_lob clob,
...
-- set_text sets payload in varchar2 into text_vc if the length of
-- payload is <= 4000, into text_lob if otherwise.
MEMBER PROCEDURE set_text ( payload IN VARCHAR2 ),
..
--
-- set_text sets payload in clob in text_lob.
MEMBER PROCEDURE set_text ( payload IN CLOB ),
...
)