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

MySQL에서 동일한 이벤트와 작업 시간에 대해 여러 트리거를 생성하는 방법

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 이상 버전에서는 동일한 테이블, 동일한 이벤트, 동일한 작업 시간에 대해 여러 트리거를 생성할 수 있으며, FOLLOWSPRECEDES 키워드를 통해 트리거 간의 실행 순서를 명확하게 제어할 수 있습니다. 이 기능은 감사(audit) 로깅, 데이터 검증 등 여러 작업을 하나의 업데이트 이벤트에서 처리해야 할 때 매우 유용합니다.