2017-12-06 12 views
0

... 작업으로 인해 패키지에 쓴 SQL 스크립트를 래핑해야합니다.Oracle 패키지 본문 컴파일 오류 : SQL 문 무시되거나 테이블 또는 뷰가 존재하지 않습니다.

정말 PL/SQL에서 분실, 내가 잘못 아무 생각 안하는거야 무슨 :

END LOG_ARCHIVE; 
    END F_LOG_ARCHIVE_PKG; 

오류가 반환

CREATE OR REPLACE PACKAGE F_LOG_ARCHIVE_PKG AS 
     PROCEDURE LOG_ARCHIVE; 
    END F_LOG_ARCHIVE_PKG; 

    /************************ F_BUSINESS_IDENTIFIER ********************************/ 
    /
    CREATE OR REPLACE PACKAGE BODY F_LOG_ARCHIVE_PKG AS 
    PROCEDURE LOG_ARCHIVE IS 
    BEGIN 
     INSERT INTO LOGARC.F_BUSINESS_IDENTIFIER ("ID", 
      "SERVICE_ID", 
      "OPERATION_ID", 
      "BUSINESS_IDENTIFIER_NAME", 
      "BUSINESS_IDENTIFIER_VALUE", 
      "EXCEPTION_ROW_ID", 
      "ARCHIVE_DATE") 
     SELECT DISTINCT ORIGINAL."ID", 
      ORIGINAL.SERVICE_ID, 
      ORIGINAL.OPERATION_ID, 
      ORIGINAL.BUSINESS_IDENTIFIER_NAME, 
      ORIGINAL.BUSINESS_IDENTIFIER_VALUE, 
      ORIGINAL.EXCEPTION_ROW_ID, 
      sysdate 
     FROM LOGUSR.F_BUSINESS_IDENTIFIER ORIGINAL 
     --Latest exception date based on service id and operation id 
     INNER JOIN (SELECT F_EXCEPTION.SERVICE_ID, 
        F_SERVICE_OPERATION_NAME.ID AS OPERATION_ID, 
        MAX(RECORD_CREATED_DATE) AS RECORD_CREATED_DATE, 
        MAX(EXCEPTION_DATE) AS EXCEPTION_DATE 
        FROM LOGUSR.F_EXCEPTION 
        INNER JOIN LOGUSR.F_SERVICE_OPERATION_NAME 
        ON F_EXCEPTION.OPERATION_NAME = F_SERVICE_OPERATION_NAME.OPERATION_NAME 
        GROUP BY F_EXCEPTION.SERVICE_ID,F_SERVICE_OPERATION_NAME.ID) EXCEPTION_DATE 
      ON ORIGINAL.SERVICE_ID = EXCEPTION_DATE.SERVICE_ID 
      AND ORIGINAL.OPERATION_ID = EXCEPTION_DATE.OPERATION_ID 
     --Service name to join to F_SERVICE_LOGSTATUS table 
     INNER JOIN LOGUSR.F_SERVICE_NAME 
      ON ORIGINAL.SERVICE_ID = F_SERVICE_NAME.ID 
     --Operation name to join to F_SERVICE_LOGSTATUS table 
     INNER JOIN LOGUSR.F_SERVICE_OPERATION_NAME 
      ON ORIGINAL.OPERATION_ID = F_SERVICE_OPERATION_NAME.ID 
     --Archive strategy 
     INNER JOIN LOGUSR.F_SERVICE_LOGSTATUS 
      ON F_SERVICE_NAME.SERVICE_NAME = F_SERVICE_LOGSTATUS.SERVICE_NAME 
      AND F_SERVICE_OPERATION_NAME.OPERATION_NAME = F_SERVICE_LOGSTATUS.OPERATION_NAME 
     WHERE F_SERVICE_LOGSTATUS.ARCHIVE_FLAG = 'Y' 
     AND F_SERVICE_LOGSTATUS.ARCHIVE_DAYS <= (sysdate-EXCEPTION_DATE.EXCEPTION_DATE); 

SNIP :

오류 (4, PL/SQL : ORA-00942 : 테이블 또는 뷰가 존재하지 않습니다.

DBA는 사용자에게 두 스키마 모두에 대한 쓰기 권한을 부여하기 위해 최근에 역할로 업데이트했습니다.

+1

패키지 소유자가 LOGUSR과 다른가요? 그렇다면 패키지 소유자가 LOGUSR의 테이블에 대한 권한을 ** 역할 **을 통해 ** 직접 부여 할 수 있습니까? 그렇지 않은 경우 문제 일 수 있습니다. – mathguy

+0

감사합니다. mathguy 님, 문제가있는 것 같습니다. –

답변

0

패키지는 LOGUSR 및 LOGARC라는 두 스키마의 테이블을 참조합니다. 패키지를 만들 때 우리 스키마 (패키지 소유자)의 객체와 에 직접 부여 된 권한이 인 다른 스키마의 객체 만 참조 할 수 있습니다. 역할을 통해 부여 된 권한은 이것에 적합하지 않습니다 (Oracle 보안 모델 때문에).

당신이 말하는,

"최근 역할에 업데이트 된 DBA는 모두 스키마에 대한 사용자의 쓰기 액세스 권한을 부여합니다."

따라서 패키지를 소유하고있는 스키마에 따라 DBA에게 다른 스키마의 객체에 대한 권한을 부여 할 것을 요청해야합니다.