본문 바로가기
Database/Oracle

[ORACLE] ORA-02292 오류 완전 정복 : 자식 테이블 참조로 인한 삭제 실패의 모든 것

by Papa Martino V 2025. 7. 28.
728x90

ORA-02292 오류 완전 정복 : 자식 테이블 참조로 인한 삭제 실패의 모든 것
[ORACLE] ORA-02292

 

ORA-02292: integrity constraint (제약조건 이름) violated - child record found

Oracle 데이터베이스에서 데이터를 삭제하려 할 때 ORA-02292 오류가 발생한다면, 이는 해당 레코드가 다른 테이블의 외래 키(Foreign Key)로 참조되고 있기 때문입니다. 이 오류는 데이터 무결성을 보장하기 위한 Oracle의 방어적 장치로서, 삭제될 부모 레코드를 참조하는 자식 레코드가 존재할 때 발생합니다. 본 글은 ORA-02292 오류의 정확한 발생 배경과 다양한 실무 해결책, 그리고 시스템 설계 단계에서 이 오류를 예방할 수 있는 전략까지 상세히 소개합니다.


1. ORA-02292 오류란?

이 오류는 다음과 같은 상황에서 발생합니다:


DELETE FROM customers WHERE customer_id = 101;

위와 같이 고객 데이터를 삭제하려고 할 때, 해당 고객을 참조하고 있는 주문 데이터가 orders 테이블에 존재하면 ORA-02292 오류가 발생합니다.

즉, 외래 키 제약조건으로 인해 삭제가 거부된 것입니다.


2. 개념 비교: ORA-02291 vs ORA-02292

오류 코드 오류 내용 발생 시점
ORA-02291 부모 키 없음 → 자식 레코드 삽입 실패 INSERT 또는 UPDATE
ORA-02292 자식 레코드 존재 → 부모 레코드 삭제 실패 DELETE

ORA-02291이 '없는 부모를 참조하려 했을 때'의 오류라면, ORA-02292는 '자식이 존재해서 부모를 삭제할 수 없을 때'의 오류입니다.


3. 외래 키 제약조건의 작동 방식

외래 키는 두 테이블 간의 관계를 유지하기 위해 사용됩니다. 자식 테이블이 부모 테이블의 특정 컬럼을 참조하며, 해당 참조가 무결성 규칙을 위반하지 않도록 합니다.


CREATE TABLE customers (
  customer_id NUMBER PRIMARY KEY,
  name VARCHAR2(100)
);

CREATE TABLE orders (
  order_id NUMBER PRIMARY KEY,
  customer_id NUMBER,
  CONSTRAINT fk_customer FOREIGN KEY (customer_id)
    REFERENCES customers(customer_id)
);

이 경우, orders 테이블은 customers 테이블의 customer_id를 참조합니다. 고객을 삭제하려면, 먼저 그 고객을 참조하는 모든 주문 레코드를 제거해야 합니다.


4. 실무 발생 사례

문제 상황: 한 쇼핑몰 플랫폼에서 고객 탈퇴 기능을 구현하던 중, 특정 고객에 대한 DELETE 쿼리가 지속적으로 실패함. 로그에는 다음과 같은 메시지가 출력됨:


ORA-02292: integrity constraint (SHOP.FK_CUSTOMER) violated - child record found

분석 결과:

  • orders 테이블에서 해당 고객의 주문 이력이 존재
  • ON DELETE CASCADE 미적용 상태

해결 방법:

  1. 해당 고객의 주문 레코드 먼저 삭제
  2. 또는 제약조건을 재정의하여 ON DELETE CASCADE 적용

5. 오류 해결 전략

전략 설명 주의사항
자식 테이블 먼저 삭제 참조 중인 레코드를 수동 삭제 삭제 대상 식별을 정확히 해야 함
ON DELETE CASCADE 적용 부모 삭제 시 자식도 자동 삭제 의도하지 않은 대량 삭제 가능성 있음
제약조건 일시 제거 외래 키 제약조건 DROP 후 삭제 무결성 훼손 위험 존재
논리 삭제 처리 실제 삭제 대신 상태값만 변경 데이터는 남아 있으므로 용량 고려 필요

6. 실전 SQL 예시

자식 레코드 존재 여부 확인


SELECT * FROM orders WHERE customer_id = 101;

ON DELETE CASCADE 적용 예


ALTER TABLE orders
DROP CONSTRAINT fk_customer;

ALTER TABLE orders
ADD CONSTRAINT fk_customer FOREIGN KEY (customer_id)
REFERENCES customers(customer_id) ON DELETE CASCADE;

논리 삭제 예시


UPDATE customers
SET active_flag = 'N'
WHERE customer_id = 101;

7. 실무 예방 팁

  • 자식 레코드를 갖는 테이블에 DELETE를 허용하는 경우 항상 외래 키 정의를 명확히 검토
  • 논리 삭제 정책을 통해 물리적 삭제를 최소화
  • 외래 키 제약조건에 ON DELETE SET NULL 또는 CASCADE 옵션 적용 여부 검토
  • 삭제 전 EXISTS 또는 JOIN을 통해 참조 여부 사전 체크

8. 결론

ORA-02292 오류는 오라클이 데이터 무결성을 보장하기 위해 의도적으로 설계한 보호장치입니다. 자식 테이블의 존재 여부를 무시하고 부모 데이터를 삭제하면 데이터 관계가 훼손되기 때문에, 시스템 설계 및 운영에서 반드시 사전에 이러한 오류 가능성을 고려해야 합니다. 이 글에서 제시한 실무 중심의 해결 전략과 예방 노하우는 향후 ORA-02292 오류 발생 시 신속하고 안전하게 대응할 수 있도록 도와줄 것입니다.


출처

  • Oracle® Database Concepts 19c
  • Oracle SQL Language Reference
728x90