hanker

SQL - 트리거(Trigger)란 무엇인가? 본문

DATABASE/SQL

SQL - 트리거(Trigger)란 무엇인가?

hanker 2025. 1. 12. 01:34
반응형

SQL에서 트리거(Trigger)는 특정 이벤트(INSERT, UPDATE, DELETE)가 발생할 때 자동으로 실행되는 특별한 유형의 저장 프로시저이다.

트리거는 데이터 무결성을 유지하고, 데이터베이스 작업을 자동화하는 데 유용하다.

 

이번 글에서는 트리거의 정의, 종류, 생성 방법, 그리고 실전 활용 방법을 알아보자!

 


1. 트리거(Trigger)란?

 

트리거는 테이블에 정의된 이벤트 처리 메커니즘이다.

 

특징으로는

- 지정된 이벤트 발생 시 자동으로 실행된다.

- 테이블 수준에서 동작하며, 특정 작업을 자동화한다.

- 데이터 무결성 유지, 로깅, 또는 복잡한 비즈니스 로직 구현에 사용된다.

 


2. 트리거의 종류

 

트리거는 이벤트와 실행 시점에 따라 구분된다.

종류 설명
BEFORE 지정된 작업(INSERT, UPDATE, DELETE)이 실행되기 전에 트리거가 실행
AFTER 지정된 작업이 실행된 후 트리거가 실행
INSTEAD OF 지정된 작업을 대체하여 실행된다. 주로 뷰(View)에 사용

 


3. 트리거 생성 방법 (기본 문법)

 

트리거 생성 방법에 대해서 알아보자

CREATE TRIGGER trigger_name
{BEFORE | AFTER | INSTEAD OF} {INSERT | UPDATE | DELETE}
ON table_name
FOR EACH ROW
BEGIN
    -- 트리거 로직 작성
END;

{} 중괄호에 있는 옵션 중 알맞는 옵션을 선택하여 트리거의 기능을 정의한다.

 


4. 트리거 활용 예

 

4-1. 로깅 (Logging)

 

- 테이블 변경 내용 기록

CREATE TABLE employee_logs (
    log_id INT AUTO_INCREMENT PRIMARY KEY,
    employee_id INT,
    action VARCHAR(50),
    change_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TRIGGER log_employee_changes
AFTER UPDATE ON employees
FOR EACH ROW
BEGIN
    INSERT INTO employee_logs (employee_id, action)
    VALUES (NEW.employee_id, 'Updated');
END;

기대 : employee 테이블의 데이터가 수정될 때마다 employee_logs 테이블에 변경 내용이 기록된다.

 

 

4-2. 데이터 무결성 유지

 

- 음수 값 방지

CREATE TRIGGER prevent_negative_salary
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;

기대 : 급여(salary)가 음수인 데이터를 INSERT하려 하면 오류 메시지가 출력된다.

 

 

4-3. 자동 데이터 업데이트

 

- 주문 상태 자동 업데이트

CREATE TRIGGER update_order_status
AFTER INSERT ON payments
FOR EACH ROW
BEGIN
    UPDATE orders
    SET status = 'Paid'
    WHERE order_id = NEW.order_id;
END;

기대 : 결제(payments)가 처리되면 자동으로 주문(orders) 상태가 업데이트 된다.

 

 

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

 

- 총 매출 자동 계산

CREATE TRIGGER update_total_sales
AFTER INSERT ON sales
FOR EACH ROW
BEGIN
    UPDATE sales_summary
    SET total_sales = total_sales + NEW.amount
    WHERE product_id = NEW.product_id;
END;

기대 : 새로운 판매 데이터가 추가되면, 총 매출 요약 테이블이 자동으로 갱신된다.

 


5. 트리거 관리

 

5-1. 트리거 조회

# MySQL
SHOW TRIGGERS;

# PostgreSQL
SELECT tgname, tgtype::regtype, tgrelid::regclass
FROM pg_trigger
WHERE NOT tgisinternal;

 

 

5-2. 트리거 삭제

DROP TRIGGER trigger_name ON table_name;

 


6. 트리거 사용 시 주의사항

 

6-1. 성능 문제

- 트리거는 자동으로 실행되므로, 과도한 로직은 성능 저하를 초래할 수 있다.

 

6-2. 디버깅 어려움

- 트리거가 자동 실행되기 때문에, 디버깅이 복잡할 수 있다. 로깅을 활용해서 추적해야한다.

 

6-3. 순환 참조 방지

- 트리거가 다시 트리거를 호출하는 순환 참조가 발생하지 않도록 설계해야한다.

 

6-4. 데이터베이스별 차이

- 트리거 문법은 데이터베이스에 따라 다를 수 있으니, 사용하는 DBMS 문서를 확인해야한다.

 


SQL 트러기는 데이터 무결성 유지, 자동화된 데이터 관리, 로깅 등 다양한 목적으로 사용된다.

하지만, 성능 문제와 복잡성을 고려해 적절히 설계하고 관리하는 것이 중요하다.

반응형