Как предоставить привилегии CLOB пользователю внешней очереди в Oracle Advanced Queuing?

Мы предоставляем следующие привилегии на схеме 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. Судя по Спецификации типа сообщения JMS, он должен быть 4000 для текстовых сообщений и 2000 для байтовых сообщений, так как сообщения меньшего размера помещаются в text_vc или bytes_raw. Однако полезная нагрузка составляет всего около 500 символов. (Мы устанавливаем пару заголовков, но они помещаются в отдельное «поле» заголовка, если я правильно понимаю тип).

Однако основная проблема заключается в том, что мы получаем ошибку ORA-01031: insufficient privileges, когда пользователь B хочет вставить сообщение размером CLOB в схему A. Если вы авторизованы как пользователь A, проблема не возникает.

  1. Как мы можем предоставить необходимые привилегии пользователю B?
  2. Когда Oracle решает использовать (C) LOB?

person Seldon    schedule 04.12.2020    source источник


Ответы (1)


1. Как мы можем предоставить необходимые привилегии пользователю B?

Пожалуйста, предоставьте более обширный стек исключений для ORA-01031: insufficient privileges это сообщение не говорит много о первопричине. Вот мои мысли.

В Oracle DB есть предварительное условие для постановки в очередь JMS-типов, таких как sys.aq $ _jms_message. Попробуйте включить его для своей очереди.

begin
dbms_aqadm.enable_jms_types(queue_table => v_queue_name);
end;
/

Кстати. Полезные данные с большими объектами требуют явных привилегий выбора, вставки и обновления в таблице очереди.

2.Когда Oracle решает использовать (C) LOB?

Не нужно гадать из документов. Тип полезной нагрузки, который вы используете для своей очереди, хранит текстовое сообщение либо в text_vc, либо в переменной text_lob. Вы написали the payload is only about 500 characters long, и, как вы можете видеть в поле определения типа, объявлено как varchar2 (4000), что не обязательно означает, что речь идет о символах, это также может быть о байтах - когда нет явного объявления, оно определяется параметром nls (см. также ссылка) select * from V$NLS_PARAMETERS t where t.PARAMETER = 'NLS_LENGTH_SEMANTICS';

Для aq $ _jms_text_message есть 2 варианта: либо вы указываете тип данных большого объекта в качестве входного параметра, либо ваше сообщение ›= 4000, и поэтому Oracle хранит его как clob. Аналогичная ситуация для aq $ _jms_bytes_message (полезная нагрузка В RAW, если длина bytes_lob = ‹32767 по сравнению с полезной нагрузкой в ​​BLOB)

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 ),
...
)

Кстати. есть также такие методы, как DBMS_AQADM.ENABLE_DB_ACCESS для Агентов, использующих протоколы HTTP и безопасные очереди, возможно, стоит проверить это

person Elzzz    schedule 07.12.2020
comment
Спасибо за ваш ответ. В самом деле, привилегия UPDATE отсутствовала для пользователя и кажется актуальной при вставке сообщения CLOB или LOB. - person Seldon; 07.12.2020