데이터베이스

관계형 데이터베이스: 트리거, Triggers

소재훈 2021. 12. 29. 03:41

데이터베이스 목차

이 글에서는 University Database가 사용된다.

 

트리거(Trigger)는 대부분의 DBMS에서 비용을 크게 사용하지 않고 데이터의 무결성 제약을 보장할 수 있는 방법이다.

insert, delete, update 등 각각에 action을 세분화 시켜서 비용을 줄이고 중간에 조건(Condition)을 두고 만족시킬 때 action을 수행하도록 할 수 있다.

리하면 변경이 일어날 때 DBMS시스템에 의해서 자동으로 수행되는 문장의 집합을 Trigger라고 한다. 

트리거는 세가지로 구성된다. ECA(Event-Condition-Action)

 

referencing old row as...

referencing new row as...

을 사용해서 삭제되기 전 tuple, 업데이트되기 전/후 tuple을 변수로 선언할 수 있다.

 

Trigger를 사용한 예를 하나 살펴보자

ex) F학점에서 F학점이 아닌 경우로 업데이트될 때만 학생의 totalCredit을 업데이트해주는 Trigger를 만들라.

여기서 위의 세 가지 요소로 나누어보자.

  • Event
    UPDATE of grade on takes
  • Condition
    old grade is 'F' or null, and
    new grade is not 'F' and not null
  • Action
    해당되는 학번을 가진 학생의 튜플을 찾은 다음 totalCredit을 업데이트한다.
CREATE trigger myCred after update of grade on takes
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
    UPDATE student
    SET totalCredit = totalCredit + 
            (SELECT credit
             FROM course
             WHERE cID = nrow.cID)
    WHERE sID = nrow.sID
END;

이런 식으로 Trigger를 등록해 놓으면 데이터베이스 시스템이 사건이 발생했을 때 알아서 처리해준다.

 

트리거를 사용할 때, after 대신 before를 사용하여 사건 발생 '이후'가 아닌 사건 발생 '이전'에도 action을 취할 수 있다.

ex) takes 테이블의 학점 grades 속성에 빈칸(blank)이 있으면 null로 바꾸어준다. -> 학점을 저장하기 전 사전작업

CREATE Trigger mySetNull before UPDATE on takes
referencing new row as nrow
for each row
WHEN (nrow.grade = ' ')
UPDATE takes set nrow.grade = null;

 

어떤 테이블에 업데이트가 수행된 튜플의 수가 100개라고 하면, 각각의 행에 대해서 action을 처리해야 한다. 이것이 지금까지 살펴본 '행단 위 트리거'이다.

그것이 아니라 100개의 tuple에 대해 업데이트가 발생한 이후에, 각 행에 대해 action을 한 번씩 처리하는 것이 아니라 '테이블 전체'에 대해서 action을 한 번만 처리하는 것을 statement level trigger(=문장 레벨 트리거)라고 한다.

for each row대신 for each statement를 사용하여 문장 레벨 트리거라는 것을 명시한다.

 

트리거는 이처럼 단순하지는 않지만 복잡한 제약조건(constraint)에 사용할 수 있다. 

트리거는 주로 관계형 DB에서 사용하는데, 객체지향 DB에서는 굳이 Trigger를 사용하지 않고 메서드를 사용해서 동일한 기능을 구현할 수 있다.