본문 바로가기

Database/PLSQL

088 - [Oracle PL/SQL] Trigger - Follows Statement

동일한 조건으로 2개의 트리거가 있을경우, 어떤 트리거가 먼저 실행되는지 확인해보자.

 

 

  • 준비 - 테스트 테이블, 트리거용 테이블, 시퀀스 생성
drop table emp;
/
create table emp
(id number,
name varchar2(20)
);
/


drop table which_fired_first;
/
create table which_fired_first
(seq number,
 trigger_name varchar2(20)
 );
/


drop sequence s1;
/
create sequence s1;

 

 

 

  • 트리거 생성 - 우선순위 없이 생성
create or replace trigger t1
before
insert
on emp
begin
insert into which_fired_first values ( s1.nextval,'t1');
end;
/

create or replace trigger t2
before
insert
on emp
begin
insert into which_fired_first values ( s1.nextval,'t2');
end;

 

 

 

  • 랜덤으로 트리거가 실행됨, t1, t2 중에 어떤 트리거가 먼저 실행되는지는 보장 못함
insert into emp values (1,'khaled');
/
select * from which_fired_first
order by seq;
/
delete from which_fired_first
-----------------------------------

1 row inserted.


       SEQ TRIGGER_NAME        
---------- --------------------
         1 t2                  
         2 t1                  


2 rows deleted.

 

 

 

  • t2 트리거에 옵션 추가
--t2가 t1 이후에 실행되게 follows 옵션을 추가함
create or replace trigger t2
before
insert
on emp
follows t1
begin
insert into which_fired_first values ( s1.nextval,'t2');
end;

 

 

 

옵션이 추가된 테스트 결과 - 항상 t1이 먼저 실행됨

insert into emp values (1,'khaled');
/
select * from which_fired_first
order by seq;
----------------------------
       SEQ TRIGGER_NAME        
---------- --------------------
        21 t1                  
        22 t2                  
        23 t1                  
        24 t2