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