땅지원
땅지원's Personal blog
땅지원
전체 방문자
오늘
어제
  • 전체 (353)
    • Frontend (2)
      • React (2)
    • Backend (90)
      • Java (16)
      • Python (19)
      • Spring (23)
      • Database (21)
      • Troubleshooting (8)
    • DevOps (27)
      • ELK (13)
    • CS (40)
    • OS (2)
      • Linux (2)
    • Algorithm (95)
      • concept (18)
      • Algorithm Problem (77)
    • 인공지능 (25)
      • 인공지능 (12)
      • 연구노트 (13)
    • 수업정리 (35)
      • 임베디드 시스템 (10)
      • 데이터통신 (17)
      • Linux (8)
    • 한국정보통신학회 (5)
      • 학술대회 (4)
      • 논문지 (1)
    • 수상기록 (8)
      • 수상기록 (6)
      • 특허 (2)
    • 삼성 청년 SW 아카데미 (6)
    • 42seoul (12)
    • Toy project (3)
    • 땅's 낙서장 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 20.11.6 BB21플러스 온라인 학술대회
  • 20.10.30 한국정보통신학회 온라인 학술대회

인기 글

태그

  • D
  • ㅗ
  • E
  • I
  • 이것이 리눅스다 with Rocky Linux9

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
땅지원

땅지원's Personal blog

7장. 트리거
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문을 수행하는거 대신에 트리거가 수행된다.

 

 

연쇄 트리거

 

 

 

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

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

 

 

'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
    'Backend/Database' 카테고리의 다른 글
    • MariaDB 외부IP 접근 허용
    • 프로그램 GUI 구성 및 프로그램 기능들 정리
    • 6장. 함수와 저장프로시저
    • 5장. PL/SQL 기초
    땅지원
    땅지원
    신입 개발자의 우당탕탕 기술 블로그

    티스토리툴바