트리거(Trigger) 문법 정리

알비레오·2025년 5월 23일

DB

목록 보기
12/15

기본 문법

기본문법

CREATE [OR REPLACE] TRIGGER 트리거명
    [BEFORE | AFTER] [INSERT | UPDATE | DELETE] ON 테이블명
    [FOR EACH ROW]
    [WHEN 조건식]
BEGIN
    -- 트리거 실행 코드
END;
  • BEFORE/AFTER: 이벤트 전 또는 후에 실행
  • INSERT/UPDATE/DELETE: 작동할 이벤트 지정
  • FOR EACH ROW: 각 행별로 트리거 실행
  • OLD/NEW 키워드: 변경 전/후의 데이터에 접근

DBMS별 문법

Oracle 트리거
PL/SQL 블록 내에서 변수 선언 및 트랜잭션 로직을 작성

CREATE OR REPLACE TRIGGER trg_deptcopy
AFTER INSERT OR DELETE OR UPDATE ON dept
FOR EACH ROW
BEGIN
    IF INSERTING THEN
        INSERT INTO dept_copy(deptno, dname, loc)
        VALUES (:NEW.deptno, :NEW.dname, :NEW.loc);
    ELSIF UPDATING THEN
        UPDATE dept_copy
        SET dname = :NEW.dname, loc = :NEW.loc
        WHERE deptno = :OLD.deptno;
    ELSIF DELETING THEN
        DELETE FROM dept_copy
        WHERE deptno = :OLD.deptno;
    END IF;
END;
/

트리거 내에서 트랜잭션 제어문(COMMIT, ROLLBACK)을 사용할 수 없음
MySQL 트리거
BEGIN END 블록을 사용

DELIMITER //
CREATE TRIGGER check_removed_name
    AFTER DELETE
    ON test
    FOR EACH ROW
BEGIN
    INSERT INTO delete_test (name, age, num)
    VALUES (OLD.name, OLD.age, OLD.num);
END//
DELIMITER ;

PostgreSQL 트리거
트리거 함수가 별도로 필요

CREATE FUNCTION emp_trigger() RETURNS trigger AS $$
BEGIN
    IF (TG_OP = 'DELETE') THEN
        INSERT INTO emp_audit VALUES ('D', now(), user, OLD.*);
    ELSIF (TG_OP = 'UPDATE') THEN
        INSERT INTO emp_audit VALUES ('U', now(), user, NEW.salary, NEW.empname);
    ELSIF (TG_OP = 'INSERT') THEN
        INSERT INTO emp_audit VALUES ('I', now(), user, NEW.*);
    END IF;
    RETURN NULL;
END;
'$$ LANGUAGE plpgsql;
CREATE TRIGGER emp_trigger_test
    AFTER INSERT OR UPDATE OR DELETE ON emp
    FOR EACH ROW EXECUTE FUNCTION emp_trigger();

0개의 댓글