ORACLE/Oracle_SQL

트리거(TRIGGER)

minies 2023. 7. 16. 15:37
반응형

 

트리거(TRIGGER)  생성시 고려사항

  • 트리거는 각 테이블에 최대 3개까지 생성 가능
  • 트리거 내에서는 COMMIT,ROLLBACK 문을 사용 불가
  • 이미 트리거가 정의된 작업에 대해 다른 트리거를 정의하면 기존의 것을 대체
  • 뷰나 임시 테이블을 참조할 수 있으나 생성은 불가능

 

 

## 기본 구조

CREATE [OR REPLACE] TRIGGER [스키마].[트리거명]
BEFORE or AFTER
INSERT or UPDATE or DELETE ON [스키마].[테이블명] 
[FOR EACH ROW]
[WHEN 조건]
[DECLARE 변수 선언]

BEGIN

      트리거 본문 코드

END;


-- 트리거구조
BEFORE : 이벤트 발생 전
AFTER : 이벤트 발생 후

FOR EACH ROW : DML의 영향을 받는 모든 행, 레코드마다 트리거가 작동되는 트리거를 행 트리거라고 하며 몇건의 데이터가 삽입, 삭제, 갱신되더라도 한번만 동작하는 트리거를 명령문 트리거라고 한다. 
FOR EACH ROW
- 행 트리거에 한해 레코드의 값을 제어 가능
:old  : UPDATE, DELETE 되기전의 값에 접근 가능
:new : INSERT, UPDATE된 후의 값에 접근 가능

 

## 간단한 쿼리

 -- NEW는 새로운 값이 입력되었을 경우를 뜻함
 -- BOOK에 새로운값이 들어가면 똑같은 값을 BOOK_LOG에 입력하는 트리거

CREATE TABLE DAMIN.BOOK(BOOKID NUMBER(10),
                  BOOKNAME VARCHAR(20),
                  PUBLISHER VARCHAR(20),
                  PRICE NUMBER(10));
                  
                
CREATE TABLE DAMIN.BOOK_LOG(BOOKID NUMBER(10),
                  BOOKNAME VARCHAR(20),
                  PUBLISHER VARCHAR(20),
                  PRICE NUMBER(10));




CREATE OR REPLACE TRIGGER DAMIN.AfterInsertBook
  AFTER INSERT -- 트리거를 작동하게 하는 명령문은 INSERT 수행 후
  ON book -- 트리거를 부착할 테이블 book
  FOR EACH ROW -- 각 행마다 적용됨 
DECLARE
BEGIN -- 트리거 작동시 실행하는 코드
   INSERT INTO BOOK_LOG
   VALUES(:new.bookid, :new.bookname, :new.publisher, :new.price);
END;
/
 


-- 활성화 비활성화
ALTER TRIGGER [스키마].[트리거명] DISABLE;
ALTER TRIGGER [스키마].[트리거명] ENABLE;

INSERT INTO DAMIN.BOOK values(23, '자바 프로그래밍', '한빛아카데미', 26000);
 
 
 -- 확인
 SELECT *
 FROM DAMIN.BOOK;
 
 SELECT *
 FROM DAMIN.BOOK_LOG;

 

 

참고자료 : http://ojc.asia/bbs/board.php?bo_table=LecSQLnPlSql&wr_id=669

 

반응형