2020. 6. 21. 19:23ㆍ컴퓨터언어/Database
👍 What is Trigger?
한 테이블에 CRUD를 가하면, 그와 연관된 다른 테이블 내 데이터에도 당연히 영향을 주게 된다.
그러나 DB는 매우 복잡하고 실무에서 트랜잭션 발생 시 마다 일일이 테이블들을 찾아서 수정한다는 것은 말도 안된다.
이때 연관된 데이터들을 찾아 자동갱신시킴으로써 참조 무결성을 지켜주는 방법이 있는데, 이를 "트리거"라고 한다.
예를 들어, <입고>, <상품>, <판매> 테이블이 있다고 하자.
그리고 <입고> 테이블에는 새로 입고한 "입고수량"이 있고, <상품> 테이블에는 현재 매장에 남은 "재고수량"이 있고, <판매> 테이블에는 지금까지 팔린 "판매수량"이 있다고 가정하자.
이 3개의 속성은 모두 긴밀한 관계를 가지고 있다.
입고수량이 곧 재고수량으로 더해지고, 판매수량이 곧 재고수량에서 마이너스되기 때문이다.
이처럼 복잡다단한 관계에서는 여러 테이블에 SQL을 일일이 적용하기에 실수의 여지가 많다.
따라서 "트리거"를 구현함으로써 오류를 방지하고 무결성을 확보할 수 있는 것이다.
물론 트리거 자체를 잘못 만들면 더 힘들어진다.
우선, CRUD 명령이 내려지면 테이블은 Auto Commit 기능이 켜져있지만 않다면, COMMIT 명령을 내리기 전까지는 INSERT, DELETE, UPDATE 결과를 "가상 테이블"에 복사하여 보관하게 된다.
이 가상 테이블 덕분에 무결성이 확보되는 것이다.
예를 들어 UPDATE는 바로 업데이트를 진행하지 않고, 기존 값을 INSERT 가상테이블과 DELETE 가상테이블에 2개 복사해놓는다.
그리고 먼저 INSERT 테이블에 수정할 값으로 바꾸고, 에러가 없다면 그 결과를 그대로 원본 테이블에 대입한다.
그리고 만약 사용자가 업데이트를 실행취소하고 싶다면, DELETE 가상테이블에 복사해두었던 데이터를 백업본으로 삼아 복구시킨다.
다음 예는 INSERT 명령에 대한 트리거를 만드는 과정이다.
'컴퓨터언어 > Database' 카테고리의 다른 글
커서 - 내장형 SQL로 반환되는 단 하나의 튜플을 여러개로 늘리는 반복문 (0) | 2020.06.21 |
---|---|
내장형(Embedded) SQL - 다른 프로그램 내에 삽입된 SQL (0) | 2020.06.21 |
[SQL] DBA가 DBMS와 대화하는 언어 (0) | 2020.06.18 |
[관계 데이터 연산] 관계형 데이터베이스의 이론적 기반 - 관계대수, 관계해석 (0) | 2020.06.18 |
[Index, 선택성] 데이터베이스가 데이터를 빠르게 검색하는 방법 (0) | 2020.06.17 |