如何在Oracle高级队列中向外部队列用户授予CLOB权限?

如何在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

我们向用户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 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 ),
    ...
    )