2026년 06월 21일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-00950 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-00950 invalid DROP option 는?
ORA-00950 에러는 Oracle에서 DROP 명령을 실행할 때 허용되지 않는 옵션이나 문법을 사용했을 때 발생합니다. Oracle의 DDL(Data Definition Language) 문법 체계에서 DROP 구문 뒤에 올 수 있는 옵션은 객체 유형마다 엄격하게 정의되어 있으며, 이를 벗어난 옵션을 사용하면 파서(Parser)가 즉시 에러를 반환합니다. 이 에러는 주로 오타, 잘못된 구문 순서, 또는 해당 Oracle 버전에서 지원하지 않는 옵션을 사용할 때 빈번하게 발생합니다.
주요 발생 원인
1. 잘못된 DROP 옵션 키워드 사용
DROP TABLE, DROP INDEX, DROP SEQUENCE 등 각 객체 유형에 따라 사용할 수 있는 후속 옵션이 명확하게 구분되어 있습니다. 예를 들어 DROP TABLE에서는 CASCADE CONSTRAINTS 또는 PURGE 옵션만 허용되는데, 이 외의 키워드를 사용하면 ORA-00950이 발생합니다. 아래는 잘못된 옵션으로 인한 에러 예시입니다.
-- 잘못된 예시: DROP TABLE에 허용되지 않는 옵션 사용
DROP TABLE employees RESTRICT;
-- ORA-00950: invalid DROP option 발생
-- 올바른 예시
DROP TABLE employees CASCADE CONSTRAINTS PURGE;
2. DROP 구문에서의 오타 또는 키워드 순서 오류
Oracle DDL 파서는 키워드 순서에 매우 민감합니다. CASCADE CONSTRAINTS와 PURGE를 역순으로 쓰거나, CONSTRAINT를 CONSTRAINTS로 잘못 쓰는 등의 사소한 오타도 ORA-00950을 유발할 수 있습니다. 특히 자동화 스크립트나 다른 RDBMS에서 마이그레이션된 SQL을 그대로 사용할 때 이러한 문제가 자주 발생합니다.
-- 잘못된 예시: 오타로 인한 에러
DROP TABLE orders CASCADE CONSTRAINT;
-- ORA-00950 발생 (CONSTRAINTS가 아닌 CONSTRAINT 사용)
-- 잘못된 예시: 키워드 순서 오류
DROP TABLE orders PURGE CASCADE CONSTRAINTS;
-- ORA-00950 발생 (PURGE는 맨 마지막에 위치해야 함)
-- 올바른 예시
DROP TABLE orders CASCADE CONSTRAINTS PURGE;
3. 버전 비호환 또는 지원되지 않는 구문 사용
Oracle 버전에 따라 특정 DROP 옵션이 지원되지 않을 수 있습니다. 예를 들어 PURGE 옵션은 Oracle 10g부터 도입된 Recycle Bin 기능과 연관된 옵션으로, 그 이전 버전에서는 사용할 수 없습니다. 또한 MySQL, PostgreSQL 등 다른 데이터베이스에서 사용하던 구문(예: DROP TABLE IF EXISTS)을 Oracle 구버전에서 그대로 사용하면 에러가 발생할 수 있습니다.
-- Oracle 11g 이하에서 IF EXISTS는 지원되지 않음 (Oracle 23c부터 지원)
DROP TABLE employees IF EXISTS;
-- ORA-00950 또는 ORA-00933 발생 (구버전)
-- Oracle 23c 이상에서 사용 가능한 올바른 예시
DROP TABLE IF EXISTS employees;
-- 구버전 Oracle에서의 안전한 처리 방식 (PL/SQL 활용)
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE employees';
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -942 THEN -- ORA-00942: table or view does not exist
RAISE;
END IF;
END;
/
해결 방법
원인 1 해결: 올바른 DROP 옵션 확인 및 적용
각 객체 유형별 허용 가능한 DROP 옵션을 정확히 숙지하고 사용해야 합니다. Oracle 공식 문서(Oracle SQL Language Reference)에서 해당 객체의 DROP 구문 BNF를 반드시 확인하세요.
-- DROP TABLE: 올바른 전체 구문
DROP TABLE schema_name.table_name CASCADE CONSTRAINTS PURGE;
-- DROP INDEX: 올바른 구문 (추가 옵션 없음)
DROP INDEX index_name;
-- DROP SEQUENCE: 올바른 구문
DROP SEQUENCE sequence_name;
-- DROP VIEW: 올바른 구문
DROP VIEW view_name;
-- DROP USER: 올바른 구문 (연결된 객체 포함 삭제 시)
DROP USER username CASCADE;
-- DROP TABLESPACE: 올바른 구문
DROP TABLESPACE tablespace_name
INCLUDING CONTENTS AND DATAFILES
CASCADE CONSTRAINTS;
원인 2 해결: 구문 검증 및 교정
실행 전 구문을 꼼꼼히 검토하거나, 아래와 같이 DBMS_SQL 패키지 또는 PL/SQL 블록을 활용하여 에러를 사전에 방지할 수 있습니다.
-- PL/SQL을 활용한 안전한 DROP 처리 (에러 핸들링 포함)
DECLARE
v_sql VARCHAR2(500);
BEGIN
v_sql := 'DROP TABLE employees CASCADE CONSTRAINTS PURGE';
EXECUTE IMMEDIATE v_sql;
DBMS_OUTPUT.PUT_LINE('테이블이 성공적으로 삭제되었습니다.');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('에러 발생: ' || SQLERRM);
DBMS_OUTPUT.PUT_LINE('에러 코드: ' || SQLCODE);
END;
/
원인 3 해결: 버전 호환성 확인 및 대안 구문 사용
현재 운영 중인 Oracle 버전을 확인하고, 해당 버전에서 지원하는 구문을 사용해야 합니다.
-- 현재 Oracle 버전 확인
SELECT * FROM V$VERSION;
SELECT BANNER FROM V$VERSION WHERE BANNER LIKE 'Oracle%';
-- 버전에 따른 안전한 객체 삭제 스크립트 (범용)
DECLARE
v_count NUMBER;
BEGIN
-- 테이블 존재 여부 확인 후 삭제
SELECT COUNT(*)
INTO v_count
FROM USER_TABLES
WHERE TABLE_NAME = 'EMPLOYEES';
IF v_count > 0 THEN
EXECUTE IMMEDIATE 'DROP TABLE EMPLOYEES CASCADE CONSTRAINTS PURGE';
DBMS_OUTPUT.PUT_LINE('EMPLOYEES 테이블 삭제 완료.');
ELSE
DBMS_OUTPUT.PUT_LINE('EMPLOYEES 테이블이 존재하지 않습니다.');
END IF;
END;
/
예방 방법
1. DDL 스크립트 실행 전 반드시 구문 검토 및 테스트 환경에서 사전 검증
모든 DROP 관련 DDL 스크립트는 운영 환경에 적용하기 전에 개발 또는 스테이징 환경에서 먼저 검증해야 합니다. Oracle SQL Developer, SQL*Plus의 SHOW ERRORS 명령, 또는 사내 코드 리뷰 프로세스를 통해 구문 오류를 사전에 걸러내는 습관을 갖는 것이 중요합니다. 또한 다른 RDBMS로부터 마이그레이션된 SQL 스크립트는 Oracle 전용 구문으로 반드시 변환 후 사용해야 합니다.
2. 공식 Oracle 문서 기반의 DDL 템플릿 표준화 및 팀 내 공유
팀 내에서 자주 사용하는 DROP 구문을 표준 템플릿으로 정의하고 공유하면 반복적인 실수를 방지할 수 있습니다. 특히 DROP TABLE, DROP USER, DROP TABLESPACE처럼 파급 효과가 큰 명령어는 체크리스트와 함께 표준화된 스크립트 형태로 관리하고, 실행 권한을 DBA로 제한하며 변경 이력을 반드시 기록해야 합니다.
관련 에러
- ORA-00942:
table or view does not exist— 존재하지 않는 객체를 DROP하려 할 때 발생하며, ORA-00950과 함께 DDL 실수에서 자주 동반됩니다. - ORA-00933:
SQL command not properly ended— DROP 구문의 끝이 올바르지 않을 때 발생하며, ORA-00950과 혼동될 수 있습니다. - ORA-01432:
public synonym to be dropped does not exist—DROP PUBLIC SYNONYM실행 시 해당 시노님이 없을 때 발생합니다. - ORA-02449:
unique/primary keys in table referenced by foreign keys—CASCADE CONSTRAINTS옵션 없이 외래키로 참조되는 테이블을 DROP할 때 발생합니다. 이 에러는 ORA-00950과 함께DROP TABLE사용 시 자주 마주치는 연관 에러입니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.