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개발자는 아니라 잘 아는편이 아니라는것을 감안해두고 가볍게 이렇구나~라고 이해해주셨으면 좋겠다.
혹시 내 글을 보고 내가 잘못알고 있는 사항이 있다고 생각한다면 댓글로 말해주면 너무너무 감사합니ㅏㄷ.😊
댓글