트리거 : TRIGGER 방아쇠
SQL의 트리거(Trigger)는 특정 이벤트가 발생할 때 자동으로 실행되는 일련의 SQL 문이다. 예들 들어, 회원정보가 추가되면 로그에 기록을 남기는 작업을 해야 할때, 게임에서 몬스터를 죽이면 해당 로그가 매번 기록되는 상황들이 있다. 트리거는 주로 데이터 무결성을 유지하고, 특정 작업을 자동화하는 데 사용된다.
1. 트리거의 종류
- BEFORE 트리거: 데이터가 삽입, 수정, 삭제되기 전에 실행된다. 이 트리거는 작업을 수행하기 전에 데이터를 검증하거나 변형하는 데 유용하다.
- AFTER 트리거: 데이터가 삽입, 수정, 삭제된 후에 실행된다. 주로 로그 기록이나 다른 테이블에 데이터 복사 등의 작업에 사용된다.
- INSTEAD OF 트리거: 뷰에 대해 사용되며, 뷰에 대한 INSERT, UPDATE, DELETE 작업이 발생할 때 대신 실행된다. 이를 통해 기본 테이블에 대한 조작을 정의할 수 있다.
2. 트리거의 용도
- 데이터 무결성 유지: 특정 조건을 검증하여 데이터 일관성을 보장한다. 예를 들어, 특정 열의 값이 범위를 벗어나지 않도록 할 수 있다.
- 자동화된 작업 수행: 특정 이벤트가 발생했을 때 자동으로 로그를 기록하거나 다른 테이블에 데이터를 복사하는 등의 작업을 수행한다.
- 비즈니스 규칙 구현: 데이터베이스의 비즈니스 규칙을 적용하여, 특정 조건을 만족하지 않는 데이터의 삽입이나 수정을 방지할 수 있다.
3. 트리거의 구조
CREATE TRIGGER trigger_name
BEFORE/AFTER INSERT/UPDATE/DELETE ON table_name
FOR EACH ROW
BEGIN
-- 실행할 SQL 문
END;
4. 예시
직원 테이블에 새로운 직원이 추가될 때마다 로그 테이블에 기록하는 트리거
CREATE TRIGGER log_new_employee
AFTER INSERT ON employees
FOR EACH ROW
BEGIN
INSERT INTO employee_log (employee_id, action, log_time)
VALUES (NEW.id, 'INSERT', NOW());
END;
5. 주의사항
- 트리거가 자주 실행되면 성능에 영향을 줄 수 있어 필수적인 경우에만 사용하는 것이 좋음.
- 트리거가 여러 개 정의되면 데이터베이스의 동작이 복잡해질 수 있으므로, 관리와 디버깅이 어려워질 수 있음.
- 로직 추적이 쉽지 않음.
∴실무에서 트리거가 있는지 먼저 파악할것
참고:https://docs.oracle.com/database/121/TDDDG/tdddg_triggers.htm#TDDDG52000
트랜잭션(TRANSACTION)
데이터베이스에서의 일련의 작업을 하나의 논리적 단위로 묶는 개념
송금 로직
1)내 계좌 금액 마이너스(-)
UPDATE TABLE1
SET 내계좌=내계좌-100;
↓
2)상대계좌 금액 플러스(+)
UPDATE TABLE1
SET 상대계좌=상대계좌+100;
두 계좌간의 송금작업을 하나의 트랜잭션으로 묶어주면
COMMIT을 만나기 전에는 DB에 저장되지 않으므로
송금실패시 DATA 가 잘못되는 일이 없다.
START TRANSACTION;
UPDATE table1 SET 내계좌 = 내계좌 - 100 WHERE account_id = 1;
UPDATE table1 SET 상대계좌 = 상대계좌 + 100 WHERE account_id = 2;
COMMIT; -- 모든 작업이 성공적으로 완료되면 커밋
ORACLE기능: 오류사항이 있거나 완벽히 수행되지 않으면 모두 실행될때까지 ROLLBACK해서 계속 수행한다.
'SQL' 카테고리의 다른 글
[sql]Procedure(프로시저) (3) | 2024.09.09 |
---|---|
[SQL] DB LOCK (0) | 2024.09.09 |
[SQL]VIEW - 가상의 테이블 (0) | 2024.09.09 |
[SQL]PIVOT(행을 열로 전환) (4) | 2024.09.06 |
[sql]제약조건, 데이터 삽입∙수정∙삭제 (2) | 2024.09.05 |