MySQL 5.7.2 버전부터는 하나의 테이블에서 동일한 이벤트와 작업 시간(action time)에 대해 여러 개의 트리거를 생성할 수 있습니다. 이렇게 생성된 트리거들은 해당 이벤트가 발생할 때 정의된 순서대로 차례로 활성화됩니다.
트리거의 실행 순서는 FOLLOWS 또는 PRECEDES 키워드를 사용하여 명시적으로 지정할 수 있습니다. 아래 예제를 통해 자세히 살펴보겠습니다.
예제: BEFORE UPDATE 이벤트에 여러 트리거 생성하기
이번 예제에서는 동일한 이벤트인 BEFORE UPDATE에 대해 두 개의 트리거를 생성해 보겠습니다. 트리거 이름은 각각 'studentdetail_before_update'와 'studentdetail_before_update2'입니다. 먼저 다음과 같은 데이터를 가진 'Student_detail' 테이블이 준비되어 있다고 가정합니다.
mysql> Select * from Student_detail; +-----------+-------------+------------+ | Studentid | StudentName | address | +-----------+-------------+------------+ | 100 | Gaurav | Delhi | | 101 | Raman | Shimla | | 103 | Rahul | Jaipur | | 104 | Ram | Chandigarh | | 105 | Mohan | Chandigarh | +-----------+-------------+------------+ 5 rows in set (0.06 sec) mysql> Delimiter //
첫 번째 트리거 생성
다음 쿼리를 사용하여 첫 번째 트리거를 생성합니다. 이 트리거는 학생 정보가 수정되기 전에 누가 언제 수정했는지 기록하는 역할을 합니다.
mysql> Create Trigger studentdetail_before_update
-> BEFORE UPDATE
-> ON Student_detail
-> FOR EACH ROW
-> BEGIN
-> DECLARE AUSER Varchar(40);
-> SELECT USER() into AUSER;
->INSERT INTO Student_detail_updated(studentid, Updated_date,Updated_by) values(OLD.studentid,NOW(),AUSER);
-> END; //
Query OK, 0 rows affected (0.17 sec)
mysql> Update student_detail SET Address = 'Ludhiana' Where studentName = 'Ram';
Query OK, 1 row affected (0.15 sec)
Rows matched: 1 Changed: 1 Warnings: 0위에서 생성한 트리거가 실행된 후 'student_detail_updated' 테이블을 조회하면 다음과 같은 결과를 확인할 수 있습니다.
mysql> Select * from student_detail_updated; +-----------+---------------------+----------------+ | studentid | Updated_date | Updated_by | +-----------+---------------------+----------------+ | 104 | 2017-11-22 16:17:16 | root@localhost | +-----------+---------------------+----------------+ 1 row in set (0.00 sec)
FOLLOWS 키워드로 두 번째 트리거 생성
이제 동일한 이벤트와 작업 시간을 가진 두 번째 트리거를 생성합니다. 여기서 핵심은 'FOLLOWS' 키워드입니다. 이 키워드를 사용하면 새로 생성되는 트리거가 지정한 기존 트리거보다 나중에 실행되도록 순서를 명확하게 정의할 수 있습니다.
mysql> Create Trigger studentdetail_before_update2
-> BEFORE UPDATE
-> ON Student_detail
-> FOR EACH ROW FOLLOWS studentdetail_before_update
-> BEGIN
-> DECLARE AUSER Varchar(40);
-> SELECT USER() into AUSER;
-> INSERT INTO Student_detail_updated(studentid, Updated_date,Updated_by) values(OLD.studentid,NOW(),AUSER);
-> END; //
Query OK, 0 rows affected (0.15 sec)'FOLLOWS' 키워드를 사용했기 때문에 위 트리거는 첫 번째 트리거(studentdetail_before_update)가 실행된 이후에 활성화됩니다. 반대로 기존 트리거보다 먼저 실행하고 싶다면 'PRECEDES' 키워드를 사용하면 됩니다.
이제 값을 업데이트해 보겠습니다.
mysql> Update Student_detail SET Address = 'Patiala' WHERE studentname = 'Mohan'; Query OK, 1 row affected (0.08 sec) Rows matched: 1 Changed: 1 Warnings: 0
업데이트 후 로그 테이블을 조회하면, 동일한 이벤트와 작업 시간에 대해 두 개의 트리거가 모두 실행되어 두 개의 레코드가 추가된 것을 확인할 수 있습니다. 아래 결과에서 두 번째 행은 'studentdetail_before_update' 트리거가 실행된 결과이고, 세 번째 행은 'studentdetail_before_update2' 트리거가 실행된 결과입니다.
mysql> Select * from student_detail_updated; +-----------+---------------------+----------------+ | studentid | Updated_date | Updated_by | +-----------+---------------------+----------------+ | 104 | 2017-11-22 16:17:16 | root@localhost | | 105 | 2017-11-22 16:19:28 | root@localhost | | 105 | 2017-11-22 16:19:28 | root@localhost | +-----------+---------------------+----------------+ 3 rows in set (0.00 sec)
정리
MySQL 5.7.2 이상 버전에서는 동일한 테이블, 동일한 이벤트, 동일한 작업 시간에 대해 여러 트리거를 생성할 수 있으며, FOLLOWS와 PRECEDES 키워드를 통해 트리거 간의 실행 순서를 명확하게 제어할 수 있습니다. 이 기능은 감사(audit) 로깅, 데이터 검증 등 여러 작업을 하나의 업데이트 이벤트에서 처리해야 할 때 매우 유용합니다.