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

MySQL에서 DELETE 작업 실행 후 트리거 발동하기 – AFTER DELETE 트리거 사용법

MySQL에서 AFTER DELETE를 사용하면 DELETE 작업이 실행된 이후에 트리거가 자동으로 발동되도록 설정할 수 있습니다. 이는 삭제된 데이터의 로그를 남기거나, 삭제 시점의 사용자 정보와 시간을 기록하는 등의 용도로 매우 유용합니다.

AFTER DELETE 트리거 기본 문법

AFTER DELETE 트리거를 생성하는 기본 문법은 다음과 같습니다.

DELIMITER //
   CREATE TRIGGER yourTriggerName
      AFTER DELETE
      ON yourTableName FOR EACH ROW
      BEGIN
      yourStatement1,
      .
      .
      N
  END;
  //

예제 테이블 생성하기

먼저 예제로 사용할 테이블을 생성해 보겠습니다.

mysql> create table DemoTable(Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,FirstName varchar(100));
Query OK, 0 rows affected (0.62 sec)

데이터 삽입하기

INSERT 명령을 사용해 테이블에 몇 개의 레코드를 추가합니다.

mysql> insert into DemoTable(FirstName) values('John');
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable(FirstName) values('Mike');
Query OK, 1 row affected (0.12 sec)

저장된 데이터 확인하기

SELECT 문으로 테이블의 모든 레코드를 조회해 봅니다.

mysql> select *from DemoTable;

위 쿼리는 아래와 같은 결과를 출력합니다.

+----+-----------+
| Id | FirstName |
+----+-----------+
| 1  | John      |
| 2  | Mike      |
+----+-----------+
2 rows in set (0.00 sec)

AFTER DELETE 트리거 생성하기

다음은 AFTER DELETE를 활용하여 트리거를 생성하는 쿼리입니다. 이 트리거는 레코드가 삭제될 때마다 현재 접속 중인 사용자와 삭제 시각을 세션 변수에 저장합니다.

mysql> DELIMITER //
mysql> CREATE TRIGGER history_of_Table
   AFTER DELETE
      ON DemoTable FOR EACH ROW
   BEGIN
      SELECT USER() INTO @userName;
      SELECT NOW() INTO @deleteDatetime;
   END; //
Query OK, 0 rows affected (0.18 sec)
mysql> DELIMITER ;

트리거 동작 확인하기

트리거가 정상적으로 작동하는지 확인하려면 테이블에서 첫 번째 레코드를 삭제해 봅니다.

mysql> delete from DemoTable where Id=1;
Query OK, 1 row affected (0.26 sec)

위 명령으로 첫 번째 레코드(Id=1)가 삭제되었습니다. 즉, DELETE 명령이 실행된 직후 트리거가 활성화되어야 합니다.

삭제를 수행한 사용자 확인

세션 변수 @userName을 조회하면 트리거가 기록한 사용자 정보를 확인할 수 있습니다.

mysql> select @userName;

실행 결과는 다음과 같습니다.

+----------------+
| @userName      |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

삭제 시점의 날짜 및 시간 확인

트리거가 작동할 때마다 현재 시간도 함께 저장됩니다. @deleteDatetime 변수를 조회해 보겠습니다.

mysql> select @deleteDatetime;

실행 결과는 다음과 같습니다.

+---------------------+
| @deleteDatetime     |
+---------------------+
| 2019-07-09 21:06:31 |
+---------------------+
1 row in set (0.00 sec)

정리

이처럼 MySQL의 AFTER DELETE 트리거를 활용하면 특정 테이블에서 데이터가 삭제될 때마다 누가 언제 삭제했는지 자동으로 추적할 수 있습니다. 감사 로그(audit log) 구축, 데이터 변경 이력 관리 등 실무에서 다양하게 응용할 수 있으니 참고하시기 바랍니다.