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

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 명령에 대한 트리거를 만드는 과정이다.

CREATE TRIGGER 입고INS ON 입고 FOR INSERT -- <입고> 테이블에 트리거를 하나 만들건데, 트리거 이름은 "입고INS"라고 하고, INSERT(어떤 값을 <입고> 테이블에 새로 입력)시 동작시킬 것입니다.
AS
DECLARE @CODE CHAR(6), @QTY INT -- 이제 CODE라는 이름의 변수에 6바이트 크기의 문자열을, QTY라는 변수에 정수를 담을 것입니다.
SET @CODE = (SELECT 상품코드 FROM INSERTED) -- INSERT 가상테이블로부터 "상품코드"가 입력되었다면, 변수 CODE에 대입합니다.
SET @QTY = (SELECT 입고수량 FROM INSERTED) -- INSERT 가상테이블로부터 "입고수량"이 입력되었다면, 변수 QTY에 대입합니다.
UPDATE 상품 -- 이제 두 변수로 <상품> 테이블을 업데이트할 것입니다.
SET 재고수량 = 재고수량 + @QTY -- 기존 <상품> 테이블에 있던 "재고수량" 값에 QTY를 누적시킵니다.
WHERE 상품코드 = @CODE -- 업데이트 조건 : 단, 상품코드가 CODE과 같은 것만 업데이트를 적용합니다
728x90
반응형