Мы предоставляем следующие привилегии на схеме 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, проблема не возникает.
- Как мы можем предоставить необходимые привилегии пользователю B?
- Когда Oracle решает использовать (C) LOB?