Backend/Database

7장. 트리거

땅지원 2020. 10. 27. 22:00

트리거

테이블 or 뷰에 변경연산이 실행되면 연동되어 실행되는 프로그램

변경연산(Insert, Delete, Update) 시 자동실행. 논리적 무결성을 지원함

 

[트리거의 형식]

CREATE [or replace] TRIGGER 트리거이름

{Before | After | Instead Of } { Insert | Delete | Update } [ OF 컬럼 ]

ON 테이블or뷰

[FOR EACH ROW] ==> 행 트리거가 된다

BEGIN

PL/SQL Statements

... ...

-- 상태확인 변수 : Updating, Deleting, Inserting

END;

 

트리거는 Background Process.

생성하면 그 때부터 시스템 부하가 증가함

불필요한 트리거는 삭제하는 것이 좋음

 

트리거에서 사용가능한 임시테이블

:OLD -- 변경(,,) 이전의 값을 가진 테이블

:NEW -- 변경 이후의 값을 가진 테이블

 

Insert : 해당되는 이전 튜플이 없음. :OLD(x), :NEW(o)

Delete : 해당되는 이후 튜플이 없음. :OLD(o), :NEW(x)

Update : :OLD(o), :NEW(o) 둘다 유효

 

BEFORE : 트리거가 먼저 실행되어 튜플을 미리 검증한 뒤 입력

AFTER : 튜플이 입력된 뒤 트리거 실행

==> 트리거 실행 기준으로 비포, 에프터 생각하면 될 듯

 

 

<CASE : PK-FK Update CASCADE 구현>

create trigger T_OnUpdateCascade

AFTER UPDATE OF 고객아이디 ON 고객

FOR EACH ROW

BEGIN

UPDATE 주문 SET 주문고객 = :NEW.고객아이디 WHERE 주문고객 = :OLD.고객아이디;

END;

 

 

Before,  After => Table => 변경연산은 수행

Instead of => View => 변경연산 대신 트리거 수행

 

Instead of

CREATE or REPLACE VIEW 학생학과정보
AS
SELECT 학번, 이름, 학생.전화번호, 주소, 학과.학과번호, 학과명, 사무실
FROM 학생, 학과
WHERE 학생.학과번호 = 학과.학과번호;
INSERT INTO 학생학과정보
VALUES ('20301-006', '박문수', '200-2000', '부산', 303, '컴공', '917호');

 

 

 

이런 경우 제약조건 때문에 삽입이 안됨.

 

CREATE OR REPLACE TRIGGER 뷰삽입
INSTEAD OF INSERT -- 삽입작업 대신에 작동 작동하도록 지정
ON 학생학과정보 -- 뷰에 장착
FOR EACH ROW 
BEGIN
INSERT INTO 학과(학과번호, 학과명, 사무실)
VALUES (:NEW.학과번호, :NEW.학과명, :NEW.사무실);
INSERT INTO 학생(학번, 이름, 학과번호, 주소, 전화번호)
VALUES (:NEW.학번, :NEW.이름, :NEW.학과번호, :NEW.주소, :NEW.전화번호);
END;

이런식으로 Instead of를 써서 Insert문을 수행하는거 대신에 트리거가 수행된다.

 

 

연쇄 트리거

 

 

 

연쇄 트리거는 그림과 같이 트리거로 특정 구문을 수행하고 또 이어서 특정 트리거를 작동시키고 싶을 때 

연속적으로 트리거가 수행되는걸 연쇄 트리거라고 한다.