기본문법
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();