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

ORA-02266
2026년 08월 15일 | DBMS Error 가이드

이 글에서 다루는 내용

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

ORA-02266 unique/primary keys in table referenced by enabled foreign keys 는?

ORA-02266 에러는 외래 키(Foreign Key) 제약 조건이 활성화된 상태에서 참조되고 있는 부모 테이블의 기본 키(Primary Key) 또는 유니크 키(Unique Key)를 포함하는 테이블을 삭제하거나 변경하려 할 때 발생합니다. 쉽게 말해, 다른 테이블이 현재 테이블의 키 컬럼을 참조하고 있기 때문에 Oracle이 데이터 무결성을 보호하기 위해 해당 작업을 거부하는 것입니다. 주로 DROP TABLE, TRUNCATE TABLE, ALTER TABLE ... DISABLE CONSTRAINT 등의 DDL 작업 수행 시 자주 마주치는 에러입니다.


주요 발생 원인

1. TRUNCATE TABLE 실행 시 자식 테이블의 FK 제약 조건이 활성화되어 있는 경우

가장 흔한 발생 원인입니다. 부모 테이블의 데이터를 전부 삭제하기 위해 TRUNCATE TABLE을 실행할 때, 해당 테이블의 기본 키를 참조하는 자식 테이블에 활성화된 외래 키 제약 조건이 존재하면 Oracle은 작업을 차단합니다. DELETE와 달리 TRUNCATE는 롤백이 불가능한 DDL 문이기 때문에 Oracle은 더욱 엄격하게 참조 무결성을 검사합니다.

2. DROP TABLE 실행 시 참조 관계가 존재하는 경우

부모 테이블을 삭제하려 할 때, 해당 테이블의 PK 또는 Unique Key를 참조하는 자식 테이블의 FK 제약 조건이 여전히 활성화되어 있으면 DROP TABLE 명령이 실패합니다. 데이터베이스 재구성, 마이그레이션, 또는 개발 환경에서 테이블을 재생성해야 할 때 자주 발생하며, 참조 관계를 사전에 파악하지 않으면 예상치 못한 에러로 이어집니다.

3. ALTER TABLE로 PK 또는 Unique 제약 조건을 비활성화하거나 삭제하려는 경우

부모 테이블의 기본 키나 유니크 제약 조건을 DISABLE 또는 DROP 하려 할 때, 이 키를 참조하는 자식 테이블의 FK 제약 조건이 활성화되어 있으면 에러가 발생합니다. 이 경우 단순히 부모 테이블의 제약 조건만 조작하는 것이 아니라 자식 테이블의 FK까지 함께 관리해야 합니다.


해결 방법

해결책 1: TRUNCATE TABLE 전 자식 테이블의 FK 비활성화 후 재활성화

가장 안전하고 권장되는 방법으로, FK 제약 조건을 일시적으로 비활성화한 뒤 작업을 수행하고 다시 활성화합니다.

-- Step 1: 자식 테이블의 FK 제약 조건 확인
SELECT a.constraint_name,
       a.table_name,
       a.r_constraint_name,
       a.status
  FROM user_constraints a
 WHERE a.constraint_type = 'R'
   AND a.r_constraint_name IN (
         SELECT constraint_name
           FROM user_constraints
          WHERE table_name = 'PARENT_TABLE'
            AND constraint_type IN ('P', 'U')
       );

-- Step 2: 자식 테이블의 FK 비활성화
ALTER TABLE child_table DISABLE CONSTRAINT fk_child_parent;

-- Step 3: 부모 테이블 TRUNCATE
TRUNCATE TABLE parent_table;

-- Step 4: 자식 테이블의 FK 재활성화
ALTER TABLE child_table ENABLE CONSTRAINT fk_child_parent;

해결책 2: DROP TABLE 시 CASCADE CONSTRAINTS 옵션 사용

부모 테이블을 삭제할 때 CASCADE CONSTRAINTS 옵션을 사용하면, Oracle이 자동으로 참조하는 FK 제약 조건도 함께 삭제합니다. 단, 자식 테이블 자체는 삭제되지 않으며 FK 제약 조건만 제거된다는 점을 명심하세요.

-- CASCADE CONSTRAINTS 사용: 참조하는 FK 제약도 자동 삭제
DROP TABLE parent_table CASCADE CONSTRAINTS;

-- 삭제 전 참조 관계 확인 (권장)
SELECT c.table_name        AS child_table,
       c.constraint_name   AS fk_name,
       p.table_name        AS parent_table,
       p.constraint_name   AS pk_name
  FROM user_constraints c
  JOIN user_constraints p
    ON c.r_constraint_name = p.constraint_name
 WHERE p.table_name = 'PARENT_TABLE'
   AND c.constraint_type = 'R';

해결책 3: ALTER TABLE로 PK/Unique 제약 조건 비활성화 시 CASCADE 옵션 활용

부모 테이블의 PK 또는 Unique 제약 조건을 비활성화할 때 CASCADE 옵션을 사용하면, 연관된 FK 제약 조건도 자동으로 함께 비활성화됩니다.

-- CASCADE 옵션으로 PK 비활성화 시 연관 FK도 함께 비활성화
ALTER TABLE parent_table DISABLE PRIMARY KEY CASCADE;

-- 작업 완료 후 PK 재활성화
ALTER TABLE parent_table ENABLE PRIMARY KEY;

-- FK는 별도로 다시 활성화해야 함
ALTER TABLE child_table ENABLE CONSTRAINT fk_child_parent;

-- 여러 FK가 있을 경우 동적 SQL로 일괄 처리
BEGIN
  FOR rec IN (
    SELECT c.table_name, c.constraint_name
      FROM user_constraints c
      JOIN user_constraints p
        ON c.r_constraint_name = p.constraint_name
     WHERE p.table_name = 'PARENT_TABLE'
       AND c.constraint_type = 'R'
  ) LOOP
    EXECUTE IMMEDIATE 'ALTER TABLE ' || rec.table_name ||
                      ' ENABLE CONSTRAINT ' || rec.constraint_name;
  END LOOP;
END;
/

해결책 4: 참조 관계 전체 파악을 위한 진단 쿼리

에러 발생 시 가장 먼저 참조 관계를 파악해야 합니다. 아래 쿼리를 통해 어떤 테이블이 어떤 FK로 참조하고 있는지 확인할 수 있습니다.

-- 특정 테이블을 참조하는 모든 FK 제약 조건 조회
SELECT c.owner             AS child_owner,
       c.table_name        AS child_table,
       c.constraint_name   AS fk_constraint,
       c.status            AS fk_status,
       p.owner             AS parent_owner,
       p.table_name        AS parent_table,
       p.constraint_name   AS pk_constraint
  FROM dba_constraints c
  JOIN dba_constraints p
    ON c.r_constraint_name = p.constraint_name
   AND c.r_owner           = p.owner
 WHERE p.table_name  = 'PARENT_TABLE'
   AND p.owner       = 'SCHEMA_OWNER'
   AND c.constraint_type = 'R'
 ORDER BY c.table_name;

예방 방법

1. DDL 작업 전 참조 무결성 관계를 반드시 사전 점검하는 스크립트를 표준화하세요

DBA 또는 개발팀이 테이블에 대한 DDL 작업(DROP, TRUNCATE, ALTER)을 수행하기 전에 반드시 참조 관계 점검 쿼리를 실행하는 절차를 표준 운영 프로시저(SOP)로 만들어야 합니다. user_constraints 또는 dba_constraints 뷰를 활용한 점검 스크립트를 팀 내 공유하고, 이를 배포 체크리스트에 포함시켜 실수를 원천 차단하는 것이 효과적입니다.

2. 데이터 정리 시 TRUNCATE 대신 DELETE + COMMIT 또는 FK 관리 절차를 포함한 표준 스크립트를 사용하세요

대량 데이터 삭제가 필요한 경우, FK 비활성화 → 작업 수행 → FK 재활성화의 3단계 절차를 하나의 표준 스크립트로 만들어 재사용하세요. 특히 정기적인 배치 작업이나 테스트 환경 초기화 등 반복적인 작업에서는 이 절차를 자동화하면 ORA-02266을 사전에 방지할 수 있으며, 작업 이력 로깅까지 포함하면 감사 대응에도 유리합니다.


관련 에러

  • ORA-02292: integrity constraint violated - child record found — 부모 레코드 삭제 시 자식 레코드가 존재할 때 발생하는 DML 수준의 참조 무결성 에러로, ORA-02266과 함께 자주 마주치는 에러입니다.
  • ORA-02449: unique/primary keys in table referenced by foreign keys — 외래 키가 존재하는 상태에서 테이블을 DROP하려 할 때 발생하며, ORA-02266과 유사한 맥락에서 나타납니다.
  • ORA-02270: no matching unique or primary key for this column-list — FK 생성 시 참조 대상 컬럼에 PK 또는 Unique 제약이 없을 때 발생합니다.

DBMS 에러 코드 시리즈

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

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

댓글 남기기