SW/Database / / 2024. 12. 1. 19:30

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

반응형

ORA-04091 오류 설명

ORA-04091 오류는 트리거 내에서 동일 테이블을 수정하거나 쿼리하려고 할 때 발생하는 오류입니다.

 

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

 

ORA-04091 오류 설명

이 오류는 트리거가 실행되는 동안 해당 트리거가 참조하는 테이블이 변경되면 발생합니다. Oracle은 데이터 무결성을 유지하기 위해 이러한 동작을 금지합니다.

오류 원인

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

  1. 트리거 내에서 동일 테이블 참조: 트리거가 실행되는 동안 동일한 테이블을 쿼리하거나 수정하려고 할 때.
  2. 함수 호출: 트리거가 동일 테이블을 참조하는 함수를 호출할 때.

해결 방법 및 명령어 예시

ORA-04091 오류를 해결하기 위해 다음과 같은 방법을 시도할 수 있습니다:

1. 트리거 논리 변경

트리거가 동일 테이블을 참조하지 않도록 논리를 수정합니다.

-- 잘못된 예
CREATE OR REPLACE TRIGGER trg_example
AFTER INSERT OR UPDATE ON employees
FOR EACH ROW
BEGIN
  UPDATE employees SET salary = salary + 100 WHERE employee_id = :NEW.employee_id;
END;
/

-- 수정된 예
CREATE OR REPLACE TRIGGER trg_example
AFTER INSERT OR UPDATE ON employees
FOR EACH ROW
BEGIN
  NULL; -- 트리거 내에서 동일 테이블을 수정하지 않음
END;
/

2. 패키지 및 프로시저 사용

중간 테이블이나 패키지를 사용하여 데이터를 저장한 뒤, 별도의 프로세스로 동일 테이블을 수정합니다.

-- 임시 테이블 생성
CREATE TABLE temp_table (employee_id NUMBER, salary NUMBER);

-- 트리거 수정
CREATE OR REPLACE TRIGGER trg_example
AFTER INSERT OR UPDATE ON employees
FOR EACH ROW
BEGIN
  INSERT INTO temp_table (employee_id, salary) VALUES (:NEW.employee_id, :NEW.salary + 100);
END;
/

-- 별도 프로시저 실행
BEGIN
  UPDATE employees e
  SET salary = (SELECT t.salary FROM temp_table t WHERE t.employee_id = e.employee_id);
END;
/

3. 행 수준 트리거 대신 문 수준 트리거 사용

행 수준 트리거 대신 문 수준 트리거를 사용하여 문제를 회피할 수 있습니다.

-- 행 수준 대신 문 수준 사용
CREATE OR REPLACE TRIGGER trg_example
AFTER INSERT OR UPDATE ON employees
BEGIN
  UPDATE employees SET salary = salary + 100 WHERE employee_id IN (SELECT employee_id FROM employees);
END;
/

간단 요약

  • ORA-04091 오류는 트리거가 동일 테이블을 참조할 때 발생합니다.
  • 해결 방법: 트리거 논리 수정, 임시 테이블 사용, 문 수준 트리거로 변경.

 

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유