DEV Community

umzzil nng
umzzil nng

Posted on • Originally published at nngumzzil.mycafe24.com

ORA-00942 오류 원인과 해결 방법 완벽 가이드

ORA-00942: Table or View Does Not Exist 완벽 해결 가이드


ORA-00942란?

ORA-00942는 SQL 쿼리에서 참조한 테이블 또는 뷰가 현재 세션의 컨텍스트에서 존재하지 않거나 접근할 수 없을 때 발생하는 에러입니다. 단순히 테이블이 없는 경우뿐만 아니라, 테이블은 존재하지만 현재 접속한 사용자에게 해당 객체에 대한 권한이 없을 때도 동일한 에러가 발생한다는 점이 실무에서 혼란을 주는 주요 원인입니다. Oracle은 보안상의 이유로 권한이 없는 객체와 존재하지 않는 객체를 동일한 에러 코드로 처리하기 때문에, 정확한 원인 파악을 위한 추가적인 확인 작업이 필요합니다.


주요 발생 원인

  1. 테이블 또는 뷰가 실제로 존재하지 않는 경우
    해당 스키마에 테이블이 생성되지 않았거나, 이미 삭제(DROP)된 경우에 발생합니다. 특히 개발/운영 환경 간 스키마 동기화가 제대로 되지 않았을 때 자주 발생하며, 신규 배포 후 DDL 스크립트 누락이 원인인 경우가 많습니다.

  2. 다른 스키마의 객체에 대한 권한 미부여
    Oracle에서는 다른 스키마 소유의 테이블에 접근하려면 명시적으로 SELECT, INSERT, UPDATE, DELETE 등의 권한이 부여되어 있어야 합니다. 권한이 없으면 테이블이 존재하더라도 Oracle은 마치 존재하지 않는 것처럼 ORA-00942를 반환합니다.

  3. 스키마명(오너) 미지정 또는 오타
    SCOTT.EMP 처럼 스키마명을 명시해야 하는 상황에서 EMP만 사용하거나, 스키마명이나 테이블명에 오타가 있는 경우 발생합니다. 대소문자 문제도 원인이 될 수 있는데, 큰따옴표로 생성된 객체는 대소문자가 구별되므로 정확히 일치하지 않으면 에러가 발생합니다.

  4. Synonym(동의어)이 없거나 잘못 설정된 경우
    Public Synonym 또는 Private Synonym이 존재하지 않거나, Synonym이 가리키는 원본 객체가 삭제된 경우에 발생합니다. 특히 여러 애플리케이션이 Synonym을 통해 테이블에 접근하는 구조에서 원본 테이블이 변경되면 이 문제가 빈번히 발생합니다.

  5. Stored Procedure/Function 내 동적 권한 문제
    저장 프로시저나 함수 내에서 참조하는 테이블에 대해 직접 권한(Direct Privilege)이 아닌 롤(Role)을 통해 권한이 부여된 경우, 컴파일 또는 실행 시 ORA-00942가 발생할 수 있습니다. Oracle PL/SQL에서는 Role을 통해 부여된 권한은 기본적으로 Named Block(프로시저, 함수, 패키지)에서 인식되지 않습니다.


해결 방법

✅ 원인 1: 테이블 존재 여부 확인 및 재생성

먼저 해당 테이블이 어느 스키마에 존재하는지 확인합니다.

-- 현재 사용자 소유 테이블 확인
SELECT table_name, owner
FROM user_tables
WHERE table_name = 'EMP';  -- 대문자로 입력

-- DBA 권한이 있는 경우: 전체 스키마에서 확인
SELECT table_name, owner
FROM dba_tables
WHERE table_name = 'EMP';

-- 뷰 확인
SELECT view_name, owner
FROM dba_views
WHERE view_name = 'EMP_VIEW';

-- RECYCLE BIN에서 삭제된 테이블 확인 (Oracle 10g 이상)
SELECT object_name, original_name, droptime
FROM recyclebin
WHERE original_name = 'EMP';

-- RECYCLE BIN에서 복구
FLASHBACK TABLE emp TO BEFORE DROP;
Enter fullscreen mode Exit fullscreen mode

✅ 원인 2: 권한 부여 및 확인

-- 특정 사용자에게 테이블 권한 확인
SELECT grantee, owner, table_name, privilege
FROM dba_tab_privs
WHERE table_name = 'EMP'
  AND grantee = 'APP_USER';

-- 권한 부여 (DBA 또는 테이블 소유자가 실행)
GRANT SELECT ON scott.emp TO app_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON scott.emp TO app_user;

-- 모든 사용자에게 조회 권한 부여
GRANT SELECT ON scott.emp TO PUBLIC;

-- 롤을 통한 권한 부여
CREATE ROLE read_only_role;
GRANT SELECT ON scott.emp TO read_only_role;
GRANT read_only_role TO app_user;
Enter fullscreen mode Exit fullscreen mode

✅ 원인 3: 스키마명 명시 및 대소문자 확인

-- 스키마명을 명시하여 접근
SELECT * FROM scott.emp;

-- 현재 세션의 스키마 확인
SELECT sys_context('USERENV', 'CURRENT_SCHEMA') FROM dual;
SELECT user FROM dual;

-- 대소문자 구별로 생성된 객체 확인
-- 따옴표로 생성된 경우: CREATE TABLE "myTable" (...)
SELECT * FROM "myTable";  -- 반드시 따옴표 사용

-- 일반적인 방식으로 생성된 경우
CREATE TABLE MY_TABLE (id NUMBER);
SELECT * FROM my_table;  -- 대소문자 무관하게 접근 가능
SELECT * FROM MY_TABLE;  -- 동일하게 접근 가능
Enter fullscreen mode Exit fullscreen mode

✅ 원인 4: Synonym 생성 및 확인

-- 현재 접근 가능한 Synonym 확인
SELECT synonym_name, table_owner, table_name
FROM all_synonyms
WHERE synonym_name = 'EMP';

-- Private Synonym 생성
CREATE SYNONYM emp FOR scott.emp;

-- Public Synonym 생성 (DBA 권한 필요)
CREATE PUBLIC SYNONYM emp FOR scott.emp;

-- 깨진 Synonym 확인 및 재생성
SELECT *
FROM all_synonyms s
WHERE NOT EXISTS (
    SELECT 1
    FROM all_objects o
    WHERE o.owner = s.table_owner
      AND o.object_name = s.table_name
);

-- 잘못된 Synonym 삭제 후 재생성
DROP PUBLIC SYNONYM emp;
CREATE PUBLIC SYNONYM emp FOR scott.emp;
Enter fullscreen mode Exit fullscreen mode

✅ 원인 5: PL/SQL에서 롤 권한 문제 해결

-- 문제 상황: 롤을 통해 부여된 권한은 PL/SQL에서 동작 안 함
-- 해결: 직접 권한(Direct Privilege) 부여

-- 잘못된 방법 (Role을 통한 권한 부여 - PL/SQL 내부에서 동작 안 함)
GRANT read_only_role TO app_user;  -- Role로 부여

-- 올바른 방법 (Direct Privilege 부여)
GRANT SELECT ON scott.emp TO app_user;  -- 직접 부여

-- 또는 AUTHID CURRENT_USER를 사용하는 방법
CREATE OR REPLACE PROCEDURE get_emp_info
    AUTHID CURRENT_USER  -- 현재 사용자의 권한으로 실행
AS
BEGIN
    FOR rec IN (SELECT * FROM scott.emp) LOOP
        DBMS_OUTPUT.PUT_LINE(rec.ename);
    END LOOP;
END;
/

-- 권한 부여 후 프로시저 재컴파일
ALTER PROCEDURE get_emp_info COMPILE;
Enter fullscreen mode Exit fullscreen mode

예방 방법

1. 📋 정기적인 스키마 권한 감사(Audit) 수행

배포 전후에 필요한 권한이 올바르게 설정되어 있는지 검증하는 스크립트를 표준화하여 운영하세요. 특히 신규 테이블 추가 시 애플리케이션 계정에 대한 권한 부여를 배포 체크리스트에 포함시키면 누락을 방지할 수 있습니다.

-- 특정 사용자가 접근 가능한 모든 객체 목록 조회
SELECT owner, object_name, object_type, privilege
FROM (
    SELECT t.owner, t.table_name AS object_name, 'TABLE' AS object_type, p.privilege
    FROM dba_tables t
    JOIN dba_tab_privs p ON t.owner = p.owner AND t.table_name = p.table_name
    WHERE p.grantee = 'APP_USER'
    UNION ALL
    SELECT v.owner, v.view_name, 'VIEW', p.privilege
    FROM dba_views v
    JOIN dba_tab_privs p ON v.owner = p.owner AND v.view_name = p.table_name
    WHERE p.grantee = 'APP_USER'
)
ORDER BY owner, object_name;
Enter fullscreen mode Exit fullscreen mode

2. 🔄 개발/스테이징/운영 환경 스키마 동기화 자동화

환경 간 스키마 불일치는 ORA-00942의 매우 흔한 원인입니다. DDL 변경 사항을 형상관리(Git 등)로 관리하고, 마이그레이션 스크립트를 자동으로 적용하는 파이프라인을 구축하는 것이 좋습

Top comments (0)