본문 바로가기

JAVA 공책/=> 다시 정리

Trigger

Trigger

Trigger(트리거)는 DML 문장 수행 전이나 수행 후에 자동으로 수행되어야 하는 내용을 작성할 수 있는 개체입니다.

보통 수행 전에 자동으로 수행되어야 하는 내용은 유효성 검사인데, 트리거를 사용하여 유효성 검사를 통과한 경우에만 작업이 수행되도록 할 수 있습니다.

수행 후에 하는 내용은 하나의 테이블에 테이터가 삽입되거나 삭제, 수정 될 때 연쇄적으로 삽입, 삭제, 수정 되어야 하는 다른 데이터가 있을 경우에 사용됩니다.

예를 들어 sqlite3같은 데이터베이스의 경우, 외래키 설정은 가능하지만 외래키 옵션이 제대로 작동되지 않아서 삭제 이상이 생기는 경우가 있는데 이 경우에 트리거를 사용하여 해결할 수 있습니다.


Trigger 생성법

1. 공식


create [or replace] trigger 트리거이름
[before | after] [insert | update | delete]
--DML 동작 전이라면 before를 씁니다.
--DML 동작 이후라면 after를 씁니다.
--어떤 이벤트가 발생할 때 트리거를 발생시킬건지를 생각하고 insert, update, delete 중에 선택합니다.
on 테이블이름
[for each row]
--여러 행에 동작이 발생했을 때, 행 마다 트리거가 동작하게 하려면 for each row를 씁니다.
--만약 설정하지 않으면 첫번째 동작이 발생 했을 때 1회만 동작합니다.
[when conditions]
--기타 조건
begin
statement;
--수행할 SQL 문장
end;
/


statement에서 참조 값을 지정할 때 :NEW.참조값 그리고 :OLD.참조값을 사용하게 되는데 

일단 :NEW는 delete에서 사용하지 않고 :OLD는 insert에서 사용하지 않습니다.

update에서는 :NEW와 :OLD가 모두 사용이 되는데, 이 경우 :NEW는 DML에 의해서 변경된 값을 불러오고 :OLD는 DML에 의해서 변경되기 전의 값을 불러옵니다. 만약 변경된 것이 없다면 이 명령어를 쓸 필요가 없습니다.

http://hotquery.tistory.com/entry/

이 블로그가 :NEW와 :OLD에 대해 정리를 잘 해두어 참고하였습니다.


Trigger 삭제

트리거를 삭제하려면 아래와 같이 명령하면 됩니다.


drop trigger 트리거이름;




Trigger 실습

1. 회원 테이블에서 데이터를 추가하면 게시판 테이블에 데이터 1개를 자동으로 추가하는 트리거를 만들어서 사용하기

회원 테이블

id : 문자 30자, 기본키

pw : 문자 20자, 필수

name : 문자와 한글 10자까지, 필수

nickname : 문자와 한글 10자까지, 유일

address : 문자와 한글 100자까지


게시판 테이블

boardnum : 글번호 : 정수 10자리, 기본키, 시퀀스 사용

boardtitle : 글제목 : 한글 100자까지, 기본값은 무제

boardcontents : 글내용 : 한글 2000자까지, 기본값 내용없음

boarddate : 작성일 : 날짜, 기본값 sysdate

nickname : 회원 테이블의 nickname을 참조하는 외래키로 회원 테이블에서 삭제될 때 null 값을 가지도록 설정


create table member(

id varchar2(30) primary key,

pw varchar2(20) not null,

name varchar2(30) not null,

nickname varchar2(30) unique,

address varchar2(300));


--시퀀스 중복 제거

drop sequence sqnum;


--시퀀스 생성

create sequence sqnum

start with 1;


--board 테이블 생성