간단한 트리거 작성 질문드려요 ㅠ 0 2 2,174

by 세탁건조기 트리거 trigger [2015.04.20 14:38:07]


*********** 작성한 트리거  ***************

create or replace TRIGGER sal_trigger

AFTER INSERT ON emp

 FOR EACH ROW 
 WHEN ( new.sal < 800 )
BEGIN
  UPDATE EMP
  SET sal = 800
  WHERE empno = :new.empno; 
END;

 

- EMP 테이블에 INSERT할 때 sal값이 800미만이면 트리거실행

-update 문을 이용해 입력된 sal을 800으로 수정해줌1

**************************************************

insert into emp
(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values ( 1988, 'ssjk', 'salesman', 7369, sysdate, 10, 300, 20);

이렇게 insert 실행하면

******************************************************************

오류 보고 -
SQL 오류: ORA-04091: 테이블 SCOTT.EMP가 변화하고 있어서 트리거/함수가 이를 볼 수 없습니다
ORA-06512: "SCOTT.SAL_TRIGGER", 줄 2에서
ORA-04088: 트리거 'SCOTT.SAL_TRIGGER'의 수행시 오류
04091. 00000 -  "table %s.%s is mutating, trigger/function may not see it"
*Cause:    A trigger (or a user defined plsql function that is referenced in
           this statement) attempted to look at (or modify) a table that was
           in the middle of being modified by the statement which fired it.
*Action:   Rewrite the trigger (or function) so it does not read that table.

 

*******************************************************************

 

이렇게 오류가납니다 ㅠ

2번 줄에러라고 해서 

AFTER를 BEFORE로 변경하면 오류는 안나는데 sal값은 수정안되고 그냥 10으로 들어가버리고요 ㅠ

어디가 잘못된 건가요?

 

변화하고 있다는 말이 이해가안되네요...

AFTER로 insert가 된 이후에 트리거가 실행되게 했으니까

insert - > 트리거 update 문이 실행되는거 아닌가요? 삽입이 끝난 후 트리거가 실행되게 AFTER를 줬는데

변화하고 있다는 말이 이해가안됩니다 ㅠ

by 마농 [2015.04.20 15:09:54]

트리거 걸린 테이블은 트리거 내에서 다시 참조, 갱신 등이 불가능합니다.
이를 허용하게 된다면? 트리거에 또 트리거가 걸리는 무한루프에 빠지게 되겠지요.
위의 경우는 하고자 하는 바를 잘못 인지해서 나타난 현상입니다.
위에서 하고자 하는 것은 테이블을 다시 Update 하는 것은 아니죠.
단지, 입력된 값(:new.sal)을 변경하는 것일 뿐입니다.
  - 변경전) UPDATE emp SET sal = 800 WHERE empno = :new.empno;
  - 변경후) :new.sal := 800;
단, 입력된 값을 변경하려면 After 가 아닌 Before 를 사용해야 합니다.


by 세탁건조기 [2015.04.20 17:41:34]

아... insert 되기 전에  

입력된 sal 값을 체크하고 800미만이면

sal값을 800으로 바꿔만 주고 트리거가 끝나는거군요.

트리거가 끝난 후에 insert문이 실행되서 값을 삽입하는거구요...

설명 감사합니다!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입