我是 Oracle 高级队列的新手。我有一个排队的过程,以及一个订阅和注册该队列中项目的回调过程。所有这些对象都是在用户模式中创建的。但是当项目出现在队列中时,回调过程会触发,但不是由模式的用户触发,而是由用户 SYS 触发。应该进行哪些设置以使 Oracle 执行回调过程不是由用户 SYS 而是由用户 - 创建回调过程的模式的所有者
我使用了这里的示例http://innerlife.io/ru/oracle-db-advanced-queuing-subscriber-2/
CREATE OR REPLACE TYPE tp_queue AS OBJECT (n NUMBER);
BEGIN
DBMS_AQADM.create_queue_table ('tq_test',
'tp_queue',
multiple_consumers => TRUE);
END;
BEGIN
DBMS_AQADM.create_queue ('q_test', 'tq_test');
END;
BEGIN
DBMS_AQADM.start_queue ('q_test');
END;
CREATE TABLE t_log
(
d_add TIMESTAMP DEFAULT SYSTIMESTAMP NOT NULL,
s_msg VARCHAR2 (4000)
);
CREATE OR REPLACE PACKAGE pkg_queue
IS
PROCEDURE addLog (pi_msg IN t_log.s_msg%TYPE);
PROCEDURE subscriber (context RAW,
reginfo SYS.AQ$_REG_INFO,
descr SYS.AQ$_DESCRIPTOR,
payload RAW,
payloadl NUMBER);
END pkg_queue;
CREATE OR REPLACE PACKAGE BODY pkg_queue
IS
PROCEDURE addLog (pi_msg IN t_log.s_msg%TYPE)
AS
BEGIN
INSERT INTO t_log (s_msg)
VALUES (pi_msg);
END;
PROCEDURE subscriber (context RAW,
reginfo SYS.AQ$_REG_INFO,
descr SYS.AQ$_DESCRIPTOR,
payload RAW,
payloadl NUMBER)
AS
l_tr_obj tp_queue;
l_msg_props DBMS_AQ.MESSAGE_PROPERTIES_T;
l_queue_opts DBMS_AQ.DEQUEUE_OPTIONS_T;
l_msg_id RAW (16);
BEGIN
l_queue_opts.consumer_name := descr.consumer_name;
l_queue_opts.msgid := descr.msg_id;
DBMS_AQ.dequeue (descr.queue_name,
l_queue_opts,
l_msg_props,
l_tr_obj,
l_msg_id);
addLog (USER);
EXCEPTION
WHEN OTHERS
THEN
addLog (SQLERRM);
END;
END pkg_queue;
BEGIN
DBMS_AQADM.add_subscriber ('q_test',
sys.AQ$_AGENT ('test_subscriber', NULL, NULL));
DBMS_AQ.register (sys.AQ$_REG_INFO_LIST (sys.AQ$_REG_INFO (
'q_test:test_subscriber',
DBMS_AQ.namespace_aq,
'plsql://pkg_queue.subscriber',
HEXTORAW ('FF'))),
1);
END;
DECLARE
l_msg_props DBMS_AQ.MESSAGE_PROPERTIES_T;
l_queue_opts DBMS_AQ.ENQUEUE_OPTIONS_T;
l_msg_id RAW (16);
BEGIN
DBMS_AQ.enqueue ('q_test',
l_queue_opts,
l_msg_props,
tp_queue (1),
l_msg_id);
COMMIT;
END;
来自 t_log 表的查询返回“SYS”。因此,回调过程由用户 SYS 触发。但我希望看到用户——创建这些对象的模式的所有者。它不是 SYS。如何做到这一点?