Processing math: 100%
본문 바로가기
개발일지/데이터베이스

Database_Trigger

by 쫌눈 2021. 4. 22.
728x90
반응형

Trigger?

테이블에 대한 특정 이벤트에 반응하여 자동으로 내가 설정한 쿼리를 날려주는 작업으로, 3가지의 이벤트가 있다.

INSERT, UPDATE, DELETE

DB조금이라도 아는 사람이면 위에 대해 대충 알것이라 생각한다.

 

트리거는 저 이벤트의 실행 시점의 전/후로 나누어서 처리를 해준다.

ex) insert_before => 쿼리를 날려 테이블의 값을 추가하기 전에 트리거 이벤트를 날린다.
     update_after => 쿼리를 날려 테이블의 값을 수정한 후에 트리거 이벤트를 날린다.

대충 이해했을거라 생각한다.

 

트리거 생성시의 제약사항은

  • 하나의 스키마에서 트리거 이름 중복 불가능 -> 당연하다고 생각한다.
  • 하나의 테이블에는 동일한 이벤트와 시점을 가지는 트리거는 하나만 있어야 한다.
    ex) 'user' 테이블에 inset_before 트리거는 하나만 존재해야 한다.

이번에 DB관련을 다루면서 OLD, NEW키워드를 써야할 경우가 있어 트리거를 사용했다.

OLD 키워드는 수정전의 값을 받아올 수 있는 키워드다.

그러니 당연히 Inset문에는 사용할 수가 없다.

이제 막 DB에 넣는 신규?값인데 이전값이 있을리 없지 않는가.

같은 느낌으로 delete문에는 New 키워드를 쓸 수 없다.

삭제 할 DB에 새로 생성된 값이 있을리 없으므로.

 

OLD와 NEW키워드에 관한 얘기는 이쯤하고 sql쿼리를 보여주겠다.

내가 직접 해본 쿼리문으로,

DROP TRIGGER IF EXISTS `[트리거 이름]`;
CREATE DEFINER=`[디파이너]` 
TRIGGER `[트리거 이름]` 
AFTER INSERT ON `[테이블 명1]` 
FOR EACH ROW 
INSERT INTO `[테이블 명2]`
(`[테이블 명2row1]`,`[테이블 명2row2]`,`[테이블 명2row3]`)
VALUES (new.[테이블 명1row1],new.[테이블 명1row2],new.[테이블 명1row3])

[]안의것만 본인 DB에 맞도록 설정하여 쿼리문을 날리면 된다.

추가적으로 얘기할 것은 테이블명 1앞의 AFTER INSERT이다.

DB에 추가하고 난 뒤에 실행되는 쿼리문인것이다.

그러므로 AFTER INSERT ON 1은 테이블1에 insert가 된 후에 일어나는 이벤트 트리거 라는것이다.

만약 다르게 하고 싶다면 AFTER과 BEFORE, INSERT와 UPDATE, DELETE를 적절하게 써서 수정하면 된다.

NEW키워드와 OLD키워드의 주의도 명심하며

 

글을 끝맺으면서..

아직 초급개발자고, DB개발자는 아니라 잘 아는편이 아니라는것을 감안해두고 가볍게 이렇구나~라고 이해해주셨으면 좋겠다.

혹시 내 글을 보고 내가 잘못알고 있는 사항이 있다고 생각한다면 댓글로 말해주면 너무너무 감사합니ㅏㄷ.😊

728x90
반응형