SW/Database / / 2024. 12. 4. 11:29

ORA-04091: Table Is Mutating, Trigger/Function May Not See It / 원인과 해결 방법

반응형

ORA-04091: Table Is Mutating, Trigger/Function May Not See It / 원인과 해결 방법

ORA-04091 오류는 트리거가 동일한 테이블에서 데이터를 조작할 때 발생하는 제약과 관련된 오류입니다.

 

 

ORA-04091: Table Is Mutating, Trigger/Function May Not See It / 원인과 해결 방법

 

 

 

 

ORA-04091 오류 설명

Oracle은 테이블의 변경 사항이 확정(commit)되지 않은 상태에서 동일한 테이블을 다시 참조하려고 하면, 데이터 일관성을 보장하기 위해 "Mutating Table" 오류를 발생시킵니다. 이 오류는 주로 행 수준 트리거(Row-Level Trigger)에서 발생합니다.

오류 원인

ORA-04091 오류의 주요 원인은 다음과 같습니다:

  1. 트리거 내 데이터 조작: 트리거에서 동일한 테이블을 SELECT, INSERT, UPDATE, DELETE 하려는 경우.
  2. 재귀 호출: 트리거가 간접적으로 자기 자신을 호출하여 동일한 테이블에 접근하는 경우.

해결 방법 및 명령어 예시

ORA-04091 오류를 해결하기 위해 다음 방법을 고려할 수 있습니다:

1. 트리거를 행 수준에서 문 수준으로 변경

트리거를 문 수준 트리거(Statement-Level Trigger)로 변경하여 해결합니다:

-- 행 수준 트리거 대신 문 수준 트리거 사용
CREATE OR REPLACE TRIGGER example_trigger
AFTER INSERT OR UPDATE ON table_name
BEGIN
  -- 로직 처리
END;
/

2. PL/SQL 블록으로 논리 분리

트리거 대신 별도의 프로시저나 패키지를 사용하여 논리를 분리합니다:

-- 독립적인 프로시저로 변경
CREATE OR REPLACE PROCEDURE process_logic AS
BEGIN
  -- 데이터 조작 로직
END;
/

3. 임시 테이블 사용

데이터 조작 로직을 임시 테이블을 통해 우회합니다:

-- 임시 테이블 생성
CREATE GLOBAL TEMPORARY TABLE temp_table (
  column1 datatype,
  column2 datatype
) ON COMMIT DELETE ROWS;

-- 트리거 로직에서 임시 테이블 사용
CREATE OR REPLACE TRIGGER example_trigger
AFTER INSERT ON table_name
BEGIN
  INSERT INTO temp_table VALUES (:NEW.column1, :NEW.column2);
END;
/

4. 트리거 제거

비필수적인 트리거라면 제거를 고려하세요:

-- 트리거 삭제
DROP TRIGGER example_trigger;

간단 요약

  • ORA-04091 오류는 테이블 변경 중에 동일 테이블을 참조하려고 할 때 발생합니다.
  • 해결 방법: 문 수준 트리거 사용, 논리 분리, 임시 테이블 활용, 트리거 제거.
  • 데이터 무결성을 유지하려면 데이터 처리 로직을 재설계해야 합니다.
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유