문제

별도의 응용 프로그램에서 호출하려는 저장 절차가 포함 된 패키지를 만들었습니다. 저장된 절차는 스키마의 모든 뷰와 테이블의 정렬 된 목록을 반환합니다. 이를 위해 다음과 같이 DBA_Tables 및 DBA_Views 동의어에 대해 간단한 선택을 수행합니다.

CREATE OR REPLACE
PACKAGE BODY TITAN_ENTITY AS

  PROCEDURE GETSCHEMAOBJECTS (RESULTS IN OUT T_CURSOR)
  IS
    V_CURSOR T_CURSOR;
  BEGIN
    OPEN V_CURSOR FOR
       SELECT 'T' OBJECTTYPE, TABLE_NAME OBJECTNAME 
          FROM DBA_TABLES 
          WHERE OWNER = 'SONAR5'
       UNION ALL
       SELECT 'V' OBJECTTYPE, VIEW_NAME OBJECTNAME 
         FROM DBA_VIEWS 
         WHERE OWNER = 'SONAR5'
       ORDER BY OBJECTNAME;
    RESULTS := V_CURSOR;      

  END GETSCHEMAOBJECTS;

END TITAN_ENTITY;

문제의 동의어가 존재한다는 것을 확인했으며 공개적입니다.

CREATE PUBLIC SYNONYM "DBA_TABLES" FOR "SYS"."DBA_TABLES"
CREATE PUBLIC SYNONYM "DBA_VIEWS" FOR "SYS"."DBA_VIEWS"

내 이해는 그들이 공개적이기 때문에 그들에게 도달하기 위해 더 이상의 권한이 필요하지 않다는 것입니다. 그 이해가 틀렸다면 누군가가 그 개념에 대해 나를 대체하고 더 정확한 데이터를 지적하기를 바랍니다.

이제 내 문제가 있습니다. Oracle SQL Developer에서 워크 시트를 열고이 테이블 중에서 잘 선택할 수 있습니다. 나는 의미있는 데이터를 잘 얻습니다 (실제로 567 줄). 그러나 저장된 절차를 실행하려고 할 때 Oracle은 다음과 같이 컴파일 오류에 대해 불평합니다.

Error(9,8): PL/SQL: SQL Statement ignored
Error(10,16): PL/SQL: ORA-00942: table or view does not exist

두 번째 오류 메시지를 두 번 클릭하면 SQL Developer가 첫 번째 절 ( "DBA_Tables")으로 데려갑니다.

그래서 나는 상당히 혼란스러워합니다. 나는 SQL Server를 잘 알고 있으며 Oracle을 처음 사용하므로 저와 함께 해주세요. 단서를 제공하거나 올바른 방향으로 나를 가리킬 수 있다면 정말 감사합니다.

미리 감사드립니다!

도움이 되었습니까?

해결책

dba_tables 및 dba_views 대신 all_tables 및 all_views를 사용하십시오. All_% 뷰는 모든 사용자가 액세스 할 수 있어야합니다.

다른 팁

저장된 PL/SQL- 절개 또는 저장된 PL/SQL 기능의 테이블 또는보기에서 선택한 경우 직접 보조금이 필요합니다. 데이터베이스 역할을 통한 보조금으로는 충분하지 않습니다.

View DBA_Tables에 직접 보조금이 필요할 것입니다. (공개) 동의어는 단지 (공개) 동의어입니다. 직접 선정 된 권한이 필요합니다.

여기를 봐: http://asktom.oracle.com/pls/asktom/f?p=100:11:0:::p11_Question_id:48704116042682#48798240264807

편집하다: 죄송합니다, 나는 당신이 dba_tables를 직접 선택할 수 있다고 말하는 부분에 대해 글로스를했습니다. 아마도 문제는 다른 사람이 대답 한 역할을 통해 귀하의 특권이 부여된다는 것입니다. 그러나 공개 동의어에 대한 귀하의 이해가 불완전하고 필요한 것을 달성하면 All_tables를 사용하는 것이 더 나을 것이라고 설명 할 가치가 있습니다.

동의어 공개는 모든 사용자가 동의어를 참조 할 수 있음을 의미합니다. 동의어가 지칭하는 대상에 대한 액세스 권한을 부여하지 않습니다.

이 오류를 가장 직접 해결하기 위해 수행하는 것은이 절차를 실행하는 사용자에게 SYS보기에서 Grant Select 권한입니다. 그러나 나는 그것이 a라고 생각합니다 아주 나쁜 생각.

Raimonds가 제안한 것처럼 user_tables 또는 all_tables에서 필요한 것을 얻을 수 있는지 고려하십시오. 이 절차를 호출하는 사용자는 어떤 사용자이며, 해당 사용자는 Sonar5의 테이블에 어떤 액세스가 필요합니까?

일반적으로 응용 프로그램이 테이블에 관심이있는 경우 아마도 일부 권한이 있으며,이 경우 All_tables에 나열되어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top