trigger
데이터베이스에서 이벤트(insert, delete, update 가 발생했을 때 )가 발생했을 때 자동적으로 실행되는 프로시저
위의 트리거는 닉네임을 바꾸면 실행되는 트리거이다.
트리거의 정의는 아래와 같다.
create trigger 트리거명
before / after on 테이블명 조건
begin
// 트리거 내용
end
before 와 after 로 해당 이벤트의 전이나 후에 실행해줄지 설정해줄 수 있다. 조건에 속하는 부분에는 for each row 가 예시에 적혀있는데 이는 모든 row에 적용한다는 의미이다. 이는 성능상 문제가 생길 여지가 있는데, 각각의 행에 적용하라는 의미는 트리거가 실행됐을 때 where 절에 조건이 들어가게 된다면, 그 조건에 맞는 행들에게 모두 트리거가 적용되는 것이다. MySQL에는 해당하지 않지만 PostgreSQL에서 이런 비효율성을 없애주려면 for each row 가 아닌, for each statement 를 사용해주면 된다.
그리고 추가로 begin~end 사이엔 가상의 변수인 OLD, NEW가 존재하는데 OLD 는 말그대로 기존 원본 데이터를 의미하며 NEW 는 바뀐 데이터를 의미하는 변수이다. 이를 부연설명을 덧붙여보자면 의미상 OLD는 update 의 경우 수정되기 전의 행의 정보고, delete 의 경우 삭제된 행 정보를 의미하는 것이다.
트리거는 위에 정의했다시피 특정 이벤트 상황에서 자동적으로 실행되는 것이므로 프로시저나 함수처럼 따로 호출해주지 않아도 된다.
그럼 사용자가 마트에서 상품을 구매할 때마다 지금까지 누적된 구매 비용을 구하는 트리거를 작성해보면 아래와 같다.
이렇게 구매 New 키워드는 insert 의 경우 들어오는 행의 정보를 담고 있게 되어 가능한 것이다. 그밖에도 트리거는 집계 등의 계산을 할 때 자주 사용된다.
MySQL 에선 해당 되지 않지만 PostgreSQL 에선 update, insert, delete 를 한번에 탐지하도록 트리거를 만들어 줄 수 있다!
이 예시의 경우 직원들의 연봉 정보가 insert되든, update 되든, delete 되든 모든 이벤트에 반응하는 트리거가 된다.
추가적으로 PostgreSQL에선 When 같은 조건을 추가해줄 수 있는데, 해당 예시에 의하면 New 닉네임과 Old 닉네임이 is distinct from 서로 다를 때 실행되도록 발생조건을 추가해준 것이다. 이는 MySQL 에선 불가능하다.
다만 트리거는 소스 코드로 발견할 수 없는 로직이라 어떤 동작이 일어나는지 파악이 힘들고 디버깅이 안되어 대응이 어렵다는 단점이 존재한다. 그리고 트리거가 많이 엮이게 되면 트리거에 의해 트리거가 발생하는 상황이 발생할 수 있어 코드를 파악하기 어려워지며 DB에 부담을 주고 응답을 느리게 만드므로 트리거를 사용하려면 문서 정리가 특히 중요하다.
이렇게 트리거에 대한 강좌를 마지막으로 시니어 백엔드 개발자가 알려주는 데이터베이스 개론 & SQL 강의가 끝이 났다. 강의 내용이 생각보다 알찼고 배워가는 것이 많았다. 다만 테이블 생성과 그 설계에 대해 조금더 자세했으면 좋았겠지만 덕분에 많은 지식이 늘었다. 이후에도 유튜브에도 많은 강의들이 있어서 그걸 차근히 볼 예정이다.
'Web Study > DataBase' 카테고리의 다른 글
MySQL 숫자/문자/날짜 관련 함수 정리 (0) | 2024.02.15 |
---|---|
데이터베이스 개론 & SQL - 8 (1) | 2024.02.13 |
데이터베이스 개론 & SQL - 7 (1) | 2024.02.11 |
데이터베이스 개론 & SQL - 5 (1) | 2024.02.05 |
데이터베이스 개론 & SQL - 4 (2) | 2024.02.04 |