본문 바로가기
  • alert("Rocomi의 개발공부 블로그")
DATABASE 공부

Trigger

by Rocomi 2024. 8. 2.

SQL 트리거(Trigger)는 데이터베이스 테이블에 대한 특정 이벤트가 발생할 때 자동으로 실행되는 저장 프로시저입니다. 트리거는 데이터 무결성을 유지하고, 특정 조건이 발생할 때 자동으로 실행되어야 하는 비즈니스 로직을 구현하는 데 유용합니다. 트리거는 데이터베이스에서 발생하는 INSERT, UPDATE, DELETE와 같은 데이터 조작 이벤트에 대해 응답할 수 있습니다.

트리거의 주요 구성 요소

  1. 이벤트: 트리거를 실행시키는 데이터베이스 작업입니다. 주로 INSERT, UPDATE, DELETE 작업이 사용됩니다.
  2. 조건: 트리거가 실행되기 전에 검사되는 조건입니다. 조건이 참인 경우 트리거가 실행됩니다.
  3. 행 수준 또는 문 수준: 트리거가 개별 행에 대해 실행될지(행 수준) 아니면 SQL 문에 대해 한 번만 실행될지(문 수준)를 지정합니다.
  4. 트리거 본문: 트리거가 실행될 때 수행할 작업을 정의하는 코드 블록입니다.

트리거의 유형

  1. 행 수준 트리거 (Row-Level Trigger): 각 행에 대해 트리거가 실행됩니다.
  2. 문 수준 트리거 (Statement-Level Trigger): 트리거를 발생시키는 SQL 문에 대해 한 번만 트리거가 실행됩니다.

BEFORE와 AFTER 트리거

  • BEFORE 트리거: 데이터가 데이터베이스에 실제로 반영되기 전에 실행됩니다. 입력 데이터의 유효성을 검사하고 수정할 수 있습니다.
  • AFTER 트리거: 데이터가 데이터베이스에 반영된 후에 실행됩니다. 데이터 변경 후의 후속 작업을 수행하는 데 사용됩니다.

트리거 사용 예제

1. 기본 트리거 생성

다음은 MySQL에서의 트리거 생성 예제입니다. 이 예제는 직원 테이블에 새로운 직원이 추가될 때마다 로그 테이블에 기록하는 트리거를 생성합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-- 로그 테이블 생성
CREATE TABLE EmployeeLog (
    LogID INT AUTO_INCREMENT PRIMARY KEY,
    EmployeeID INT,
    Action VARCHAR(50),
    ActionTime DATETIME
);
 
-- 트리거 생성
CREATE TRIGGER before_employee_insert
BEFORE INSERT ON Employees
FOR EACH ROW
BEGIN
    INSERT INTO EmployeeLog (EmployeeID, Action, ActionTime)
    VALUES (NEW.EmployeeID, 'INSERT', NOW());
END;
 
cs

2. 트리거 수정

트리거는 직접 수정할 수 없기 때문에 기존 트리거를 삭제한 후 다시 생성해야 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- 트리거 삭제
DROP TRIGGER IF EXISTS before_employee_insert;
 
-- 수정된 트리거 생성
CREATE TRIGGER before_employee_insert
BEFORE INSERT ON Employees
FOR EACH ROW
BEGIN
    INSERT INTO EmployeeLog (EmployeeID, Action, ActionTime)
    VALUES (NEW.EmployeeID, 'INSERT', NOW());
    -- 추가 로직
    SET NEW.Salary = NEW.Salary * 1.1-- 새로 입력된 급여에 10% 인상
END;
 
cs

3. 트리거 삭제

트리거를 삭제하는 방법입니다.

1
2
DROP TRIGGER IF EXISTS before_employee_insert;
 
cs

트리거의 활용 예제

1. 데이터 유효성 검사

BEFORE 트리거를 사용하여 입력되는 데이터의 유효성을 검사할 수 있습니다.

1
2
3
4
5
6
7
8
9
CREATE TRIGGER before_employee_insert
BEFORE INSERT ON Employees
FOR EACH ROW
BEGIN
    IF NEW.Salary < 0 THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Salary cannot be negative';
    END IF;
END;
 
cs

2. 감사 및 로깅

데이터베이스에서 발생하는 변경 사항을 기록하여 감사 로그를 유지할 수 있습니다.

1
2
3
4
5
6
7
8
CREATE TRIGGER after_employee_update
AFTER UPDATE ON Employees
FOR EACH ROW
BEGIN
    INSERT INTO EmployeeLog (EmployeeID, Action, ActionTime)
    VALUES (OLD.EmployeeID, 'UPDATE', NOW());
END;
 
cs

3. 복잡한 비즈니스 로직 구현

트리거를 사용하여 데이터베이스 레벨에서 복잡한 비즈니스 로직을 구현할 수 있습니다. 예를 들어, 재고 관리 시스템에서 상품의 재고가 0이 되면 자동으로 재고를 주문하는 트리거를 만들 수 있습니다.

1
2
3
4
5
6
7
8
9
CREATE TRIGGER after_inventory_update
AFTER UPDATE ON Inventory
FOR EACH ROW
BEGIN
    IF NEW.Quantity = 0 THEN
        CALL OrderMoreInventory(NEW.ProductID);
    END IF;
END;
 
cs

주의사항

  • 성능: 트리거는 자동으로 실행되기 때문에 성능에 영향을 줄 수 있습니다. 복잡한 트리거는 데이터베이스 작업을 느리게 만들 수 있습니다.
  • 디버깅: 트리거의 디버깅은 어렵습니다. 로그 테이블을 사용하여 트리거가 제대로 작동하는지 확인할 수 있습니다.
  • 트랜잭션: 트리거는 트랜잭션의 일부로 실행됩니다. 트리거 내에서 발생한 오류는 전체 트랜잭션을 롤백시킬 수 있습니다.

결론

SQL 트리거는 데이터베이스 무결성을 유지하고 자동으로 비즈니스 로직을 실행하는 강력한 도구입니다. 트리거를 사용하면 데이터 입력, 수정, 삭제 시 자동으로 특정 작업을 수행할 수 있어 개발자와 데이터베이스 관리자의 작업을 간소화할 수 있습니다. 그러나 성능에 미치는 영향과 디버깅의 어려움을 고려하여 적절히 사용해야 합니다.

'DATABASE 공부' 카테고리의 다른 글

SQL의 DATA LANGUAGE  (0) 2024.08.02
JDBC의 Properties사용  (0) 2024.08.02
Template  (0) 2024.08.01
PL/SQL  (0) 2024.07.31
관계형 데이터베이스  (0) 2024.07.31