일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- mysql
- network
- JPA
- PostgreSQL
- oracle
- group by
- MongoDB
- spring
- rsync
- mssql
- 차이점
- analytics4
- 명령어
- docker
- 자바
- IntelliJ
- Linux
- DBMS
- 티스토리챌린지
- git
- 트랜잭션
- Python
- SQL
- API
- top
- 오블완
- MariaDB
- java
- 리눅스
- Javascript
- Today
- Total
hanker
SQL - 트리거(Trigger)란 무엇인가? 본문
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 트러기는 데이터 무결성 유지, 자동화된 데이터 관리, 로깅 등 다양한 목적으로 사용된다.
하지만, 성능 문제와 복잡성을 고려해 적절히 설계하고 관리하는 것이 중요하다.
'DATABASE > SQL' 카테고리의 다른 글
SQL - 데이터 백업과 복구 방법 (0) | 2025.01.15 |
---|---|
SQL - 저장 프로시저(Stored Procedure, SP)란 무엇인가? 프로시저의 활용 방법 (0) | 2025.01.13 |
SQL - 각 데이터베이스 별 버전 확인 방법 ( MySQL / MSSQL / PostgreSQL / Oracle / MariaDB / MongoDB) (0) | 2025.01.11 |
SQL - 테이블 파티셔닝(Table Partitioning) (0) | 2025.01.10 |
SQL - 뷰(View)를 알아보자 (뷰 테이블, View Table) (0) | 2025.01.09 |