db/mysql

MySQL Trigger 테이블당 하나의 Event Trigger

C/H 2013. 1. 22. 15:06
참고


255Page
  • 각 이벤트마다 테이블당 하나의 트리거만 가질수 있다. ( 달리말해 AFTER INSERT 를 호출하는 트리거는 두 개는 갖지 못한다.)
  • MySQL은 행 수준의 트리거만 지원한다. 말인즉, 트리거는 문 전체에 적용되지 않고 FOR EACH ROW를 항상 수행한다.이는 큰데이터 집합을 다루기엔 훨씬 비효율적인 방법이다.

트리거 일반적인 주의사항

  • 트리거는 서버가 실제로 하는 일을 분명치 않게 만든다. 간단한 문이라도 서버가 '보이지 않는 일'을 많이 수행가게 만들기 때문이다. 예를 들어 트리거 하나가 관련 테이블을 엡데이트 했다면, 문 하나가 영향을 미치는 행의 개수를 두 배로 늘릴 수가 있다.
  • 트리거는 디버깅하기 힘들고 트리거가 관련되면 성능 병목 현상을 분석하기 힘들 때가 많다.
  • 트리거는 분명치 않은 데드락과 잠금 대기를 야기할 수 있다. 트리거가 실패하면 원래 쿼리도 실패하고 트리거가 있는줄 모르면 오류코드를 판독하기 힘들 수 있다.

MyISAM 테이블에서는 트랜젝션을 지원하기 않기 때문에 트리거 인해 데이터 원자성을 보장하지 못한다.

InnoDB 테이블의 트리거는 모든 트리거를 시동시킨 문과 함께 같은 트랜잭션 내에서 작동해서 원자성을 보장하지만 제약조건 유효성을 검증하느라 InnoDB에 트리거를 사용해 다른 테이블에 데이터를 확인할 때는 MBCC에 주의해야 한다.

반응형