본문 바로가기
개발일지/데이터베이스

Database_Trigger(트리거)

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

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]`
(`[테이블 명2의 row값1]`,`[테이블 명2의 row값2]`,`[테이블 명2의 row값3]`)
VALUES (new.[테이블 명1의 row값1],new.[테이블 명1의 row값2],new.[테이블 명1의 row값3])

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

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

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

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

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

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

 

글을 끝맺으면서..

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

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

반응형

댓글