반응형
ORA-04091: Table Is Mutating, Trigger/Function May Not See It / 원인과 해결 방법
ORA-04091 오류는 트리거가 동일한 테이블에서 데이터를 조작할 때 발생하는 제약과 관련된 오류입니다.
ORA-04091 오류 설명
Oracle은 테이블의 변경 사항이 확정(commit)되지 않은 상태에서 동일한 테이블을 다시 참조하려고 하면, 데이터 일관성을 보장하기 위해 "Mutating Table" 오류를 발생시킵니다. 이 오류는 주로 행 수준 트리거(Row-Level Trigger)에서 발생합니다.
오류 원인
ORA-04091 오류의 주요 원인은 다음과 같습니다:
- 트리거 내 데이터 조작: 트리거에서 동일한 테이블을 SELECT, INSERT, UPDATE, DELETE 하려는 경우.
- 재귀 호출: 트리거가 간접적으로 자기 자신을 호출하여 동일한 테이블에 접근하는 경우.
해결 방법 및 명령어 예시
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 오류는 테이블 변경 중에 동일 테이블을 참조하려고 할 때 발생합니다.
- 해결 방법: 문 수준 트리거 사용, 논리 분리, 임시 테이블 활용, 트리거 제거.
- 데이터 무결성을 유지하려면 데이터 처리 로직을 재설계해야 합니다.
반응형