728x90

# 트리거

이벤트(삽입, 갱신, 삭제)가 발생하면 일을 함

- 데이터베이스의 수정에 대한 부수효과로 시스템이 자동적으로 수행함

- 트리거 설계 시 명시되어야 할 것 :

  트리거가 검사되어야 하는 사건이나 트리거의 실행을 위해 만족되어야 하는 조건

  트리거가 실행될 때 수행되어야 할 동작

- 데이터베이스 외부에 대한 갱신은 수행할 수 없음

 

# 트리거 : 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

 

# 트리거가 부적합한 경우

- 실체화 뷰를 유지하기 위해 사용

- 데이터베이스의 사본을 만들 때 사용

- 사용자가 의도하지 않은 트리거 동작이 수행됨

예비 사본으로부터 자료를 가져올 때

한 사이트의 데이터베이스 갱신을 예비 사이트에 복제할 때

- 자료를 가져올 때 트리거를 명시적으로 비활성화시킴

- 무한히 연결되는 트리거 발생

반응형

'전공 공부 > 데이터베이스시스템' 카테고리의 다른 글

개체 관계 모델  (0) 2021.01.04
관계 대수 연산  (0) 2021.01.04
함수와 프로시저  (0) 2021.01.03
함수  (0) 2021.01.03
프로시저  (0) 2021.01.03
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기