Adventure Time - Finn 3
본문 바로가기
Exception

이클립스 트리거 에러

by hyun9_9 2024. 1. 27.

이클립스에서 SQL 파일에서

CREATE OR REPLACE TRIGGER TRRIGER_NAME 
BEFORE UPDATE 
ON USERS 
FOR EACH ROW
BEGIN 	
    INSERT INTO USERS_LOG (LID, MID, NICKNAME) VALUES ((SELECT NVL(MAX(LID), 0) + 1 FROM USERS_LOG), :OLD.MID, :OLD.NICKNAME);
END;

해당 구문을 실행 시켰을때 에러가 발생하였다

 

Group Exection 오류가 발생하였다

 

드롭메뉴를 확인해보니 

ORA-00900: invalid SQL statement 이 해당에러는 오타 아니면 SQL문 맨뒤에 세미콜론이 붙어있을때 발생한다

그래서

CREATE OR REPLACE TRIGGER TRRIGER_NAME 
BEFORE UPDATE 
ON USERS 
FOR EACH ROW
BEGIN 	
    INSERT INTO USERS_LOG (LID, MID, NICKNAME) VALUES ((SELECT NVL(MAX(LID), 0) + 1 FROM USERS_LOG), :OLD.MID, :OLD.NICKNAME)
END;

INSERT 문에 세미콜론을 지워 보았더니

 

바로 트리거가 생성되었다

그래서 트리거가 잘 작동되는지 확인하기위해

UPDATE USERS SET NICKNAME='라이츄' where MID=1;

업데이트를 해보았는데

해당 에러가 발생하였다

 

이 에러는 ORA-04098: trigger 'TEEMO.TRRIGER_NAME' is invalid and failed re-validation
(0 rows affected)

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

트리거가 잘못되었다는 건데 

세미콜론을 지워서 트리거가 생성되었으니 세미콜론은 배재하고 다른 구문이 잘못되었나 찾아보았다

 

그래서 찾은 방법이 트리거 권한이 없어서 안될 수도 있다라는 내용을 확인해서

 

GRANT CREATE TRIGGER TO teemo;

 

GRANT CREATE ANY TRIGGER TO TEEMO;

 

GRANT ALTER ANY TRIGGER TO TEEMO;

 

 

권한도 줘보고

select * from USER_SYS_PRIVS;

구문을 사용해서

확인도 하고

select * from all_errors;

에러도 확인을 해보았는데 구문이 오류가 있다는걸 알 수 있었다

 

그래서 현재 트리거 코드를 버리고 GPT에게

 

해당 코드를 받아서 이클립스 SQL 파일에서 실행 시켰는데 

또 같은 오류가 발생하였다

그래서 뒤에 세미콜론을 지웠더니 트리커가 잘 등록이 되어서 업데이트를 사용했는데 여전히 실패했다

 

다시 GPT에게 물어보니

세미콜론이 있어야한다는 답변을 받아볼 수 있었다

 

그럼 이클립스가 잘못된건가라는 생각이 갑자기 들어서 

바로 DBeaver를 사용해서 

CREATE OR REPLACE TRIGGER TRRIGER_NAME

BEFORE UPDATE

ON USERS

FOR EACH ROW

BEGIN

INSERT INTO USERS_LOG (LID, MID, NICKNAME) VALUES ((SELECT NVL(MAX(LID), 0) + 1 FROM USERS_LOG), :OLD.MID, :OLD.NICKNAME);

END;

해당 구문을 실행시키니

바로 트리거가 생성된걸 확인 할 수 있었다

 바로 업데이트를 해보니

잘 등록되는 것을 확인하였다

 

혹시나 해서 

세미콜론 없이 트리거를 등록해보니 또 등록은 잘 되었다

하지만 

업데이트를 하였을때

해당 오류가 똑같이 발생한것을 확인 할 수 있었다 

 

결론 : 트리거 생성시 세미콜론으로 구문을 끝내줘야 잘 작동하고 

이클립스에선 트리거가 인식이 안되는것을 알 수 있었다