트리거란 ?
- 미리 정해 놓은 특정 조건이 만족하거나 어떤 동작이 수행하면 자동으로 실행하도록 정의한 동작
- 예를 들어 DML(INSERT, UPDATE, DELETE) 문장이 실행하거나 DDL(CREATE, ALTER, DROP) 문장이 실행될 때 트리거가 실행될 수 있다.
- 트리거는 CREATE TRIGGER 시스템 권한이 있어야 생성 가능하다.
- 트리거 내에서의 DML은 자동 COMMIT/ROLLBACK 되므로 COMMIT 하지 않는다.
- 트리거는 데이터 무결설 유지, 감사 기록 관리 등에 유용
USER_TRIGGERS
USER_SOURCE
SELECT * FROM user_triggers;
GRANT CREATE TRIGGER TO 사용자;
SELECT * FROM user_sys_privs;
CREATE TRIGGER 트리거명
AFTER [INSERT/UPDATE/DELETE] -- 또는 BEFORE
ON 테이블명
FOR EACH ROW
BEGIN
-- 실행할 구문
END;
트리거 활성화 및 비활성화
ALTER TRIGGER 트리거이름 [ENABLE | DISABLE];
테이블에 속한 트리거 활성화 및 비활성화
ALTER TABLE 테이블명 { ENABLE | DISABLE } ALL TRIGGERS;
트리거 상태 확인
SELECT 테이블명, 상태 FROM user_triggers;
트리거 수정 후 재 컴파일
ALTER TRIGGER 트리거이름 COMPILE;
트리거 삭제
DROP TRIGGER 트리거이름;
CREATE OR REPLACE TRIGGER testTrigger
BEFORE INSERT OR UPDATE OR DELETE ON test
BEGIN
IF TO_CHAR(SYSDATE, 'D') IN(1,7) OR -- 주말
-- ( TO_CHAR(SYSDATE, 'HH24') < 9 OR TO_CHAR(SYSDATE, 'HH24') > 18) THEN
( TO_CHAR(SYSDATE, 'HH24') >= 15 AND TO_CHAR(SYSDATE, 'HH24') <= 16) THEN
RAISE_APPLICATION_ERROR(-20001, '데이터 수정 할 수 있는 시간이 아님');
END IF;
END;
/
CREATE OR REPLACE TRIGGER testinfoTrigger
AFTER INSERT OR UPDATE OR DELETE ON test
BEGIN
IF INSERTING THEN
INSERT INTO test_info(memo) VALUES ('추가');
ELSIF UPDATING THEN
INSERT INTO test_info(memo) VALUES ('수정');
ELSIF DELETING THEN
INSERT INTO test_info(memo) VALUES ('삭제');
END IF;
END;
/
-- 다음과 같은 방법을 이용하여 관련된 트리거는 하나의 트리거로 작성 할 수 있다.
-- IF INSERTING THEN
-- 추가할 때
-- ELSIF UPDATING THEN
-- 수정할 때
-- ELSIF DELETING THEN
-- 삭제할 때
-- END IF;