Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 테이블을 삭제하면 해당 테이블의 트리거도 함께 삭제될까?

트리거(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하면 해당 테이블에 정의된 모든 트리거도 자동으로 삭제됩니다.
  • 따라서 중요한 트리거가 있다면, 테이블 삭제 전에 트리거 정의를 백업해 두는 것이 안전합니다.