MySQL - Before Delete Trigger

안녕하세요, 데이터베이스 열정가 여러분! 오늘 우리는 MySQL 트리거의 세계로 흥미로운 여정을 떠납니다. 특히 Before Delete 트리거에 대해 집중적으로 다룰 것입니다. 여러분의 친절한 이웃 컴퓨터 과학 교사로서, 저는 이 주제를 단계별로 안내해드리겠습니다. 그럼 시작해보겠습니다!

MySQL - Before Delete Trigger

MySQL Before Delete Trigger는 무엇인가요?

이제부터 본격적으로 다루기 전에 기본 개념부터 설명해드리겠습니다. 데이터베이스에서 중요한 데이터를 지우기 전에 몇 가지 확인이나 작업을 수행하고 싶다면, 그때 Before Delete 트리거가 유용하게 사용됩니다.

Before Delete 트리거는 DELETE 연산이 테이블에 실행되기 직전 자동으로 발생하는 특별한 종류의 MySQL 트리거입니다. 이 트리거를 통해 데이터가 실제로 테이블에서 제거되기 전에 사용자 정의 작업이나 검증을 수행할 수 있습니다.

Why Use a Before Delete Trigger?

"왜 이걸 사용해야 할까요?"라고 궁금해하실 수도 있습니다. 저는 초보 개발자 시절에 한 번 실수로 백업이나 보호 장치 없이 전체 고객 데이터베이스를 지웠던 경험을 가지고 있습니다. 말할 필요 없이 그것은 악몽이었습니다! 그때 트리거, 특히 Before Delete 트리거의 중요성을 배웠습니다.

다음은 일반적인 사용 사례입니다:

  1. 데이터 검증
  2. 삭제 연산 로깅
  3. 중요 기록의 삭제 방지
  4. 관련 테이블 업데이트

Before Delete Trigger 생성하기

이제 개념을 이해했으므로, 첫 번째 Before Delete 트리거를 생성해보겠습니다. 온라인 서점 데이터베이스의 customers 테이블을 단순한 예제로 사용하겠습니다.

CREATE TABLE customers (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
email VARCHAR(50),
total_orders INT DEFAULT 0
);

CREATE TABLE deleted_customers_log (
id INT,
name VARCHAR(50),
email VARCHAR(50),
deleted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

이제 삭제 전에 고객 정보를 로그에 기록하는 Before Delete 트리거를 생성해보겠습니다:

DELIMITER //

CREATE TRIGGER before_delete_customer
BEFORE DELETE ON customers
FOR EACH ROW
BEGIN
INSERT INTO deleted_customers_log (id, name, email)
VALUES (OLD.id, OLD.name, OLD.email);
END //

DELIMITER ;

이 코드를 분해해보겠습니다:

  1. DELIMITER //: 이는 델리미터를 ;에서 //로 변경하여 트리거 정의 내에서 세미콜론을 사용할 수 있게 합니다.
  2. CREATE TRIGGER before_delete_customer: 트리거의 이름을 지정합니다.
  3. BEFORE DELETE ON customers: 트리거가 언제 및 어떤 테이블에서 발생해야 하는지 지정합니다.
  4. FOR EACH ROW: DELETE 연산에 영향을 받는 각 행에 대해 트리거가 실행되도록 지정합니다.
  5. BEGINEND: 트리거의 작업을 포함합니다.
  6. INSERT INTO deleted_customers_log...: 트리거가 수행하는 실제 작업은 삭제된 고객의 정보를 로그에 기록하는 것입니다.
  7. OLD.id, OLD.name, OLD.email: OLD은 삭제되는 행을 가리키며, 해당 행의 값을 접근할 수 있습니다.

Before Delete Trigger 테스트하기

트리거가 작동하는지 확인해보겠습니다! 먼저 샘플 데이터를 추가해보겠습니다:

INSERT INTO customers (name, email, total_orders) VALUES
('Alice Johnson', '[email protected]', 5),
('Bob Smith', '[email protected]', 3),
('Charlie Brown', '[email protected]', 1);

이제 고객을 삭제해보겠습니다:

DELETE FROM customers WHERE id = 2;

deleted_customers_log 테이블을 확인해보면 다음과 같이 보일 것입니다:

SELECT * FROM deleted_customers_log;

Bob의 정보가 로그에 기록되어 있어야 하며, 트리거가 작동한 것을 확인할 수 있습니다!

고급 Before Delete Trigger 예제

이제 VIP 고객의 삭제를 방지하는 더 복잡한 트리거를 생성해보겠습니다:

DELIMITER //

CREATE TRIGGER prevent_vip_customer_deletion
BEFORE DELETE ON customers
FOR EACH ROW
BEGIN
IF OLD.total_orders > 5 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Cannot delete VIP customer with more than 5 orders';
END IF;
END //

DELIMITER ;

이 트리거는 삭제되는 고객의 total_orders를 확인하고, 5보다 크다면 오류를 발생시켜 삭제를 방지합니다.

이를 테스트해보겠습니다:

DELETE FROM customers WHERE id = 1;

Alice는 5개의 주문이 있으므로 오류 메시지를 받아야 합니다.

클라이언트 프로그램을 사용한 Before Delete Trigger

우리는 직접 SQL을 사용해왔지만, MySQL 클라이언트 프로그램을 사용하여 트리거를 생성하고 관리할 수도 있습니다. 다음은 몇 가지 인기 있는 옵션입니다:

클라이언트 프로그램 설명 예제 사용
MySQL Workbench MySQL GUI 도구 GUI를 사용하여 트리거 생성
phpMyAdmin 웹 기반 MySQL 관리 도구 테이블 뷰의 '트리거' 탭으로 이동
명령 줄 클라이언트 터미널 기반 클라이언트 직접 SQL 명령어 사용
Python MySQLConnector Python 라이브러리 Python 코드를 통해 SQL 명령어 실행

예를 들어, Python과 MySQL Connector를 사용하면 다음과 같습니다:

import mysql.connector

mydb = mysql.connector.connect(
host="localhost",
user="yourusername",
password="yourpassword",
database="yourdatabase"
)

mycursor = mydb.cursor()

trigger_sql = """
CREATE TRIGGER before_delete_customer
BEFORE DELETE ON customers
FOR EACH ROW
BEGIN
INSERT INTO deleted_customers_log (id, name, email)
VALUES (OLD.id, OLD.name, OLD.email);
END
"""

mycursor.execute(trigger_sql)

이 Python 스크립트는 MySQL 데이터베이스에 연결하고 이전에 만든 트리거를 생성합니다.

결론

축하합니다! 여러분은 MySQL Before Delete 트리거의 세계로 첫 걸음을 뗐습니다. 우리는 트리거가 무엇인지, 왜 유용한지, 어떻게 생성하는지, 그리고 고급 예제를 살펴보았습니다. 트리거는 데이터 무결성을 유지하고 자동으로 복잡한 작업을 수행하는 강력한 도구입니다.

MySQL 여정을 계속하면서 트리거를 실험해보세요. 다른 MySQL 기능과 조합해보고, 곧 강력하고 효율적인 데이터베이스 시스템을 만들 수 있을 것입니다. 행복한 코딩을 기원하며, 데이터베이스가 항상 잘 트리거되기를 바랍니다!

Credits: Image by storyset