# 트리거
– 이벤트(삽입, 갱신, 삭제)가 발생하면 일을 함
- 데이터베이스의 수정에 대한 부수효과로 시스템이 자동적으로 수행함
- 트리거 설계 시 명시되어야 할 것 :
트리거가 검사되어야 하는 사건이나 트리거의 실행을 위해 만족되어야 하는 조건
트리거가 실행될 때 수행되어야 할 동작
- 데이터베이스 외부에 대한 갱신은 수행할 수 없음
# 트리거 : insert – new row
예) time_slot_id 은 timeslot 의 주 키가 아니므로 section 에서 timeslot 으로
외래 키 제약 조건을 만들 수 없음
대안 : section 과 timeslot 에서 트리거를 사용하여 무결성 제약 조건을 적용함
create trigger timeslot_check1 after insert on section
referencing new row as nrow
for each row
when (nrow.time_slot_id not in (
select time_slot_id
from time_slot)) /* time_slot_id 는 time_slot 에 존재하면 안됨*/
begin
rollback
end;
# 트리거 : delete – old row
create trigger timeslot_check2 after delete on timeslot
referencing old row as orow
for each row
when (orow.time_slot_id not in (
select time_slot_id
from time_slot)
/* time slot id 에 대한 마지막 투플을 time slot 에서 삭제 */
and orow.time_slot_id in (
select time_slot_id
from section)) /* time_slot_id 는 여전히 section 에 참조됨*/
begin
rollback
end;
# 트리거 : after update – new, old row
create trigger credits_earned after update of takes on (grade)
referencing new row as nrow
referencing old row as orow
for each row
when nrow.grade <> ’F’ and nrow.grade is not null
and (orow.grade = ’F’ or orow.grade is null)
begin atomic
update student
set tot_cred= tot_cred +
(select credits
from course
where course.course_id= nrow.course_id)
where student.id = nrow.id;
end;
# 트리거 : before update – new row
- 갱신의 경우 트리거는 언 속성의 갱신이 트리거를 실행하게 하는지 명시 가능
- 다른 속성에 대한 갱신은 트리거를 실행시키지 않음
takes 릴레이션의 grade 속성에 대한 갱신 후 실행되는 트리거
- 갱신 전후의 속성 값 참조 가능
referencing old row as : 갱신, 삭제된 행의 이전 값 저장
referencing new row as : 갱신, 삽입
- 사건 전에 실행되는 트리거는 잘못된 갱신, 삽입, 삭제를 방지할 수 있는 추가적인 제약조건의 역할을 함
예) 삽입된 학점의 값이 공백인 경우 null 값으로 대체하는 트리거
create trigger setnull_trigger before update of takes
referencing new row as nrow
for each row
when (nrow.grade = ‘ ‘)
begin atomic
set nrow.grade = null;
end;
# disable trigger : 트리거 비활성화
alter trigger trigger_name disable
# drop trigger : 트리거 제거
drop trigger trigger_name
# 트리거가 부적합한 경우
- 실체화 뷰를 유지하기 위해 사용
- 데이터베이스의 사본을 만들 때 사용
- 사용자가 의도하지 않은 트리거 동작이 수행됨
예비 사본으로부터 자료를 가져올 때
한 사이트의 데이터베이스 갱신을 예비 사이트에 복제할 때
- 자료를 가져올 때 트리거를 명시적으로 비활성화시킴
- 무한히 연결되는 트리거 발생