[Oracle] ORA-00942: table or view does not exist 오류의 주요 원인 및 해결 방법

데이터베이스 관리 및 개발 과정에서 가장 빈번하게 마주치는 오류 중 하나는 ORA-00942: table or view does not exist 입니다. 이 오류 메시지는 직관적이지만, 실제로는 다양한 원인으로 인해 발생할 수 있어 초보자뿐만 아니라 숙련된 개발자도 당황하게 만들곤 합니다.

이번 포스팅에서는 ORA-00942 오류가 발생하는 주요 원인들을 체계적으로 분석하고, 각 상황에 맞는 명확한 해결 방법을 제시하겠습니다.


ORA-00942 오류의 핵심 원인.

ORA-00942 오류는 말 그대로 SQL 문장에서 참조한 테이블 또는 뷰를 찾을 수 없을 때 발생합니다. Oracle 데이터베이스가 해당 객체의 존재를 인지하지 못하는 상황이며, 주요 원인은 다음과 같이 분류할 수 있습니다.

  1. 객체 이름의 오타 (Typo)
  2. 스키마(Schema) 미지정
  3. 권한 부족 (Privilege)
  4. 시노님(Synonym) 문제

주요 원인별 상세 분석 및 해결 방안

1. 테이블 또는 뷰 이름의 오타 💡

가장 흔하면서도 간단한 원인입니다. SQL 쿼리 내에서 테이블이나 뷰의 이름을 잘못 입력한 경우입니다.

  • 원인 분석:
    • 단순 오탈자 (예: EMPLOYEES -> EMPLOYEE)
    • 복수형/단수형 혼동
    • 언더스코어(_) 누락 또는 추가
  • 해결 방안:
    1. 쿼리 검토: 실행하려는 SQL 쿼리의 FROM 절 또는 JOIN 절에 사용된 테이블/뷰 이름을 다시 한번 꼼꼼히 확인합니다.
    2. 데이터 딕셔너리 조회: 아래 쿼리를 사용하여 현재 접속한 유저가 소유하거나 접근 가능한 테이블/뷰의 정확한 이름을 확인할 수 있습니다.
-- 현재 스키마가 소유한 테이블 목록 확인. 
SELECT table_name FROM user_tables;

-- 현재 스키마가 접근 가능한 모든 테이블 목록 확인 (권한 포함)
SELECT owner, table_name FROM all_tables WHERE table_name = '찾으려는_테이블명';

2. 다른 스키마(사용자) 소유의 객체에 접근 👤

작업하려는 테이블이 현재 접속한 스키마(사용자)가 아닌 다른 스키마의 소유일 경우, 스키마 이름을 명시하지 않으면 오류가 발생합니다.

  • 원인 분석: SCOTT 유저가 HR 유저 소유의 EMPLOYEES 테이블을 조회하려 할 때, SELECT * FROM EMPLOYEES; 와 같이 스키마 없이 쿼리를 실행하는 경우입니다.
  • 해결 방안:
    • 스키마 이름 명시: 테이블 이름 앞에 스키마명. 을 붙여서 객체의 소유자를 명확히 지정합니다.
-- 잘못된 쿼리 (현재 스키마에 EMPLOYEES가 없을 경우)
SELECT * FROM EMPLOYEES;

-- 올바른 쿼리 (HR 스키마 소유의 EMPLOYEES 테이블 조회)
SELECT * FROM HR.EMPLOYEES;

3. 권한 부족 🔑

객체가 존재하고 이름도 정확하지만, 현재 접속한 유저가 해당 객체에 접근할 수 있는 권한(주로 SELECT)이 없는 경우 ORA-00942 오류가 발생합니다. 보안상의 이유로 Oracle은 “권한이 부족합니다”라는 메시지 대신 “객체가 존재하지 않습니다”라는 메시지를 반환하는 경우가 많습니다.

  • 원인 분석: SCOTT 유저가 HR.EMPLOYEES 테이블을 조회하려고 할 때, HR 유저가 SCOTT 유저에게 SELECT 권한을 부여하지 않았습니다.
  • 해결 방안:
    • DBA에게 권한 요청: 테이블 소유자나 DBA(데이터베이스 관리자)에게 해당 객체에 대한 적절한 권한을 요청해야 합니다.
-- HR 유저가 SCOTT 유저에게 EMPLOYEES 테이블의 SELECT 권한을 부여하는 구문
GRANT SELECT ON EMPLOYEES TO SCOTT;

4. 시노님(Synonym) 문제 🔗

시노님(Synonym, 동의어)은 다른 객체를 가리키는 별칭입니다. 시노님을 사용하면 스키마 이름을 생략하고 객체에 접근할 수 있어 편리하지만, 이 시노님이 잘못 설정된 경우 ORA-00942 오류의 원인이 될 수 있습니다.

  • 원인 분석:
    • PUBLIC 시노님이 아닌 PRIVATE 시노님을 다른 유저가 사용하려 할 때
    • 시노님이 가리키는 원본 객체가 삭제되었을 때
    • 시노님 이름 자체에 오타가 있을 때
  • 해결 방안:
    • 시노님 정보 확인: USER_SYNONYMS 또는 ALL_SYNONYMS 딕셔너리 뷰를 조회하여 시노님의 정의가 올바른지, 원본 객체가 무엇인지 확인합니다.
SELECT * FROM ALL_SYNONYMS WHERE SYNONYM_NAME = '사용된_시노님명';
  • 올바른 시노님 생성 또는 수정: 문제가 확인되면 DBA 또는 객체 소유자에게 올바른 시노님을 생성하거나, PUBLIC 시노님으로 만들어 달라고 요청해야 합니다.

요약 및 정리 (Troubleshooting Checklist)

ORA-00942 오류를 만났을 때, 아래의 순서대로 차근차근 점검해 보시기 바랍니다.

  1. [1순위] 이름 확인: 내가 작성한 SQL의 테이블/뷰 이름에 오타가 없는지 가장 먼저 확인합니다.
  2. [2순위] 스키마 확인: 해당 객체가 다른 사용자 소유라면 스키마명.객체명 형식으로 작성했는지 확인합니다.
  3. [3순위] 권한 확인: 이름과 스키마가 정확하다면, 현재 접속한 유저가 해당 객체에 접근할 SELECT 또는 기타 권한을 부여받았는지 DBA에게 문의합니다.
  4. [4순위] 시노님 확인: 쿼리에서 시노님을 사용했다면, 해당 시노님이 유효한지 데이터 딕셔너리를 통해 점검합니다.