2017-01-02 2 views
0

이 문제점에서 설명한 것과 동일한 문제가 있습니다 : Grant permission to queues to another schema in oracle.Oracle Advanced Queue가 존재하지 않습니다 다른 스키마

그러나 다른 사용자에게 주어진 권한은 전혀 작동하지 않습니다.

내 큐 :

DBMS_AQADM.create_queue_table (
     queue_table   => 'event_queue_tab', 
     queue_payload_type => 't_event_queue_payload', 
     multiple_consumers => TRUE, 
     comment    => 'Queue Table For Event Messages', 
     secure => false); 

    -- Create the event queue. 
    DBMS_AQADM.create_queue (queue_name => 'event_queue', 
          queue_table => 'event_queue_tab'); 

    -- Start the event queue. 
    DBMS_AQADM.start_queue (queue_name => 'event_queue'); 

스키마 USER1를 사용하여 생성으로이 큐.

PROCEDURE proc1 
    IS 
     PRAGMA AUTONOMOUS_TRANSACTION; 
     l_enqueue_options  DBMS_AQ.ENQUEUE_OPTIONS_T; 
     l_message_properties DBMS_AQ.MESSAGE_PROPERTIES_T; 
     l_message_handle  RAW (16); 
     l_queue_msg   t_event_queue_payload; 
    BEGIN 
     l_queue_msg := t_event_queue_payload ('give_me_a_prod'); 

     DBMS_AQ.enqueue (queue_name   => 'event_queue', 
         enqueue_options  => l_enqueue_options, 
         message_properties => l_message_properties, 
         payload    => l_queue_msg, 
         msgid    => l_message_handle); 
     COMMIT; 
    EXCEPTION 
     WHEN OTHERS 
     THEN 
     DBMS_OUTPUT.put_line (
      SQLERRM || ' - ' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE); 
    END proc1; 

내가 특정 역할 (ROLE1)에 의해 pkg1을 실행할 수있는 권한이 두 번째 스키마 USER2가이 스키마에서, 나는 그것을 호출 절차, 그 대기열과 패키지 pkg1 있습니다. 정말 시작 해요

BEGIN 
    DBMS_AQADM.grant_queue_privilege (privilege  => 'ALL', 
            queue_name  => 'USER1.event_queue', 
            grantee  => 'USER2', 
            grant_option => TRUE); 
END; 

방법 Ad.Queues의 작품을 이해하기 : 나는 USER1에 있지만 성공하지 않고이 권한 명령을 실행 한

ORA-24010: QUEUE USER2.EVENT_QUEUE does not exist - ORA-06512: at "SYS.DBMS_AQ", line 180 
ORA-06512: at "USER1.PKG1", line 1808 

: 그는 PROC1를 호출 할 때, 다음 오류가 발생 . 내가 여기서 뭔가를 놓치고 있니? 감사.

EDIT1 :이 큐에 대한 권한 부여 부여 후 :

SELECT grantee, 
     owner, 
     name, 
     grantor, 
     enqueue_privilege, 
     dequeue_privilege 
    FROM queue_privileges 
WHERE name = upper('event_queue'); 

ROLE1 USER1 EVENT_QUEUE USER1 1 1 
USER2 USER1 EVENT_QUEUE USER1 1 1 

답변

1

그냥 추측, 그것은 동의어와 함께 할 수있는 뭔가가 무엇입니까? 오류 메시지에 USER2.QUEUE가 존재하지 않기 때.입니다. 내부적으로 자신의 스키마에서 그것을 찾으려고 시도하기 때문에 아마도 User1 대기열을 만질 수 없습니까? user1.event_queue처럼 프로 시저에서 대기열 이름을 지정해보십시오.

내 말입니다 :

PROCEDURE proc1 
    IS 
     PRAGMA AUTONOMOUS_TRANSACTION; 
     l_enqueue_options  DBMS_AQ.ENQUEUE_OPTIONS_T; 
     l_message_properties DBMS_AQ.MESSAGE_PROPERTIES_T; 
     l_message_handle  RAW (16); 
     l_queue_msg   t_event_queue_payload; 
    BEGIN 
     l_queue_msg := t_event_queue_payload ('give_me_a_prod'); 

     DBMS_AQ.enqueue (queue_name   => 'user1.event_queue', 
         enqueue_options  => l_enqueue_options, 
         message_properties => l_message_properties, 
         payload    => l_queue_msg, 
         msgid    => l_message_handle); 
     COMMIT; 
    EXCEPTION 
     WHEN OTHERS 
     THEN 
     DBMS_OUTPUT.put_line (
      SQLERRM || ' - ' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE); 
END proc1; 

가 왜 그렇게 말? 권한을 부여 할 때 event_queue 전에 명시 적으로 USER1 스키마를 언급하고 그 프로 시저가 작동하기 때문입니다. 그러나 대기열에 넣기 절차를 사용할 때도 마찬가지입니다.

+0

정말요? 그저 단순한가? :) 고마워, 정말 문제를 해결. 나 앞에서 해결책이있는 문제가 너무 많은 시간입니다. 감사. – milheiros

+0

문제 없습니다. 도와 줄 수있어서 기뻐. –