특정 테이블이 변경되면,

연쇄적으로 다른 테이블이 자동 변경되도록 설정하는 프로시저의 일종.

 

 

sql
닫기
형식 : create trigger 트리거이름 timing [before or after] event [DML 명령문 (insert or update or delete)] on 테이블 이름 [for each row] [when 조건문] BEGIN ‌실행문 END

 

 

before or after

목표 테이블을 대상으로 DML 명령문이 실행되기 직전이나 이후에

트리거의 BEGIN ~ END 사이의 문장을 실행

 

body

BEGIN ~ END 구간에 기술, 이벤트 발생시 실행될 로직이 포함되는 부분.

 

for each row

문장 레벨 트리거 정의 시 생략 가능하다.

그러나 행 레벨 트리거를 정의할 때에는 반드시 기술해야 한다.

 

문장 레벨 트리거

트리거가 설정된 테이블에 대해 DML 명령문을 실행하면, 단 한번 트리거를 발생시킨다.

 

행 레벨 트리거

DML 명령문으로 여러 행이 변경된다면, 각 행이 변경될때마다 트리거가 발생한다.

5개의 행이 변경된다면 트리거도 5번 발생한다.

 

 

 

 

 

 

 

사원테이블에 새로운 데이터가 들어오면 '신입사원이 입사했습니다.'라는 메시지가 출력되는

문장 레벨 트리거

 

 

1) 실습용으로 데이터가 없는 emp01 테이블을 생성한 후, 트리거 작성

sql
닫기
create or replace trigger trg_01 after insert on emp01 -- 이벤트 발생 BEGIN ​​​​dbms_output.put_line('신입사원이 입사했습니다.'); END; /

 

 

 

 

 

 

 

2) 트리거 목록 확인

sql
닫기
select*from user_triggers;

 

 

 

 

 

3) 이벤트 발생시키기

: emp 01 테이블에 데이터 입력를 입력하면 이벤트가 발생한다.

 

 

 

 

 

사원테이블에 새로운 데이터가 들어오면(신입 사원이 들어오면)

급여 테이블에 새로운 데이터가 자동으로 생성되는 (신입 사원의 급여 정보)

행 레벨 트리거 작성

(단, 신입사원의 급여는 일괄 100)

 

 

1) 급여 정보를 저장할 테이블 sal01을 새로 생성하고, 일련번호가 자동 생성되도록 시퀀스도 생성했다.

 

2) 트리거 생성

 

sql
닫기
create or replace trigger trg_02 after insert on emp01 for each row BEGIN ​​​​insert into sal01 values( ​​​​sal01_salno_seq.nextval, 100, :new.empno); END; /

 

 

 

 

3) 이벤트 발생 :

emp01 테이블에 새로운 데이터를 삽입한다. (신입사원 입사)

그리고 emp01을 조회후, sal01에도 데이터가 잘 들어갔는지 확인해본다.

 

 

 

 

4) 일반적인 delete 문으로 emp01의 사원 정보를 삭제하려고 하면 지워지지 않는다.

왜냐면 sal01.empno는 emp01.empno를 참조하는 외래 키 조건을 붙여서 생성했기 때문이다.

그러나 트리거문으로는 삭제가 가능하다.

 

↓ 무결성 제약 조건을 위배했기 때문에 삭제할 수 없다는 오류 발생.

 

 

 

 

5) emp 01의 사원 정보가 삭제되면 sal01의 해당 사원 로우 데이터도 같이 삭제되는 트리거문을 작성해본다.

sql
닫기
create or replace trigger trg_03 after delete on emp01 for each row BEGIN ​​​​delete from sal01 where empno = :old.empno; END; /

 

 

 

6) emp01의 사원 정보를 삭제해본다.

 

emp01과 sal01을 조회해보면 데이터가 삭제되어 있다.

'오라클 데이터베이스' 카테고리의 다른 글

데이터 모델링  (0) 2022.08.03
DQL> Select - Dual 테이블, 숫자 함수, 문자 함수  (0) 2022.08.02
패키지  (0) 2022.08.02
커서 Cursor  (0) 2022.08.02
저장 함수  (0) 2022.08.02

+ Recent posts