Linux/SQL

트리거 실습 (회원 탈퇴 테이블을 이용한 트리거 생성)

GGkeeper 2021. 12. 8. 22:19

트리거는 어떤 이벤트가 발생하면 자동적으로 방아쇠가 당겨져 총알이 발사되듯이
특정 테이블이 변경되면 이를 이벤트로 다른 테이블이 자동으로 변경되도록 하기 위해서 사용된다.

형식 : 
DELIMITER //
CREATE TRIGGER <트리거 이름> <활성화시간> <이벤트> ON <테이블명>
FOR EACH ROW
BEGIN
    실행문 ; 
    : 
    :(생략)
END //
DELIMITER ;

활성화 시간
- 트리거 실행 시점
- BEFORE : 이벤트 발생 전에 실행
- AFTER : 이벤트 발생 후에 실행

이벤트
- 트리거가 실행 될 이벤트 ( INSERT / UPDATE / DELETE )


member 테이블 있는 디비에~!!(naver_db)

use naver_db;

create table trig_test (
event_time char(16) ,
count int unsigned );

insert into trig_test values('INSERT_BEFORE', 0);
insert into trig_test values('INSERT_AFTER', 0);
insert into trig_test values('UPDATE_BEFORE', 0);
insert into trig_test values('UPDATE_AFTER', 0);
insert into trig_test values('DELETE_BEFORE', 0);
insert into trig_test values('DELETE_AFTER', 0);

MariaDB [naver_db]> show tables;
+--------------------+
| Tables_in_naver_db |
+--------------------+
| member             |
| trig_test          |
+--------------------+
2 rows in set (0.00 sec)

MariaDB [naver_db]> 
MariaDB [naver_db]> desc trig_test;
+------------+------------------+------+-----+---------+-------+
| Field      | Type             | Null | Key | Default | Extra |
+------------+------------------+------+-----+---------+-------+
| event_time | char(16)         | YES  |     | NULL    |       |
| count      | int(10) unsigned | YES  |     | NULL    |       |
+------------+------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

MariaDB [naver_db]> select * from trig_test;
+---------------+-------+
| event_time    | count |
+---------------+-------+
| INSERT_BEFORE |     0 |
| INSERT_AFTER  |     0 |
| UPDATE_BEFORE |     0 |
| UPDATE_AFTER  |     0 |
| DELETE_BEFORE |     0 |
| DELETE_AFTER  |     0 |
+---------------+-------+
6 rows in set (0.00 sec)


트리거 등록

delimiter //
create trigger trig_test AFTER UPDATE On member
for each row
begin
    update trig_test set count = count +1
    where event_time = 'UPDATE_AFTER';

end //

delimiter ; 

MariaDB [naver_db]> show triggers \G
*************************** 1. row ***************************
             Trigger: trig_test
               Event: UPDATE
               Table: member
           Statement: begin
    update trig_test set count = count +1
    where event_time = 'UPDATE_AFTER';

end
              Timing: AFTER
             Created: NULL
            sql_mode: 
             Definer: root@localhost
character_set_client: utf8mb4
collation_connection: utf8mb4_general_ci
  Database Collation: utf8_general_ci
1 row in set (0.00 sec)


MariaDB [naver_db]> select name, sex from member where sex='M';
+-----------+------+
| name      | sex  |
+-----------+------+
| 황영주    | M    |
| 설기형    | M    |
| 박철호    | M    |
| 이상훈    | M    |
| 배용진    | M    |
| 김문수    | M    |
| 차범길    | M    |
| 김길수    | M    |
| 김수련    | M    |
| 이성현    | M    |
+-----------+------+
10 rows in set (0.00 sec)

MariaDB [naver_db]> select * from trig_test;
+---------------+-------+
| event_time    | count |
+---------------+-------+
| INSERT_BEFORE |     0 |
| INSERT_AFTER  |     0 |
| UPDATE_BEFORE |     0 |
| UPDATE_AFTER  |     0 |
| DELETE_BEFORE |     0 |
| DELETE_AFTER  |     0 |
+---------------+-------+
6 rows in set (0.00 sec)


MariaDB [naver_db]> update member set sex='A' where sex='M';
Query OK, 10 rows affected (0.03 sec)
Rows matched: 10  Changed: 10  Warnings: 0

MariaDB [naver_db]> select name, sex from member where sex='A';
+-----------+------+
| name      | sex  |
+-----------+------+
| 황영주    | A    |
| 설기형    | A    |
| 박철호    | A    |
| 이상훈    | A    |
| 배용진    | A    |
| 김문수    | A    |
| 차범길    | A    |
| 김길수    | A    |
| 김수련    | A    |
| 이성현    | A    |
+-----------+------+
10 rows in set (0.00 sec)

MariaDB [naver_db]> 
MariaDB [naver_db]> select * from trig_test;
+---------------+-------+
| event_time    | count |
+---------------+-------+
| INSERT_BEFORE |     0 |
| INSERT_AFTER  |     0 |
| UPDATE_BEFORE |     0 |
| UPDATE_AFTER  |    10 |  <-- 10개의 업데이트가 발생했기 때문에 count 는 0 -> 10으로 변경되었다.
| DELETE_BEFORE |     0 |
| DELETE_AFTER  |     0 |
+---------------+-------+
6 rows in set (0.00 sec)


실습> 회원 탈퇴 테이블을 이용한 트리거 생성하기

-- 회원 탈퇴 테이블 --
1. 회원 탈퇴 테이블 : out_member
create table out_member 

    no int unsigned auto_increment primary key, 
    id varchar(32) not null unique,
    name varchar(32) not null 
);
+-------+------------------+------+-----+---------+----------------+
| Field | Type             | Null | Key | Default | Extra          |
+-------+------------------+------+-----+---------+----------------+
| no    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| id    | varchar(32)      | NO   | UNI | NULL    |                |
| name  | varchar(32)      | NO   |     | NULL    |                |
+-------+------------------+------+-----+---------+----------------+
2. 트리거 명 : out_mem_trigger 
3. 회원이 탈퇴할 경우 member 테이블에서 삭제하고 회원 탈퇴 테이블(out_member)에 
   최소한의 회원 정보만 저장하도록 설정

- member 테이블 delete 시 out_member 에 id , 이름이 저장된다.
ex) delete from member where id = 'yjhwang';

4. member 테이블

MariaDB [naver_db]> desc member;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| no       | int(11)     | NO   | PRI | NULL    | auto_increment |
| id       | varchar(10) | NO   | UNI | NULL    |                |
| name     | varchar(20) | NO   |     | NULL    |                |
| sex      | char(1)     | YES  |     | NULL    |                |
| post_num | char(8)     | YES  |     | NULL    |                |
| address  | varchar(80) | YES  |     | NULL    |                |
| tel      | varchar(15) | YES  |     | NULL    |                |
| age      | int(11)     | YES  |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)

MariaDB [naver_db]> select no, id, name from member where id='yjhwang';
+----+---------+-----------+
| no | id      | name      |
+----+---------+-----------+
|  1 | yjhwang | 황영주     |
+----+---------+-----------+
1 row in set (0.00 sec)

-- 회원 탈퇴 테이블 --


DELIMITER //
CREATE TRIGGER out_mem_trigger BEFORE DELETE ON member
FOR EACH ROW
BEGIN
    INSERT INTO out_member VALUES('', OLD.id, OLD.name);
END //
DELIMITER ;

MariaDB [naver_db]> show triggers \G
*************************** 1. row ***************************
             Trigger: out_mem_trigger
               Event: DELETE
               Table: member
           Statement: BEGIN
    INSERT INTO out_member VALUES('', OLD.id, OLD.name);
END
              Timing: BEFORE
             Created: NULL
            sql_mode: 
             Definer: root@localhost
character_set_client: utf8mb4
collation_connection: utf8mb4_general_ci
  Database Collation: utf8_general_ci
1 row in set (0.00 sec)

MariaDB [naver_db]> select * from member where name='황영주';
+----+---------+-----------+------+----------+--------------------------------+----------+------+
| no | id      | name      | sex  | post_num | address                        | tel      | age  |
+----+---------+-----------+------+----------+--------------------------------+----------+------+
|  1 | yjhwang | 황영주     | A    | 100-011  | 서울시 중구 충무로1가              | 234-8879 |   35 |
+----+---------+-----------+------+----------+--------------------------------+----------+------+
1 row in set (0.00 sec)

MariaDB [naver_db]> select * from out_member;
Empty set (0.00 sec)

MariaDB [naver_db]> delete from member where name='황영주';
Query OK, 1 row affected (0.02 sec)

MariaDB [naver_db]> select * from member where name='황영주';
Empty set (0.00 sec)

MariaDB [naver_db]> select * from out_member;
+----+---------+-----------+
| no | id      | name      |
+----+---------+-----------+
|  1 | yjhwang | 황영주     |
+----+---------+-----------+
1 row in set (0.00 sec)


MariaDB [naver_db]> select * from member where name='설기형';
+----+--------+-----------+------+----------+-------------------------------+----------+------+
| no | id     | name      | sex  | post_num | address                       | tel      | age  |
+----+--------+-----------+------+----------+-------------------------------+----------+------+
|  2 | khshul | 설기형     | A    | 607-010  | 부산시 동래구 명륜동               | 764-3784 |   33 |
+----+--------+-----------+------+----------+-------------------------------+----------+------+
1 row in set (0.00 sec)

MariaDB [naver_db]> delete from member where name='설기형';
Query OK, 1 row affected (0.02 sec)

MariaDB [naver_db]> select * from member where name='설기형';
Empty set (0.00 sec)

MariaDB [naver_db]> select * from out_member;
+----+---------+-----------+
| no | id      | name      |
+----+---------+-----------+
|  1 | yjhwang | 황영주     |
|  2 | khshul  | 설기형     |
+----+---------+-----------+
2 rows in set (0.00 sec)

'Linux > SQL' 카테고리의 다른 글

DB 백업하기  (0) 2021.12.08
DBMS 포트 리슨 방법  (0) 2021.12.08
[DBMS] 저장 함수 실습  (0) 2021.12.08
[DBMS] 저장 프로시저 실습  (0) 2021.12.08
[DBMS] 트리거 (Trigger)  (0) 2021.12.08