728x90
반응형

데이터베이스에서 데이터의 변경 이력을 관리하는 것은 매우 중요하다.

사용자가 데이터를 수정하거나 삭제하는 경우, 그 내역을 저장하여 추후에 어떤 변경이 있었는지 추적할 수 있어야 한다.

이를 위해 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 테이블에 자동으로 기록하는 방법이라고 생각하면 된다.

이를 통해 데이터의 변경 이력을 효과적으로 관리할 수 있다.

데이터베이스의 신뢰성을 높이고, 추후에 발생할 수 있는 문제를 쉽게 추적할 수 있으므로 실무에서 이력 관리가 필요한 테이블에 대해서 유용하게 활용하자.


728x90
반응형