트리거 - 서로 연동된 릴레이션에 연쇄조작을 가해 무결성 확보

2020. 6. 21. 19:23컴퓨터언어/Database

728x90
반응형

 

👍 What is Trigger?

 

한 테이블에 CRUD를 가하면, 그와 연관된 다른 테이블 내 데이터에도 당연히 영향을 주게 된다.

그러나 DB는 매우 복잡하고 실무에서 트랜잭션 발생 시 마다 일일이 테이블들을 찾아서 수정한다는 것은 말도 안된다.

이때 연관된 데이터들을 찾아 자동갱신시킴으로써 참조 무결성을 지켜주는 방법이 있는데, 이를 "트리거"라고 한다.

 

예를 들어, <입고>, <상품>, <판매> 테이블이 있다고 하자.

그리고 <입고> 테이블에는 새로 입고한 "입고수량"이 있고, <상품> 테이블에는 현재 매장에 남은 "재고수량"이 있고, <판매> 테이블에는 지금까지 팔린 "판매수량"이 있다고 가정하자.

이 3개의 속성은 모두 긴밀한 관계를 가지고 있다.

입고수량이 곧 재고수량으로 더해지고, 판매수량이 곧 재고수량에서 마이너스되기 때문이다.

이처럼 복잡다단한 관계에서는 여러 테이블에 SQL을 일일이 적용하기에 실수의 여지가 많다.

따라서 "트리거"를 구현함으로써 오류를 방지하고 무결성을 확보할 수 있는 것이다.

물론 트리거 자체를 잘못 만들면 더 힘들어진다.


우선, CRUD 명령이 내려지면 테이블은 Auto Commit 기능이 켜져있지만 않다면, COMMIT 명령을 내리기 전까지는 INSERT, DELETE, UPDATE 결과를 "가상 테이블"에 복사하여 보관하게 된다.

이 가상 테이블 덕분에 무결성이 확보되는 것이다.

 

예를 들어 UPDATE는 바로 업데이트를 진행하지 않고, 기존 값을 INSERT 가상테이블과 DELETE 가상테이블에 2개 복사해놓는다.

그리고 먼저 INSERT 테이블에 수정할 값으로 바꾸고, 에러가 없다면 그 결과를 그대로 원본 테이블에 대입한다.

그리고 만약 사용자가 업데이트를 실행취소하고 싶다면, DELETE 가상테이블에 복사해두었던 데이터를 백업본으로 삼아 복구시킨다.

 

다음 예는 INSERT 명령에 대한 트리거를 만드는 과정이다.

728x90
반응형