데이터베이스에서 데이터의 변경 이력을 관리하는 것은 매우 중요하다.
사용자가 데이터를 수정하거나 삭제하는 경우, 그 내역을 저장하여 추후에 어떤 변경이 있었는지 추적할 수 있어야 한다.
이를 위해 Oracle에서는 트리거를 사용하여 테이블의 수정 이력을 관리할 수 있다.
이번 포스팅에서는 트리거를 이용하여 수정 이력을 관리하는 방법을 알아보자.
1. 사용자 작업 테이블 생성
먼저 사용자가 직접 데이터를 삽입(insert), 수정(update), 삭제(delete)할 수 있는 테이블을 생성한다.
예를 들어, users 테이블이라고 가정하여 생성해 보자.
(실제 운영 테이블은 예시와는 비교도 안될 정도로 복잡할텐데, 예시니까^^. 참조만 부탁드립니다)
CREATE TABLE users (
id NUMBER PRIMARY KEY,
name VARCHAR2(100),
email VARCHAR2(100)
);
위의 SQL 문을 실행하면 users 테이블이 생성된다.
이 테이블에는 사용자의 ID, 이름, 이메일 주소를 저장할 수 있다.
2. 히스토리 테이블 생성
다음으로 users 테이블의 변경 내역을 저장할 히스토리 테이블을 생성한다.
users_history 테이블은 users 테이블과 동일한 구조를 가지되, 추가적으로 수정 시각(modified_at)과 수정 유형(modification_type) 컬럼을 포함한다.
CREATE TABLE users_history (
id NUMBER,
name VARCHAR2(100),
email VARCHAR2(100),
modified_at TIMESTAMP,
modification_type VARCHAR2(10)
);
modified_at 컬럼은 데이터가 수정된 시각을 저장하며, modification_type 컬럼은 어떤 유형의 수정이 있었는지를 저장한다. 삽입(insert), 수정(update), 삭제(delete)와 같은 트랜잭션에 대한 유형을 뜻한다.
3. 트리거 생성
이제 users 테이블에서 발생하는 데이터 변경을 감지하고, 이를 users_history 테이블에 기록하는 트리거를 생성한다.
아래는 users 테이블에 대한 트리거를 생성하는 예시다.
CREATE OR REPLACE TRIGGER users_trigger
AFTER INSERT OR UPDATE OR DELETE ON users
FOR EACH ROW
BEGIN
IF INSERTING THEN
INSERT INTO users_history (id, name, email, modified_at, modification_type)
VALUES (:NEW.id, :NEW.name, :NEW.email, SYSTIMESTAMP, 'INSERT');
ELSIF UPDATING THEN
INSERT INTO users_history (id, name, email, modified_at, modification_type)
VALUES (:NEW.id, :NEW.name, :NEW.email, SYSTIMESTAMP, 'UPDATE');
ELSIF DELETING THEN
INSERT INTO users_history (id, name, email, modified_at, modification_type)
VALUES (:OLD.id, :OLD.name, :OLD.email, SYSTIMESTAMP, 'DELETE');
END IF;
END;
/
이 트리거는 users 테이블에 데이터가 삽입, 수정, 삭제될 때마다 자동으로 실행된다.
각 작업에 따라 users_history 테이블에 해당 내역을 기록한다.
- INSERTING: 데이터가 삽입될 때, 새로운 데이터(:NEW.*)를 users_history 테이블에 기록하고, 수정 유형을 'INSERT'로 설정
- UPDATING: 데이터가 수정될 때, 수정된 데이터(:NEW.*)를 users_history 테이블에 기록하고, 수정 유형을 'UPDATE'로 설정
- DELETING: 데이터가 삭제될 때, 기존 데이터(:OLD.*)를 users_history 테이블에 기록하고, 수정 유형을 'DELETE'로 설정
결론
이번 포스팅에서 Oracle 데이터베이스에서 테이블의 수정 이력을 관리하는 방법에 대해 알아보았다.
두 개의 테이블(users와 users_history)을 생성하고, 트리거를 이용하여 users 테이블의 변경 내역을 users_history 테이블에 자동으로 기록하는 방법이라고 생각하면 된다.
이를 통해 데이터의 변경 이력을 효과적으로 관리할 수 있다.
데이터베이스의 신뢰성을 높이고, 추후에 발생할 수 있는 문제를 쉽게 추적할 수 있으므로 실무에서 이력 관리가 필요한 테이블에 대해서 유용하게 활용하자.
'Dev > DB' 카테고리의 다른 글
[ORACLE] 오라클 쿼리 로그 확인하기 (0) | 2024.08.13 |
---|---|
[DB] SQL에서 순차적인 번호 부여하기: ROW_NUMBER() 함수 사용법 (0) | 2024.07.17 |
[ORACLE] 데이터 랜덤값으로 변경하기(dbms_random) (0) | 2024.04.30 |
[ORACLE] 시퀀스(Sequence) 생성, 변경, 삭제 (0) | 2024.03.18 |
[ORACLE] ORA-29861: domain index is marked LOADING/FAILED/UNUSABLE (0) | 2024.02.29 |