
데이터베이스 트리거(Database Trigger)DB/etc2023. 10. 10. 13:07
Table of Contents
테이블에 대한 이벤트에 반응해 자동으로 실행되는 작업
트리거는 데이터 조작 언어(DML)의 데이터 상태의 관리를 자동화하는 데 사용된다.
<가상의 주문 관리 시스템을 가정하고, 주문 데이터베이스 테이블에서 트리거를 사용하는 상황>
무결성 제약 조건 유지
- 상황: 주문 테이블(Order)에 주문 금액(OrderAmount)이 양수인 경우만 허용
- 트리거: 주문 테이블에 INSERT 또는 UPDATE가 발생할 때마다 주문 금액이 음수인지 확인
CREATE TRIGGER CheckOrderAmount
ON Orders
AFTER INSERT, UPDATE
AS
BEGIN
IF EXISTS (SELECT 1 FROM INSERTED WHERE OrderAmount < 0)
BEGIN
ROLLBACK TRANSACTION; -- 주문 금액이 음수인 경우 롤백
RAISEERROR('주문 금액은 양수여야 합니다.');
END
END
이 트리거는 주문 테이블에 새 주문이 삽입되거나 주문이 갱신될 때마다 실행되어
주문 금액이 음수인 경우 해당 주문을 거부
이력 추적
- 상황: 주문 데이터의 변경 내역을 추적
- 트리거: 주문 테이블(Order)의 변경 내역을 추적하기 위한 이력 테이블(OrderHistory)에 변경 내역을 기록
CREATE TRIGGER OrderHistoryTrigger
ON Orders
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
IF EXISTS (SELECT * FROM INSERTED)
BEGIN
-- 주문이 삽입 또는 갱신될 때
INSERT INTO OrderHistory (OrderID, ChangeType, ChangeDate)
SELECT OrderID, 'INSERT/UPDATE', GETDATE()
FROM INSERTED;
END
ELSE
BEGIN
-- 주문이 삭제될 때
INSERT INTO OrderHistory (OrderID, ChangeType, ChangeDate)
SELECT OrderID, 'DELETE', GETDATE()
FROM DELETED;
END
END
이 트리거는 주문 테이블에 주문이 삽입, 갱신 또는 삭제될 때마다
해당 변경 내역을 OrderHistory 테이블에 기록
보안 강화
- 상황: 주문 테이블에 대한 읽기/쓰기 권한을 제한하고, 관리자만이 주문 데이터를 수정할 수 있도록
- 트리거: 주문 테이블에 INSERT, UPDATE, DELETE 작업을 수행하기 전에 사용자 권한을 확인
CREATE TRIGGER CheckUserRole
ON Orders
INSTEAD OF INSERT, UPDATE, DELETE
AS
BEGIN
-- 현재 사용자 역할(Role)을 확인하여 관리자인 경우만 작업 허용
IF (SELECT USER_ROLE FROM UserRoles WHERE UserName = CURRENT_USER) = 'Admin'
BEGIN
-- 실제 INSERT, UPDATE, DELETE 작업을 수행
INSERT INTO Orders (...) SELECT ... FROM INSERTED;
UPDATE Orders SET ... FROM INSERTED WHERE ...;
DELETE FROM Orders WHERE ...;
END
ELSE
BEGIN
RAISEERROR('권한이 없습니다.');
END
END
이 트리거는 사용자의 역할을 확인하고 관리자인 경우에만 주문 데이터를 수정하도록 허용
'DB > etc' 카테고리의 다른 글
OPENQUERY (0) | 2023.10.05 |
---|---|
MSSQL 자동 증가 열(IDENTITY)과 시퀀스(Sequence) (0) | 2023.10.05 |
MSSQL OPTION(RECOMPILE) (1) | 2023.10.05 |
매핑 테이블(mapping table) (1) | 2023.10.05 |
DB 트랜잭션 (0) | 2023.10.05 |