SNOWFLAKES DRAWING PAPER

[SQL] MySQL Trigger 본문

개발/Oracle/SQL/ERD

[SQL] MySQL Trigger

눈송2 2009. 4. 18. 13:03

MySQL Trigger

 

 

Trigger란?

테이블에 미리 지정한 어떤 이벤트가 발생할 때 활동하도록한 테이블과

연관된 데이터베이스에서 이름붙인 하나의 객체를 의미하는 것으로

트리거 역시 임의의 테이블에 대해 SQL 문장이 실행될 때

임의의 조건을 만족하는 경우 해당되는 명령을 처리하는 방식으로 사용된다.

(MySQL은 5.0.x 이상부터 Trigger 를 지원)

 

--------------------------------------------------------------------------------------

 

TRIGGER의 종류

트리거는 SQL문이 언제 실행되느냐에 따라 또는 트리거하는 SQL 문장에 의해

영향받는 각 row에 대해 트리거가 실행되느냐 아니냐에 따라 다음과 같이 분류된다.

 

SQL문의 실행시기에 따른 분류 BEFORE 트리거 SQL 문장이 실행되기 전 트리거가 먼자 실행됨
AFTER 트리거 SQL 문장이 실행딘 다음 트리거가 실행됨
SQL문에 의해 영향받는
각 row에 따른 분류
ROW 트리거 SQL 문장의 각 row에 대해 한번씩 실행
STATEMENT 트리거 SQL 문장에 대해 한번만 실행

 

 

실행 시점과 범위를 조합하여 트리거는 다음 4가지로 분류한다.

 

실행시점 실행범위 내용
BEFORE STATEMENT SQL 문이 실행되기 전에 그 문장에 대해 한번 실행
BEFORE ROW DML 작업하기 전에 각 ROW에 대해 한번씩 실행
AFTER STATEMENT SQL 문이 실행된 후 그 문장에 대해 한번 실행
AFTER ROW DML 작업한 후 각 ROW에 대해 한번씩 실행

 

--------------------------------------------------------------------------

 

TRIGGER의 생성

트리거는 다음과 같은 방법으로 생성한다

【형식】 
CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name
FOR EACH ROW trigger_stmt;

ROW 트리거에서 컬럼의 실제 데이터값을 제어하는데 사용하는 연산자는

 :OLD:NEW이다.
이 연산자와 함께 컬럼명을 함께 기술한다.
예를 들어, 컬럼명이 sal이라고 하면,

변경전의 값은 :OLD.sal이고 변경 후의 값은 :NEW.sal처럼 표기한다.

 

--------------------------------------------------------------------------

 

TRIGGER의 삭제
【형식】 
DROP TRIGGER [schema_name.]trigger_name;

위와 같은 문을 사용하여 트리거를 삭제할 수 있다.

 

--------------------------------------------------------------------------

 

[출처: http://radiocom.kunsan.ac.kr/lecture/mysql/trigger.html]



트리거를 사용하는 경우 자동화된 입력이 가능해진다. 먼저 delimiter | 사용하여 트리거 정의가 끝나기 전까지 문장이 종료되지 않도록 종료자를 변경한다. 정의이 끝나면 원래의 ; 으로 복구한다.  

delimiter |

CREATE TRIGGER trg_trade BEFORE INSERT ON trade
  FOR EACH ROW BEGIN
 IF NEW.`교환대상_1`  THEN
  insert INTO money value( NEW.userB_id , NEW.`교환대상_1` , NEW.`교환값_1` , 1   )
  on duplicate key  update
   userA_id = NEW.userB_id ,
   userB_id = NEW.`교환대상_1` ,
   `보유액` =  `보유액` + NEW.`교환값_1` ,
   `거래횟수` = `거래횟수` + 1 ;
 END IF ;  
  END;
|

delimiter ;



on duplicate key 는 이미 중복키가 있을 경우를 대비한 insert 문이라 할 수 있다.

http://www.arraystudio.com/as-workshop/mysql-insert-a-new-row-or-update-old-one.html



'개발 > Oracle/SQL/ERD' 카테고리의 다른 글

[SQL] Mysql - ErrCode  (0) 2009.04.18
[SQL] MYSQL :: cursor & insert error check example  (0) 2009.04.18
[SQL] mysqldump  (0) 2009.04.18
[SQL] MYSQL :: show table status  (0) 2009.04.18
[SQL] MySql 데이터 타입  (0) 2009.04.18
Comments