ORA-04098: 트리거가 부적합하며 재검증을 실패했습니다 (ORA-04098: trigger is invalid and failed re-validation)

ORA-04098: 트리거가 부적합하며 재검증을 실패했습니다 (ORA-04098: trigger is invalid and failed re-validation) 오류는 트리거 소스의 부적합으로 인하여 발생하며 어떻게 오류를 해결할 수 있는지 알아봅시다. 하기의 괄호 내부 단축키는 토드(TOAD: Tool for Oracle Application Development) 기준입니다.

ORA-04098 트리거가 부적합하며 재검증을 실패했습니다

ORA-04098 오류 해결하기 : Describe Trigger Errors

Describe Trigger Errors

첫 번째 방법은 트리거를 Describe(F4)하여 Errors 탭에서 오류가 발생한 라인, 컬럼 및 메시지를 확인하여 처리하는 방법입니다.

라인 및 컬럼은 정확한 수치가 아니기에 해당 위치로 이동한 다음(Goto line: Ctrl + G)에 문제가 되는 부분을 찾기 위한 참고 용도로 사용해야 합니다. 오류 메시지를 중점으로 분석하면 답이 나올 것입니다.

ORA-04098 오류 해결하기 : Execute Trigger Statement

Execute Trigger Statement

두 번째 방법은 스테이트먼트를 직접 실행해 보는 것(단축키 F9)입니다. 예시자료에 해당하는 경우는 일부러 트리거 생성시점부터 오류가 발생하도록 유도하였습니다.

실제로는 해당과 같은 오류는 거의 발생하지 않을 것이고 이외의 객체 참조 문제, 권한 문제 등으로 오류가 발생하는 경우가 대부분이기에 직접 실행 이전에는 주의가 필요합니다~

다음은 [Error] ORA-00984 : PL/SQL: ORA-00984: 열을 사용할 수 없습니다 오류가 발생하도록 트리거를 임의로 생성한 예시자료입니다.

CREATE OR REPLACE TRIGGER USER_NAME.TRIGGER_NAME
   AFTER INSERT OR UPDATE OR DELETE
   ON USER_NAME.TABLE_NAME
   FOR EACH ROW
DECLARE
   aEVENT   VARCHAR2 (100);
BEGIN
   IF INSERTING
   THEN
      aEVENT := 'INSERTING';
   ELSIF UPDATING
   THEN
      aEVENT := 'UPDATING';
   ELSE
      aEVENT := 'DELETING';
   END IF;
   --[Error] PL/SQL: ORA-00984: 열을 사용할 수 없습니다
   INSERT INTO LOG_TABLE_NAME (OLDCOL, NEWCOL, EVENTCOL)
        VALUES (:OLD.COLUMN_NAME, :NEW.COLUMN_NAME, EVENT);
EXCEPTION
   WHEN OTHERS
   THEN
      NULL;
END;
/

댓글