MySQL - Before Delete Trigger
안녕하세요, 데이터베이스 열정가 여러분! 오늘 우리는 MySQL 트리거의 세계로 흥미로운 여정을 떠납니다. 특히 Before Delete 트리거에 대해 집중적으로 다룰 것입니다. 여러분의 친절한 이웃 컴퓨터 과학 교사로서, 저는 이 주제를 단계별로 안내해드리겠습니다. 그럼 시작해보겠습니다!
MySQL Before Delete Trigger는 무엇인가요?
이제부터 본격적으로 다루기 전에 기본 개념부터 설명해드리겠습니다. 데이터베이스에서 중요한 데이터를 지우기 전에 몇 가지 확인이나 작업을 수행하고 싶다면, 그때 Before Delete 트리거가 유용하게 사용됩니다.
Before Delete 트리거는 DELETE 연산이 테이블에 실행되기 직전 자동으로 발생하는 특별한 종류의 MySQL 트리거입니다. 이 트리거를 통해 데이터가 실제로 테이블에서 제거되기 전에 사용자 정의 작업이나 검증을 수행할 수 있습니다.
Why Use a Before Delete Trigger?
"왜 이걸 사용해야 할까요?"라고 궁금해하실 수도 있습니다. 저는 초보 개발자 시절에 한 번 실수로 백업이나 보호 장치 없이 전체 고객 데이터베이스를 지웠던 경험을 가지고 있습니다. 말할 필요 없이 그것은 악몽이었습니다! 그때 트리거, 특히 Before Delete 트리거의 중요성을 배웠습니다.
다음은 일반적인 사용 사례입니다:
- 데이터 검증
- 삭제 연산 로깅
- 중요 기록의 삭제 방지
- 관련 테이블 업데이트
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 ;
이 코드를 분해해보겠습니다:
-
DELIMITER //
: 이는 델리미터를;
에서//
로 변경하여 트리거 정의 내에서 세미콜론을 사용할 수 있게 합니다. -
CREATE TRIGGER before_delete_customer
: 트리거의 이름을 지정합니다. -
BEFORE DELETE ON customers
: 트리거가 언제 및 어떤 테이블에서 발생해야 하는지 지정합니다. -
FOR EACH ROW
: DELETE 연산에 영향을 받는 각 행에 대해 트리거가 실행되도록 지정합니다. -
BEGIN
과END
: 트리거의 작업을 포함합니다. -
INSERT INTO deleted_customers_log...
: 트리거가 수행하는 실제 작업은 삭제된 고객의 정보를 로그에 기록하는 것입니다. -
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