데이터베이스 트리거 (Database Trigger)?
테이블에 대한 이벤트에 반응해 자동으로 실행되는 작업- 위키
장/단점
어떤 테이블에 변경사항이 생길 때마다 로그(히스토리)를 남기고 싶다. 이때 Trigger을 사용하면?
장점 : 부가적인 작업인 로그적재를 Trigger에서 해주어 소스상에서는 메인작업만 신경쓰면 된다. (소스깔끔)
단점 : 소스에서 안보이다보니 (의도한건 아니지만 숨겨져 있어서) trigger가 존재하는걸 모른다면 갑자기생긴 log데이터에 당황스러울 수 있다.
=> 잘만 사용하면 소스도 깔끔해지고 편리할 수 있지만, 어쨌든 추가작업이다보니 생길 DB성능의 문제와 갑툭튀한 데이터에 당황스러울 수있으니 남발하지 말자.
Template
{OWNER}.{TRIGGER_SOURCE_TABLENAME} 에 insert, delete, update가 있을 경우
{OWNER}.{TRIGGER_NAME} 트리거가 실행된다.
:OLD는 기존에 있던 데이터를, :NEW 는 새로 들어온 데이터를 의미한다.
Operation별(inserting, updating, deleting) 로 action을 따로 지정해줘야 한다.
CREATE TRIGGER {OWNER}.{TRIGGER_NAME}
AFTER INSERT OR DELETE OR UPDATE ON {OWNER}.{TRIGGER_SOURCE_TABLENAME}
FOR EACH ROW
DECLARE
V_LOG_TYPE VARCHAR2(1) := 'N';
BEGIN
-- insert DML이 발생하면
IF INSERTING THEN
V_LOG_TYPE := 'I';
INSERT INTO {TRIGGER_TABLENAME}
(
LOG_DATE,
LOG_TYPE,
AGE
)
VALUES
(
SYSDATE ,
V_LOG_TYPE ,
:NEW.AGE
) ;
-- update DML이 발생하면
ELSIF UPDATING THEN
V_LOG_TYPE := 'U';
INSERT INTO {TRIGGER_TABLENAME}
(
LOG_DATE,
LOG_TYPE,
AGE
)
VALUES
(
SYSDATE ,
V_LOG_TYPE ,
:OLD.AGE
) ;
-- delete DML이 발생하면
ELSIF DELETING THEN
V_LOG_TYPE := 'D';
INSERT INTO {TRIGGER_TABLENAME}
(
LOG_DATE,
LOG_TYPE,
AGE
)
VALUES
(
SYSDATE ,
V_LOG_TYPE ,
:OLD.AGE
) ;
END IF;
EXCEPTION
WHEN OTHERS THEN
RETURN;
END ;
(참고) 위에 예제 케이스 구조
{OWNER}.{TRIGGER_SOURCE_TABLENAME}에 age이라는 컬럼이 존재,
{TRIGGER_TABLENAME}에 LOG_DATE(로그쌓인시간), LOG_TYPE(operation종류), age(데이터) 컬럼이 존재하며,
TRIGGER_SOURCE_TABLENAME}에 data수정이 있을 때마다 {TRIGGER_TABLENAME}에 이력을 쌓는다.
댓글