트리거는
데이터베이스에서 특정 이벤트 발생 시 자동으로 실행되는 작업
데이터베이스에서 특정한 조건이나 이벤트가 발생할 때 자동으로 실행되는 일련의 sql 명령문의 모음이다.
주로 데이터 무결성 유지, 비즈니스 규칙 적용, 데이터 변화에 대한 로깅 등을 위해 사용된다.
트리거는 특정 테이블에 INSERT, UPDATE, DELETE 등의 데이터 조작 작업이 발생할 때 실행될 수 있다.
- 주문 취소될 때 재고량 갱신하는 트리거
- 사용자가 새로운 게시물 작성할 때 알림을 전송하는 트리거
트리거의 속성
BEFORE/AFTER : 트리거 실행 시점 지정 (해당 작업 실행 전, 해당 작업 실행 후)
INSTEAD OF : 대상 작업 대신 트리거 실행
WHEN : 트리거 실행 조건 지정
BEFORE/AFTER :
요리하기 전에는 손을 씻고 재료를 준비해야한다. (전에)
요리를 마친 후에는 접시에 담거나 서빙을 하고 주변을 정리해야한다. (후에)
INSTEAD OF :
상점에서 물건을 사는데 현금이 없다. 상점 주인은 대신에 신용카드로 결제를 받는다. (특별 상황에서 대상 작업 대신)
WHEN :
비가 올 때만, 우산을 가져간다. (특정 조건; 비)
트리거의 구분 (행 / 문장)
행 트리거 : 트리거가 각 행에 대해 실행된다. 특정 행에 대한 변경 전(OLD), 변경 후(NEW) 값을 확인할 수 있다 .
문장 트리거 : 한 번의 문장 실행에 대해 한 번만 실행 된다.
트리거의 장단점
트리거는 데이터 무결성을 강화하고 비즈니스 규칙을 적용하는데 유용하지만,
유지보수의 어려움과 예상치 못한 오류를 유발할 수 있다는 단점이 있다.
[트리거의 장단점]
<장점>
자동화된 작업 처리 :
트리거를 사용하면 특정 조건이나 이벤트가 발생할 때 자동으로 데이터베이스 작업을 처리할 수 있다.
이를 통해 반복적이고 일관된 작업을 자동화할 수 있다.
데이터 일관성 유지 :
트리거 통해 무결성 규칙 적용하고 일관성 유지할 수 있다.
ex) 외래키 제약조건을 트리거로 구현하여 부모 테이블의 변경이 자식 테이블에 반경되도록 할 수 있다.
CREATE TRIGGER UpdateChildTable
AFTER UPDATE OF KeyColumn ON ParentTable
FOR EACH ROW
BEGIN
UPDATE ChildTable
SET ForeignColumn = NEW.KeyColumn
WHERE ParentID = NEW.ID;
END;
<단점>
복잡성 증가 :
트리거 사용하면 데이터베이스 복잡성이 증가할 수 있다.
ex) 잘못된 조건을 설정하거나 트리거 잘못 구현하면 데이터베이스 작업이 예상치 못한 방식으로 실행될 수도 있다.
의도하지 않은 동작 :
트리거를 구현할 때 의도하지 않은 동작이 발생할 수 있다.
ex) 잘못된 조건을 설정하거나 잘못 구현하면 데이터베이스 작업이 예상하지 못한 방식으로 실행 수 있다.
자동화 처리 :
자동화 처리 되어있어 예상치 못한 요류 발생할 수 있다.
트리거와 프로시저의 차이
프로시저(저장 프로시저) :
사용자가 명시적으로 호출하여 실행되는 일련의 SQL 명령문의 모음이다.
사용자가 원할 때 호출하여 실행된다.
트리거 :
특정 조건이 만족될 때 자동으로 실행되는 일련의 SQL 명령문의 모음이다.
조건이 충족되면 자동으로 실행된다.
프로시저
사용자가 명시적으로 호출하여 실행되는 일련의 작업
매일 아침 양치, 세수, 옷입기, 아침식사하기
사용자가 필요할 때마다 호출하여 특정 작업을 수행
트리거
특정 조건이 만족될 때 자동으로 실행되는 일련의 작업을 수행
데이터베이스에서의 자동화된 반응 !!!
감시 카메라 시스템과 비슷하다.
카메라가 움직임을 감지하면 (특정 조건 충족)
자동으로 녹화 시작하거나 경보 울리는 것과 같이, 트리거도 데이터베이스 내부의 특정 조건이 충족되면 자동으로 실행된다.
트리거는 말하자면
자동차의 자동 문 열기 시스템과 유사하다
자동 문 열기 시스템은 특정 조건(일정 거리 내 차량 키 감지)이 충족될 때 문이 열린다.
이는 편의성을 제공하지만, 잘못 구현되거나 조건이 제대로 설정되지 않으면 의도하지 않은 동작(문을 잠구고 떠나는데 문이 열림)이 발생하지 않을 수도 있다. 또 자동 문 열기 시스템이 복잡하게 되면 유지보수가 어려워지고 오류 발생 가능성이 높아진다.
관리자가 새로운 직원 추가할 때,
직원 테이블에 새로운 레코드 추가되면 자동으로 해당 직원의 근무 시간을 계산하거나,
주문 테이블에 새로운 주문이 추가될 때 재고 테이블의 수량을 조정하는 등의 작업을 수행할 수 있다.
트리거의 활용
트리거는 데이터 무결성 유지 뿐만 아니라 데이터베이스 내에서 비즈니스 규칙을 적용하고, 데이터 변화에 대한 로깅 등 다양한 목적으로 활용된다.
ex) 주문 테이블에 주문 추가될 때 재고 수량을 최신화하거나, 특정 조건을 충족하는 경우에만 데이터 변경을 허용하는 등 기능을 구현할 수 있다.
[비즈니스 규칙 적용, 데이터 변화에 대한 로깅]
비즈니스 규칙 적용 :
마치 회사의 내규나 규칙처럼 작용한다 !
ex) 모든 직원이 출근할 때마다 출석부에 기록해야 한다는 규칙
이 규칙을 데이터베이스에 비유하자면, 특정 테이블에 INSERT 작업이 발생할 때마다 자동으로 출석부에 해당 정보를 기록하는 트리거 설정할 수 있다.
=> 비즈니스 규칙이 자동으로 적용되어야 하는 상황에서 트리거는 규칙의 역할을 수행한다.
데이터 변화에 대한 로깅 :
회사의 감사 로그나 업무 기록과 비슷하다 !
회사에서는 중요한 업무나 사건에 대한 기록을 남기는데, 이와 비슷하게
데이터베이스에서는 특정 테이블의 데이터 변경이 발생할 때마다 해당 변경 내용을 로그에 기록하는 트리거를 설정할 수 있다.
ex) 사용자가 주문을 취소할 때마다 주문 취소 이벤트를 로그에 기록하여 나중에 추적하거나 분석할 수 있다.
=> 트리거를 통해 데이터의 변경 이력을 추적하고 관리하는 역할을 한다.
트리거의 효율성
트리거를 효율적으로 사용하기 위해서는 실행 주기와 조건을 신중하게 설정해야 한다.
너무 자주 실행되면 성능에 영향을 미칠 수 있고, 너무 복잡하게 설정하면 유지보수가 어려워질 수 있다.
트리거는 데이터베이스의 상태를 변경하거나 제어하는 데 중요한 도구로 사용된다. 그러나 사용시 주의하여야 하며, 적절하게 구현되어야 한다.
트리거의 보안 고려사항
안전성을 유지하기 위해 매우 중요하다. 잘못 구현하면 보안 취약점이 발생할 수 있고, 이는 사용자가 의도하지 않은 작업을 수행하게 될 수 있다.
ex) 트리거로 특정 조건 충족 시 사용자에게 권한 부여하는 경우, 트리거의 구현이 취약점 갖고 있다면 ???
해커가 해당 취약점 이용해 무단으로 권한 취득 가능
그러므로 !!!
1. 인증과 권한 부여 : 트리거가 실행될 때 어떤 사용자가 이를 실행하는지 확인하고, 해당 사용자가 작업을 수행할 권한이 있는지 검사
적절한 권한 없는 사용자가 트리거 실행하려고 할 때는 작업을 거부해야 한다.
2. 입력 검증 :
트리거가 처리하는 입력 값에 대해 유효성 검사 해야한다. 잘못된 입력 값이 트리거에 전달되는 경우 보안 취약점으로 이어질 수 있다.
이를 통해 SQL ijection 같은 공격 방지할 수 있다.
3. 트리거 실행 권한 제한 :
트리거가 실행되는 환경을 최대한 제한해야 한다. 트리거가 데이터베이스의 중요한 기능을 실행할 수 없도록 권한을 최소화해야 한다.
트리거의 보안 고려사항은 마치 집의 문을 잠그고 안전 잠금장치를 걸어두는 것과 같다.
이를 통해 외부의 해커나 악의적인 사용자로부터 데이터베이스를 보호할 수 있다.
만약 문이 제대로 잠겨있지 않거나 안전 잠금장치가 부실하다면 집 안으로 무단 침입당할 수 있으며,
이는 데이터베이스의 보안 취약점으로 이어질 수 있다.
따라서 트리거를 설계하고 구현할 때에는 이러한 보안 고려사항을 반드시 고려해야 한다.
'CS' 카테고리의 다른 글
S)DB_07_B tree, B+tree (1) | 2024.03.30 |
---|---|
S)DB_07_인덱스 (1) | 2024.03.30 |
S)DB_06_저장 프로시저 (1) | 2024.03.27 |
CSS)DB_05_Schema (0) | 2024.03.25 |
S)DB_04_RDBMS vs Nosql (3) | 2024.03.16 |