1

我是 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。如何做到这一点?

4

0 回答 0