MySQL 트리거를 사용한 자동화

MySQLBeginner
지금 연습하기

소개

이 랩에서는 MySQL 트리거를 사용하여 데이터베이스 작업을 자동화하는 방법을 배웁니다. 트리거는 INSERT, UPDATE 또는 DELETE 작업과 같은 테이블의 특정 이벤트에 응답하여 자동으로 실행되는 저장 프로그램입니다.

항목 정보를 저장할 products 테이블과 변경 사항을 감사할 product_logs 테이블을 생성합니다. 그런 다음 products 테이블에 새 제품이 삽입될 때마다 product_logs에 로그 항목을 자동으로 추가하는 트리거를 구현합니다. 이 랩에서는 트리거를 테스트, 업데이트 및 제거하는 방법도 안내합니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 81%입니다.학습자들로부터 89%의 긍정적인 리뷰율을 받았습니다.

데이터베이스 및 테이블 설정

트리거를 생성하기 전에 데이터베이스와 필요한 테이블이 있어야 합니다. 이 단계에서는 mydatabase라는 데이터베이스와 제품 데이터를 저장할 products 테이블, 감사 로그를 저장할 product_logs 테이블을 생성합니다.

먼저 바탕 화면에서 터미널을 엽니다.

root 사용자로 MySQL 서버에 연결합니다. 이 환경은 랩 환경이므로 비밀번호 없이 sudo를 사용하여 연결할 수 있습니다.

sudo mysql -u root

연결되면 MySQL 프롬프트 (mysql>) 가 표시됩니다.

이제 mydatabase 데이터베이스를 생성하고 전환합니다. IF NOT EXISTS 절은 데이터베이스가 이미 존재하는 경우 오류를 방지합니다.

CREATE DATABASE IF NOT EXISTS mydatabase;
USE mydatabase;

다음으로 products 테이블을 생성합니다. 이 테이블은 각 제품의 ID, 이름 및 가격을 저장합니다.

CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    price DECIMAL(10, 2) NOT NULL
);

이제 product_logs 테이블을 생성합니다. 이 테이블은 추가된 모든 새 제품의 로그를 저장합니다.

CREATE TABLE product_logs (
    log_id INT AUTO_INCREMENT PRIMARY KEY,
    product_id INT,
    action_description VARCHAR(255),
    log_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

다음 명령을 실행하여 두 테이블이 모두 성공적으로 생성되었는지 확인할 수 있습니다.

SHOW TABLES;

출력에서 productsproduct_logs 테이블이 나열된 것을 볼 수 있습니다.

+--------------------+
| Tables_in_mydatabase |
+--------------------+
| product_logs       |
| products           |
+--------------------+
2 rows in set (0.00 sec)

이제 데이터베이스와 테이블이 준비되었으므로 다음 단계로 진행할 수 있습니다.

트리거 생성 및 테스트

테이블이 준비되었으므로 이제 트리거를 생성할 수 있습니다. 이 트리거는 products 테이블에 새 행이 삽입된 후 활성화되며 product_logs 테이블에 해당 항목을 추가합니다.

데이터베이스로 전환합니다.

USE mydatabase;

이제 트리거를 생성합니다. DELIMITER 명령은 표준 구분 기호 (;) 를 //로 변경하는 데 사용되므로 트리거 본문 내부의 세미콜론이 CREATE TRIGGER 문의 끝으로 해석되지 않습니다.

DELIMITER //

CREATE TRIGGER products_after_insert
AFTER INSERT ON products
FOR EACH ROW
BEGIN
    INSERT INTO product_logs (product_id, action_description)
    VALUES (NEW.id, CONCAT('New product added: ', NEW.name));
END//

DELIMITER ;

이 문장을 자세히 살펴보겠습니다.

  • CREATE TRIGGER products_after_insert: products_after_insert라는 새 트리거를 정의합니다.
  • AFTER INSERT ON products: products 테이블에 대한 INSERT 이벤트 후에 트리거가 실행됨을 지정합니다.
  • FOR EACH ROW: 삽입된 각 행에 대해 트리거의 로직이 실행됨을 나타냅니다.
  • BEGIN...END: 트리거의 SQL 문을 포함합니다.
  • NEW.id, NEW.name: NEW 키워드는 방금 삽입된 행을 참조합니다. NEW.id는 새 제품의 id이고 NEW.name은 해당 이름입니다.

이제 새 제품을 삽입하여 트리거를 테스트해 보겠습니다.

INSERT INTO products (name, price) VALUES ('Laptop', 1200.00);

INSERT 작업으로 트리거가 활성화되었어야 합니다. 이를 확인하려면 product_logs 테이블의 내용을 확인하십시오.

SELECT * FROM product_logs;

product_logs 테이블에 트리거에 의해 자동으로 생성된 레코드가 하나 있어야 합니다. 출력은 다음과 유사하게 표시됩니다 (log_idlog_time은 달라질 수 있습니다).

+--------+------------+-----------------------------+---------------------+
| log_id | product_id | action_description          | log_time            |
+--------+------------+-----------------------------+---------------------+
|      1 |          1 | New product added: Laptop   | 2024-05-27 10:30:00 |
+--------+------------+-----------------------------+---------------------+
1 row in set (0.00 sec)

이는 트리거가 올바르게 작동하고 있음을 확인합니다.

트리거 로직 업데이트

요구 사항은 시간이 지남에 따라 변경될 수 있습니다. 예를 들어, 더 많은 세부 정보를 기록하고 싶을 수 있습니다. 이 단계에서는 트리거를 업데이트하여 새 제품의 가격도 기록하도록 하겠습니다.

MySQL 에서는 트리거를 직접 수정할 수 없습니다. 기존 트리거를 먼저 삭제한 다음 업데이트된 로직으로 새 트리거를 생성해야 합니다.

데이터베이스로 전환합니다.

USE mydatabase;

먼저 기존 트리거를 삭제합니다. IF EXISTS 절은 트리거가 이미 제거된 경우 오류를 방지합니다.

DROP TRIGGER IF EXISTS products_after_insert;

이제 업데이트된 로직으로 트리거를 다시 생성합니다. 이 새 버전은 action_description에 제품 가격을 포함합니다.

DELIMITER //

CREATE TRIGGER products_after_insert
AFTER INSERT ON products
FOR EACH ROW
BEGIN
    INSERT INTO product_logs (product_id, action_description)
    VALUES (NEW.id, CONCAT('New product added: ', NEW.name, ' with price ', NEW.price));
END//

DELIMITER ;

업데이트된 트리거를 테스트하려면 다른 제품을 삽입합니다.

INSERT INTO products (name, price) VALUES ('Mouse', 25.00);

이제 product_logs 테이블을 쿼리하여 모든 로그 항목을 확인합니다.

SELECT * FROM product_logs;

출력에는 이제 두 개의 로그 항목이 표시되어야 합니다. 'Mouse'에 대한 두 번째 항목은 설명에 가격이 포함되어 업데이트된 트리거가 작동하고 있음을 확인해야 합니다.

+--------+------------+----------------------------------------------+---------------------+
| log_id | product_id | action_description                           | log_time            |
+--------+------------+----------------------------------------------+---------------------+
|      1 |          1 | New product added: Laptop                    | 2024-05-27 10:30:00 |
|      2 |          2 | New product added: Mouse with price 25.00    | 2024-05-27 10:35:00 |
+--------+------------+----------------------------------------------+---------------------+
2 rows in set (0.00 sec)

트리거를 성공적으로 업데이트했습니다.

트리거 삭제

더 이상 필요하지 않은 트리거는 불필요한 처리와 잠재적인 유지보수 문제를 피하기 위해 제거해야 합니다. 마지막 단계에서는 products_after_insert 트리거를 삭제합니다.

데이터베이스로 전환합니다.

USE mydatabase;

트리거를 삭제하려면 DROP TRIGGER 문을 사용합니다.

DROP TRIGGER IF EXISTS products_after_insert;

SHOW TRIGGERS 명령을 실행하여 트리거가 제거되었는지 확인할 수 있습니다.

SHOW TRIGGERS;

이 명령은 빈 세트를 반환하여 트리거가 제거되었음을 확인해야 합니다.

Empty set (0.00 sec)

확실하게 하기 위해 제품을 하나 더 삽입합니다.

INSERT INTO products (name, price) VALUES ('Keyboard', 75.00);

이제 product_logs 테이블을 확인합니다.

SELECT * FROM product_logs;

테이블에는 여전히 처음 두 개의 로그 항목만 포함되어야 합니다. 'Keyboard' 제품은 삽입 전에 트리거가 삭제되었기 때문에 로그 항목이 없어야 합니다.

+--------+------------+----------------------------------------------+---------------------+
| log_id | product_id | action_description                           | log_time            |
+--------+------------+----------------------------------------------+---------------------+
|      1 |          1 | New product added: Laptop                    | 2024-05-27 10:30:00 |
|      2 |          2 | New product added: Mouse with price 25.00    | 2024-05-27 10:35:00 |
+--------+------------+----------------------------------------------+---------------------+
2 rows in set (0.00 sec)

이는 트리거가 성공적으로 제거되었음을 확인합니다. 이제 MySQL 셸을 종료할 수 있습니다.

exit;

요약

이 실습에서는 자동화를 위한 MySQL 트리거 사용의 기본 사항을 배웠습니다. 데이터베이스 환경을 성공적으로 설정하고, 테이블을 생성했으며, 데이터 삽입 이벤트를 기록하는 트리거를 구현했습니다. 또한 트리거의 생성, 테스트, 업데이트 및 삭제를 포함한 전체 수명 주기를 실습했습니다.

이러한 기술은 감사 추적 생성, 복잡한 비즈니스 규칙 적용, 데이터 무결성 자동 유지와 같은 작업에 필수적입니다.