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

ORA-02289
2026년 08월 16일 | DBMS Error 가이드

이 글에서 다루는 내용

ORA-02289 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.

ORA-02289 sequence does not exist 는?

ORA-02289 에러는 Oracle 데이터베이스에서 존재하지 않는 시퀀스(Sequence)를 참조하거나 사용하려 할 때 발생하는 오류입니다. 예를 들어 NEXTVAL 또는 CURRVAL을 호출하거나, DROP SEQUENCE, ALTER SEQUENCE 같은 DDL 구문을 실행할 때 해당 시퀀스가 데이터베이스에 없으면 이 에러가 발생합니다. 특히 개발 환경과 운영 환경 간의 오브젝트 동기화가 맞지 않거나, 스키마(Schema)를 명시하지 않아 잘못된 스키마에서 시퀀스를 찾는 경우에도 자주 나타납니다.


주요 발생 원인

1. 시퀀스 자체가 생성되지 않았거나 삭제된 경우

가장 흔한 원인으로, 애플리케이션 코드나 스크립트에서 특정 시퀀스를 참조하고 있지만 실제로 해당 시퀀스가 데이터베이스에 존재하지 않는 경우입니다. 개발팀이 DDL 배포를 누락하거나, 다른 DBA가 시퀀스를 실수로 삭제(DROP)한 경우에도 동일한 에러가 발생합니다. 특히 여러 환경(개발, 스테이징, 운영)을 운영할 때 오브젝트 동기화가 누락되면 이 문제가 자주 발생합니다.

2. 스키마(Schema) 또는 시노님(Synonym) 미지정으로 인한 접근 오류

Oracle은 오브젝트를 참조할 때 현재 세션의 스키마를 기준으로 탐색합니다. 만약 시퀀스가 SCOTT 스키마에 있는데 현재 접속 계정이 APP_USER라면, 스키마를 명시하지 않거나 PUBLIC SYNONYM이 없는 경우 ORA-02289가 발생합니다. 이는 특히 여러 스키마를 사용하는 대형 시스템에서 자주 발생하는 실수입니다.

3. 대소문자 또는 오탈자로 인한 오브젝트 이름 불일치

Oracle에서 큰따옴표(")를 사용하여 시퀀스를 생성하면 대소문자가 구분됩니다. 예를 들어 CREATE SEQUENCE "mySeq"로 생성한 경우, mySeq.NEXTVAL이 아닌 "mySeq".NEXTVAL로 호출해야 합니다. 그냥 MYSEQ.NEXTVAL로 호출하면 ORA-02289 에러가 발생합니다. 또한 단순한 오탈자(예: ORDER_SQ 대신 ORDER_SEQ 사용)도 이 에러를 유발합니다.


해결 방법

원인 1: 시퀀스 존재 여부 확인 및 재생성

먼저 현재 스키마 또는 전체 DB에서 시퀀스가 존재하는지 확인합니다.

-- 현재 사용자 스키마에서 시퀀스 확인
SELECT SEQUENCE_NAME, MIN_VALUE, MAX_VALUE, INCREMENT_BY, LAST_NUMBER
FROM USER_SEQUENCES
WHERE SEQUENCE_NAME = 'ORDER_SEQ';

-- 전체 DB에서 시퀀스 확인 (DBA 권한 필요)
SELECT SEQUENCE_OWNER, SEQUENCE_NAME, LAST_NUMBER
FROM DBA_SEQUENCES
WHERE SEQUENCE_NAME = 'ORDER_SEQ';

-- 시퀀스가 없다면 재생성
CREATE SEQUENCE ORDER_SEQ
    START WITH 1
    INCREMENT BY 1
    MINVALUE 1
    MAXVALUE 9999999999
    NOCYCLE
    NOCACHE;

시퀀스를 재생성할 때, 기존 테이블의 최대 ID 값을 기준으로 START WITH 값을 설정해야 중복 키 오류를 방지할 수 있습니다.

-- 기존 테이블의 최대값 기준으로 시퀀스 재생성
DECLARE
    v_max_id NUMBER;
BEGIN
    SELECT NVL(MAX(ORDER_ID), 0) + 1 INTO v_max_id FROM ORDERS;
    EXECUTE IMMEDIATE 'CREATE SEQUENCE ORDER_SEQ START WITH ' || v_max_id ||
                      ' INCREMENT BY 1 NOCYCLE NOCACHE';
    DBMS_OUTPUT.PUT_LINE('ORDER_SEQ created with START WITH = ' || v_max_id);
END;
/

원인 2: 스키마 명시 또는 시노님 생성

다른 스키마의 시퀀스를 사용해야 한다면 스키마를 명시하거나, 시노님을 생성하여 해결합니다.

-- 방법 1: 스키마를 직접 명시하여 호출
SELECT SCOTT.ORDER_SEQ.NEXTVAL FROM DUAL;

-- 방법 2: 현재 사용자에게 시퀀스 사용 권한 부여 (DBA 또는 소유자 실행)
GRANT SELECT ON SCOTT.ORDER_SEQ TO APP_USER;

-- 방법 3: Private SYNONYM 생성 (APP_USER 입장에서 편리하게 사용)
CREATE SYNONYM ORDER_SEQ FOR SCOTT.ORDER_SEQ;

-- 방법 4: PUBLIC SYNONYM 생성 (전체 DB 사용자가 접근 가능, DBA 권한 필요)
CREATE PUBLIC SYNONYM ORDER_SEQ FOR SCOTT.ORDER_SEQ;

-- 시노님 생성 후 정상 동작 확인
SELECT ORDER_SEQ.NEXTVAL FROM DUAL;

원인 3: 오브젝트 이름 검증 및 수정

대소문자 구분 시퀀스 또는 오탈자를 확인합니다.

-- 대소문자 구분 시퀀스 확인 (ALL_OBJECTS 활용)
SELECT OBJECT_NAME, OBJECT_TYPE, STATUS
FROM ALL_OBJECTS
WHERE OBJECT_TYPE = 'SEQUENCE'
  AND UPPER(OBJECT_NAME) LIKE '%ORDER%';

-- 대소문자 구분 시퀀스 호출 방법
-- 잘못된 방법 (ORA-02289 발생)
SELECT mySeq.NEXTVAL FROM DUAL;  -- 큰따옴표 없이 호출 시 에러

-- 올바른 방법 (큰따옴표로 대소문자 구분 명시)
SELECT "mySeq".NEXTVAL FROM DUAL;

-- 가급적 대소문자 구분 없는 이름으로 재생성 권장
DROP SEQUENCE "mySeq";
CREATE SEQUENCE MYSEQ START WITH 1 INCREMENT BY 1;

예방 방법

1. 배포 전 오브젝트 체크리스트 및 검증 스크립트 운영

운영 환경 배포 전, 참조하는 모든 시퀀스가 실제로 존재하는지 자동으로 검증하는 스크립트를 CI/CD 파이프라인에 포함시키는 것을 강력히 권장합니다. 아래와 같은 검증 쿼리를 배포 전 체크리스트로 활용하면 누락된 시퀀스를 사전에 발견할 수 있습니다.

-- 필수 시퀀스 존재 여부 일괄 검증 스크립트
SELECT 'ORDER_SEQ' AS REQUIRED_SEQ, COUNT(*) AS EXISTS_YN FROM USER_SEQUENCES WHERE SEQUENCE_NAME = 'ORDER_SEQ'
UNION ALL
SELECT 'CUSTOMER_SEQ', COUNT(*) FROM USER_SEQUENCES WHERE SEQUENCE_NAME = 'CUSTOMER_SEQ'
UNION ALL
SELECT 'PRODUCT_SEQ', COUNT(*) FROM USER_SEQUENCES WHERE SEQUENCE_NAME = 'PRODUCT_SEQ';
-- EXISTS_YN 값이 0이면 해당 시퀀스 생성 필요

2. 시퀀스 명명 규칙(Naming Convention) 표준화 및 문서화

팀 내에서 시퀀스 이름을 테이블명_SEQ 형태로 통일하고, 절대 큰따옴표를 사용한 대소문자 구분 이름을 피하는 것이 Best Practice입니다. 모든 시퀀스의 DDL 스크립트를 형상 관리 도구(Git 등)에 등록하여, 언제든지 환경 재구성이 가능하도록 유지 관리해야 합니다.


관련 에러

  • ORA-02287: sequence number not allowed here — 시퀀스를 사용할 수 없는 위치(예: WHERE 절, GROUP BY 절)에서 호출할 때 발생합니다.
  • ORA-08004: sequence NEXTVAL exceeds MAXVALUE and cannot be instantiated — 시퀀스의 최대값에 도달했을 때 발생하며, NOCYCLE 옵션 시퀀스에서 자주 나타납니다.
  • ORA-01086: savepoint never established — 트랜잭션 관련 에러로, 시퀀스 관련 작업 중 롤백 시도 시 함께 나타날 수 있습니다.
  • ORA-00942: table or view does not exist — ORA-02289와 유사한 패턴으로, 오브젝트 미존재 또는 권한 부족 시 발생합니다. 시퀀스 대신 테이블/뷰가 없을 때 발생하는 에러입니다.

DBMS 에러 코드 시리즈

주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.

본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.

댓글 남기기