트리거
테이블 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문을 수행하는거 대신에 트리거가 수행된다.
연쇄 트리거
연쇄 트리거는 그림과 같이 트리거로 특정 구문을 수행하고 또 이어서 특정 트리거를 작동시키고 싶을 때
연속적으로 트리거가 수행되는걸 연쇄 트리거라고 한다.
'Backend > Database' 카테고리의 다른 글
MariaDB 외부IP 접근 허용 (0) | 2020.12.01 |
---|---|
프로그램 GUI 구성 및 프로그램 기능들 정리 (0) | 2020.11.10 |
6장. 함수와 저장프로시저 (0) | 2020.10.27 |
5장. PL/SQL 기초 (0) | 2020.10.27 |
4장. SQL - DML(추가) (0) | 2020.10.27 |