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
반응형