한국어 번역

MySQL - 업데이트 후 트리거

MySQL 업데이트 후 트리거 소개

안녕하세요, 데이터베이스 열정가 여러분! 오늘 우리는 MySQL의 흥미로운 세계, 즉 MySQL 업데이트 후 트리거의 세계로 뛰어들어 보겠습니다. 초보자이시라도 걱정 마세요 - 저는 여러분의 친절한 안내자가 되어 이 여정을 함께할 것입니다. 수년 동안 수많은 학생들을 가르쳐온 경험을 바탕으로 여러분을 안내하겠습니다. 기본 개념부터 시작해 보겠습니다!

MySQL - After Update Trigger

트리거는 무엇인가요?

당신의 데이터베이스에서 특정 사건이 발생할 때마다 마법의 알림이 울리는 상상을 해보세요. 그것이 트리거입니다! 트리거는 데이터베이스에서 특정 이벤트가 발생할 때 자동으로 실행되는 특별한 종류의 저장 프로그램입니다.

업데이트 후 트리거는 무엇인가요?

업데이트 후 트리거는 UPDATE 연산이 수행된 후 발생하는 특정 종류의 트리거입니다. 데이터를 변경한 후 즉시 행동을 취하는 주의 깊은 비서와 같은 것입니다.

첫 번째 업데이트 후 트리거 생성

이제 손을 불끈 잡고 우리의 첫 번째 업데이트 후 트리거를 생성해 보겠습니다! 간단한 예제로 시작해 보겠습니다.

실험장 설정

먼저 작업할 간단한 테이블을 생성해 보겠습니다:

CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50),
salary DECIMAL(10, 2),
last_updated TIMESTAMP
);

이 테이블은 우리 직원들의 정보를 관리합니다. 이제 직원의 급여가 변경될 때 자동으로 'last_updated' 열을 업데이트하는 업데이트 후 트리거를 추가해 보겠습니다.

트리거 생성

트리거를 생성하는 방법은 다음과 같습니다:

DELIMITER //
CREATE TRIGGER update_employee_timestamp
AFTER UPDATE ON employees
FOR EACH ROW
BEGIN
IF OLD.salary != NEW.salary THEN
SET NEW.last_updated = CURRENT_TIMESTAMP;
END IF;
END //
DELIMITER ;

이를 설명해 보겠습니다:

  1. DELIMITER //: 이는 일시적으로 델리미터를 변경하여 트리거 정의 내에서 세미콜론을 사용할 수 있게 합니다.
  2. CREATE TRIGGER update_employee_timestamp: 우리는 트리거를 'update_employee_timestamp'로 이름지었습니다.
  3. AFTER UPDATE ON employees: 이 트리거는 'employees' 테이블에 대한 UPDATE 연산 후에 발생합니다.
  4. FOR EACH ROW: 트리거는 UPDATE에 영향을 받은 각 행에 대해 발생합니다.
  5. IF OLD.salary != NEW.salary THEN: 급여가 변경되었는지 확인합니다.
  6. SET NEW.last_updated = CURRENT_TIMESTAMP: 급여가 변경되면 'last_updated' 열을 현재 시간으로 설정합니다.
  7. DELIMITER ;: 델리미터를 원래의 세미콜론으로 되돌립니다.

트리거 테스트

트리거를 작동시켜 보겠습니다:

INSERT INTO employees (id, name, salary) VALUES (1, 'John Doe', 50000);
UPDATE employees SET salary = 55000 WHERE id = 1;
SELECT * FROM employees;

이 명령어를 실행한 후, 'last_updated' 열이 자동으로 현재 시간으로 채워졌는지 확인할 수 있습니다.

고급 업데이트 후 트리거 기술

기본 개념을 이해했으므로, 더 고급적인 기술을 탐구해 보겠습니다.

변경 로그 생성

업데이트 후 트리거의 일반적인 사용 사례 중 하나는 변경 사항을 로그하는 것입니다. 먼저 급여 변경 사항을 로그할 새로운 테이블을 생성해 보겠습니다:

CREATE TABLE salary_changes (
id INT AUTO_INCREMENT PRIMARY KEY,
employee_id INT,
old_salary DECIMAL(10, 2),
new_salary DECIMAL(10, 2),
change_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

이제 트리거를 수정하여 변경 사항을 로그합니다:

DELIMITER //
CREATE TRIGGER log_salary_changes
AFTER UPDATE ON employees
FOR EACH ROW
BEGIN
IF OLD.salary != NEW.salary THEN
INSERT INTO salary_changes (employee_id, old_salary, new_salary)
VALUES (NEW.id, OLD.salary, NEW.salary);
END IF;
END //
DELIMITER ;

이 트리거는 직원의 급여가 업데이트될 때마다 'salary_changes' 테이블에 새로운 항목을 추가합니다.

조건부 논리 사용

트리거는 더 복잡한 조건부 논리를 포함할 수 있습니다. 예를 들어, 급여가 줄지 않도록 방지하고 싶다면 다음과 같이 할 수 있습니다:

DELIMITER //
CREATE TRIGGER prevent_salary_decrease
BEFORE UPDATE ON employees
FOR EACH ROW
BEGIN
IF NEW.salary < OLD.salary THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Salary cannot be decreased';
END IF;
END //
DELIMITER ;

이 트리거는 누군가가 직원의 급여를 낮추려고 할 때 오류 메시지를 발생시킵니다.

클라이언트 프로그램을 사용한 트리거 관리

우리는 직접 MySQL에서 트리거를 생성하는 것에 집중했지만, 클라이언트 프로그램을 통해 트리거를 관리할 수도 있습니다. 많은 데이터베이스 관리 도구와 프로그래밍 언어는 MySQL 트리거를 작업할 수 있는 인터페이스를 제공합니다.

PHP를 사용한 트리거 생성

다음은 PHP를 사용하여 트리거를 생성하는 예제입니다:

<?php
$servername = "localhost";
$username = "your_username";
$password = "your_password";
$dbname = "your_database";

// Connection setup
$conn = new mysqli($servername, $username, $password, $dbname);

// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}

// SQL to create trigger
$sql = "
CREATE TRIGGER update_employee_timestamp
AFTER UPDATE ON employees
FOR EACH ROW
BEGIN
IF OLD.salary != NEW.salary THEN
SET NEW.last_updated = CURRENT_TIMESTAMP;
END IF;
END
";

// Execute query
if ($conn->multi_query($sql) === TRUE) {
echo "Trigger created successfully";
} else {
echo "Error creating trigger: " . $conn->error;
}

$conn->close();
?>

이 PHP 스크립트는 MySQL 데이터베이스에 연결하고, 이전에 생성한 'update_employee_timestamp' 트리거를 생성합니다.

결론

이제 여러분은 MySQL의 업데이트 후 트리거의 세계를 여행한 것입니다. 기본 개념에서 고급 기술까지! 트리거는 강력한 도구이지만, 신중하게 사용해야 합니다. 과도한 사용은 성능 문제를 유발할 수 있습니다.

어떤 프로그래밍 개념이든, 트리거를 마스터하려면 연습이 중요합니다. 다양한 시나리오를 실험하고, 트리거가 데이터베이스 작업을 더 지능적으로 만드는 방법을 배워보세요. 행복한 트리거 사용을 기원합니다!

Credits: Image by storyset