근본없는 코딩
[ORACLE] 트리거(Trigger) 본문
01. 트리거 (Trigger) 개념/목적
. 트리거는 데이터베이스 시스템에서 데이터의 입력, 갱신, 삭제 등의 이벤트가 발생할 때마다 자동적으로 수행되는 사용자 정의 프로시저이다.
. 트리거는 Table과는 별도로 Database에 저장된다.
. 트리거는 View에 대해서가 아니라 Table에 관해서만 정의될 수 있다.
. 트리거는 SQL의 제약조건 방법을 통해 명시할 수 없는 무결성 제약조건을 구현하고, 관련 테이블의 데이터를 일치시킬 때 주로 사용된다.
02. Trigger의 종류
✔️ 문장 트리거
. 많은 행에 대해 변경 작업이 발생하더라도, 오직 한 번만 트리거를 발생시키는 방법
. DML(Insert, Update, Delete)문에 대해 한 번만 실행된다.
. 컬럼 값에 변화가 생길 때마다, 알아서 실행 (for each row 사용 X)
✔️ 행 트리거
. 조건을 만족하는 여러 개의 행에 대해 트리거를 반복적으로 여러 번 수행하는 방법
. 즉, 테이블 안의 영향을 받은 행 각각에 대해 실행된다.
. for each row when 조건절로 정의된다.
. 컬럼의 데이터 행이 변화가 오면 실행된다.
. 변경 후의 행은 OLD와 NEW를 통해 가져올 수 있다.
✔️ 구문
CREATE [ OR REPLACE ] TRIGGER 트리거명
BEFORE | AFTER
[ 동작(INSERT, UPDATE, DELETE) ] ON 테이블명
[ REFERENCING NEW | OLD TABLE AS 테이블명 ]
[ FOR EACH ROW ]
[ WHEN 조건식 ]
트리거 BODY문
① OR REPLACE
. 생성할 트리거와 같은 이름이 없다면 새로 생성하고, 있더라도 무시하고 새로운 것으로 갱신하는 것
② BEFORE / AFTER
. BEFORE: 테이블이 변경되기 전에 트리거 실행 옵션
. AFTER: 테이블이 변경된 후에 트리거 실행 옵션
③ INSERT/UPDATE/DELETE ON 테이블명 → 동작 옵션
. 선택한 DML(INSERT/UPDATE/DELETE)문이 실행될 떄 트리거를 실행
④ REFERENCING NEW|OLD TABLE AS 테이블명 → 변경시점 옵션
. NEW: 새로 추가되거나 변경된 후의 값에 트리거가 적용(INSERT:입력할 값, UPDATE: 수정할 값)
. OLD: 변경 전의 값에 트리거가 적용(UPDATE: 수정 전 값, DELETE: 삭제할 값)
⑤ FOR EACH ROW
. 행 트리거가 된다
⑥ WHEN 조건식
. 트리거가 실행되면서 지켜야 할 조건 지정(조건에 맞는 데이터만 트리거 실행)
⑦ 트리거 BODY 문
. 트리거의 본문 코드를 입력하는 부분.
. BEGIN ~ END
. 적어도 하나 이상의 SQL문이 있어야하며, 변수에 값을 치환할 때는 예약어 SET 사용
✔️ 예제
. INSERT 시 동작 수행 트리거
-- //TB1에 INSERT가 발생하는 경우, INSERT 하기 전 TB1_HIST에 데이터를 추가하는 트리거
CREATE OR REPLACE TRIGGER TRG_INSERT
BEFORE INSERT ON TB1 -- //TB1에 INSERT가 되기 전에
FOR EACH ROW -- //행 단위로 처리
BEGIN
DBMS_OUTPUT.PUT_LINE('TB1 INSERT!');
INSERT INTO TB1_HIST(SYS_DATE, SEQ_ID, NEW_VAL) VALUES(SYSDATE, :new.SEQ_ID, :new.VAL);
END;
. UPDATE 시 동작 수행 트리거
CREATE OR REPLACE TRIGGER TRG_UPDATE
AFTER UPDATE ON TB1 -- //TB1에 UPDATE가 시행된 후에
FOR EACH ROW -- //행 단위로 처리
BEGIN
DBMS_OUTPUT.PUT_LINE('TB1 UPDATE!');
DBMS_OUTPUT.PUT_LINE('변경 전:' || :old.VAL);
DBMS_OUTPUT.PUT_LINE('변경 후:' || :new.VAL);
UPDATE TB1_HIST SET NEW_VAL=:new.VAL
WHERE SEQ_ID =:old.SEQ_ID;
END;
03. 트리거 제한
. 트리거는 자동으로 COMMIT 된다.
. 따라서 내부에서 트랜잭션 제어문(COMMIT, ROLLBACK, SAVEPOINT)을 사용할 수 없다.
. 트리거는 트리거링 문장의 실행 부분으로써 실행되는 트리거링 문장과 같은 트랜잭션에 있다.
. 트리거가 걸려있는 대상(트리거링) 문장이 COMMIT, ROLLBACK 될 때 트리거의 작업 역시 COMMIT, ROLLBACK 된다.
✔️ 활성화/비활성화
AFTER TRIGGER 트리거이름 [DISABLE | ENABLE];
✔️ 테이블에 속한 트리거 활성화/비활성화
AFTER TABLE 테이블이름 [DISABLE | ENABLE] ALL TRIGGER;
✔️ 트리거 수정 후 재컴파일
ALTER TRIGGER 트리거이름 COMPILE;
✔️ 트리거 삭제
DROP TRIGGER 트리거이름;
✔️ 트리거 조회
SELECT * FROM USER_TRIGGERS;
'✔ Database' 카테고리의 다른 글
데이터베이스 Lock (0) | 2023.12.04 |
---|---|
Oracle SGA/Latch(+LOCK?) (1) | 2023.11.13 |