트리거(Trigger)는 특정 테이블에 종속되어 동작하는 데이터베이스 객체입니다. 따라서 트리거가 연결된 테이블을 삭제(DROP)하면, 그 테이블에 속한 트리거 역시 자동으로 함께 삭제됩니다. 이처럼 테이블 삭제로 인해 트리거가 제거되는 것을 트리거의 명시적 파괴(explicit destroy)라고 부릅니다.
아래 예제를 통해 이 동작 방식을 쉽게 이해할 수 있습니다.
예제
'Sample'이라는 테이블에는 'trigger_before_delete_sample'이라는 이름의 트리거가 정의되어 있다고 가정해 보겠습니다. 먼저 현재 데이터베이스에 등록된 트리거 목록을 확인해 보겠습니다.
mysql> Show Triggers\G
*************************** 1. row ***************************
Trigger: trigger_before_delete_sample
Event: DELETE
Table: sample
Statement: BEGIN
SET @count = if (@count IS NULL, 1, (@count+1));
INSERT INTO sample_rowaffected values (@count);
END
Timing: BEFORE
Created: 2017-11-21 12:31:58.70
sql_mode: ONLY_FULL_GROUP_BY,
STRICT_TRANS_TABLES,
NO_ZERO_IN_DATE,
NO_ZERO_DATE,
ERROR_FOR_DIVISION_BY_ZERO,
NO_AUTO_CREATE_USER,
NO_ENGINE_SUBSTITUTION
Definer: root@localhost
character_set_client: cp850
collation_connection: cp850_general_ci
Database Collation: latin1_swedish_ci
*************************** 2. row ***************************
Trigger: before_inser_studentage
Event: INSERT
Table: student_age
Statement: IF NEW.age < 0 THEN SET NEW.age = 0;
END IF
Timing: BEFORE
Created: 2017-11-21 11:26:15.34
sql_mode: ONLY_FULL_GROUP_BY,
STRICT_TRANS_TABLES,
NO_ZERO_IN_DATE,
NO_ZERO_DATE,
ERROR_FOR_DIVISION_BY_ZERO,
NO_AUTO_CREATE_USER,
NO_ENGINE_SUBSTITUTION
Definer: root@localhost
character_set_client: cp850
collation_connection: cp850_general_ci
Database Collation: latin1_swedish_ci
2 rows in set (0.01 sec)위 결과를 보면 데이터베이스에는 두 개의 트리거가 존재하며, 그중 하나('trigger_before_delete_sample')가 'Sample' 테이블과 연결되어 있는 것을 확인할 수 있습니다.
테이블 삭제
이제 다음 문장을 실행하여 'Sample' 테이블을 삭제(DROP)합니다.
mysql> DROP table sample; Query OK, 0 rows affected (0.26 sec)
결과 확인
테이블 삭제 후 다시 트리거 목록을 조회해 보면, 'Sample' 테이블에 연결되어 있던 트리거가 함께 사라진 것을 확인할 수 있습니다.
mysql> Show Triggers\G
*************************** 1. row ***************************
Trigger: before_inser_studentage
Event: INSERT
Table: student_age
Statement: IF NEW.age < 0 THEN SET NEW.age = 0;
END IF
Timing: BEFORE
Created: 2017-11-21 11:26:15.34
sql_mode: ONLY_FULL_GROUP_BY,
STRICT_TRANS_TABLES,
NO_ZERO_IN_DATE,
NO_ZERO_DATE,
ERROR_FOR_DIVISION_BY_ZERO,
NO_AUTO_CREATE_USER,
NO_ENGINE_SUBSTITUTION
Definer: root@localhost
character_set_client: cp850
collation_connection: cp850_general_ci
Database Collation: latin1_swedish_ci
1 row in set (0.01 sec)결과에서 볼 수 있듯이, 처음에는 두 개였던 트리거가 이제 하나만 남았습니다. 즉, 'Sample' 테이블을 삭제하자 그 테이블에 종속되어 있던 'trigger_before_delete_sample' 트리거도 함께 제거된 것입니다.
정리
- 트리거는 항상 특정 테이블에 종속적인 객체입니다.
- 테이블을 DROP하면 해당 테이블에 정의된 모든 트리거도 자동으로 삭제됩니다.
- 따라서 중요한 트리거가 있다면, 테이블 삭제 전에 트리거 정의를 백업해 두는 것이 안전합니다.