본문 바로가기

데이터베이스 Database

Chapter 6 SQL - 트리거 Trigger

트리거(Trigger)란?

  • 테이블에 이벤트(event)가 발생하면 자동으로 실행되는 작업
  • 적용 단위
    • 행 트리거: 테이블 내에 변경되는 행에 대해 각각 실행됨
    • 문장 트리거: INSERT, UPDATE, DELETE 문장 전체에 대해 실행
  • 트리거의 구성요소
    • 이벤트: 테이블에 INSERT, UPDATE, DELETE가 사용되는 경우
    • 조건(condition): optional, 조건이 만족하는 경우에만 트리거를 수행
    • 동작(action): 트리거가 수행해야할 작업
  • 트리거의 용도: 데이터베이스 작업을 제한하거나, 작업의 기록(log), 작업에 대한 감사(audit)를 수행하기 위해 사용

 

트리거의 정의

CREATE [OR REPLACE] TRIGGER trigger_name
    <BEFORE | AFTER> <INSERT | UPDATE | DELETE> ON table_name
    
<FOR EACH ROW | FOR EACH STATEMENT>
[WHEN condition]
BEGIN
    ...
END;

 

트리거의 삭제 및 카탈로그 정보

  • 트리거의 삭제
DROP TRIGGER trigger_name;
  • 트리거 카탈로그 확인
    • ALL_TRIGGERS: 데이터베이스 내의 모든 트리거
    • USER_TRIGGER: 현재 사용자의 트리거들

 

트리거의 예

CREATE OR REPLACE TRIGGER tg_refresh_dept_size
AFTER
    INSERT OR DELETE OR UPDATE OF dept ON student
BEGIN
    refresh_dept_size; -- 저장프로시저 호출. execute 키워드 불필요
END;
/

트리거 생성

update student set dept='전기' where sno=100;

테이블 student가 정상적으로 변경됨
뷰 dept_size가 자동으로 변경됨

insert into student values (600, '홍길동', 3, 'IT');

뷰 dept_size에 바뀐 데이터가 자동으로 적용됨

delete student where sno=400;

테이블 student의 컬럼 dept가 변경될 때 마다 프로시저 refresh_dept_size가 호출되는 트리거를 생성해서

변경된 데이터가 유도된 뷰에 자동으로 업데이트 된다.

 

select * from student;

create or replace trigger tg_refresh_dept_size
after
    insert or delete or update of dept on student
begin
    refresh_dept_size; -- 정의 내용 그대로 써줘도 됨
end;
/	-- 여기까지의 내용을 compile하라는 의미

select * from user_triggers;

select * from student;
select * from dept_size;

update student set dept='전기' where sno=100;

insert into student values (600, '홍길동', 3, 'IT');

delete student where sno=400;