근본없는 코딩

[ORACLE] 트리거(Trigger) 본문

✔ Database

[ORACLE] 트리거(Trigger)

근본없는 개발자 2023. 6. 26. 23:14

 

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