데이터 이력 저장 (복사) 사용 시 테이블 구조 변경으로 인한 불편함 0 7 1,320

by sophistor [Oracle 기초] [2022.08.25 09:29:30]


일단 오라클을 사용중입니다.

 

시스템을 운영하면서 데이터의 이력을 남기는 경우

이력을 남기기 위해서 valid 컬럼을 변경하고, 시간을 변경합니다.

이때, 만약 나중에 테이블 구조가 변경된다면, 기존에 만들어 놓은 쿼리를 모두 수정해야해서 

혹시 이를 위해서 지원하는 기능이 있는지 궁금해서 질문남깁니다.

 

예)

테이블 구조 :

create table abc
(
data1 varchar(2000)
date varchar(8)
time varchar(8)
valid varchar(1)
)

이력 저장 sql :

insert into abc (data1, date, time, valid)
select data1, date, time, valid from abc

 

테이블 구조 변경 :
create table abc
(
data1 varchar(2000)
date varchar(8)
time varchar(8)
valid varchar(1)
data2 varchar(2000)
data3 varchar(2000)
)

기존의 이력 저장 sql 사용시 data2, data3이 비어 있음으로 문제가 발생합니다.

다른 방법으로 이력을 저장하는 기능이 있을까요..?

감사합니다.

by 마농 [2022.08.25 10:00:36]

data2, data3 항목을 왜 추가하려 하나요?
아마도 변경전 데이터를 표현하기 위함인 듯 한데. 맞나요?
변경전 데이터는 컬럼이 아닌 레코드 형태로 이미 저장이 되어 있을 것입니다.
조회 시 필요하다면 쿼리로 충분히 가져올 수 있는 부분이므로 테이블 컬럼 추가는 추천하지 않습니다.


by sophistor [2022.08.25 10:22:09]

마농님. 답변 감사합니다.
data2, data3의 추가는
변경전 데이터를 표현하기 위함은 아닙니다.
업무적으로 추가적인 정보 저장이 필요해서 입니다.


by 마농 [2022.08.25 11:07:41]

기존 쿼리 변경 없이 등록 가능하게 하려면?
- Default 값 설정 방법이나
- Before Insert 트리거 방식
등이 가능할지 검토해 보세요.
추가 항목이 뭔지? 어떻게 가져와야 하는지? 등에 따라 가능여부가 결정되겠네요.


by 포동푸우 [2022.08.25 10:51:32]

데이터 이력을 테이블 구조변경 없이 남기기 위해서, 보통의 아래의 방법들 중에 선택합니다. 

1. 해당 테이블에 Audit 를 위한 다수 컬럼 추가 ex> 최초입력자ID, 최초입력일시, 최종변경자ID, 최종변경일시 + 프로그램ID + 접속주소 etc.... 

2. 해당 테이블에 DML Type 컬럼을 추가하고, 모든 데이터는 Insert 만 허용합니다. ex> Update 는 추가 컬럼에 Update 를 표기하고 PK 컬럼 및 변경된 컬럼에 변경된 Data 입력, Delete 는 추가 컬럼에 Delete 입력하고 PK 컬럼에 데이터 입력 ==> ODS 용 테이블로 설계 때 사용하는 방법 


by 포동푸우 [2022.08.25 10:56:05]

3. 기존 테이블 외 별도의 이력 테이블을 생성하고, 추가된 이력 테이블에는 변경타입, 변경일시 등 추가 컬럼을 추가,, 이후에 데이터 변경을 2개 테이블에 동시에 변경 ==> 기존 테이블은 변경 없고, 이력 테이블은 유지,, 법령에 따라 일부 테이블 처리 

 

Oracle, PostgreSQL, MariaDB, Tibero 등에서 말씀하신 기능이 지원 되는지는 보지 못했고, 특정 DB 에서 기능이 지원 되도라도,, 호환성/확장성을 위해서 DBMS 기능이 아닌 데이터구조로 처리하는 것이 더 좋을 것 같습니다. 


by 창조의날개 [2022.08.25 11:27:40]

이력 저장 sql :

insert into abc (data1, date, time, valid)
select data1, date, time, valid from abc

이력저장 SQL이라고 하신 쿼리가 같은 테이블 데이터를 같은 테이블에 넣는데 테이블명이 잘못 된거죠?

 

보통은 원본 테이블이 있고 이력테이블이 따로 존재 할텐데...

원본 테이블에 컬럼을 추가 하면 당연히 이력테이블에도 컬럼을 추가 하는 DBA의 작업이 이루어지겠죠.

원본 테이블에 컬럼을 추가 했다면 업무 요건이 바뀌었을테고 그럼 프로그램 수정이 발생하면 이력저장하는 부분도 함께 프로그램 변경이 이러나는게 정상입니다.

테이블 구조가 바뀌는걸 자동으로 감지하고 자동으로 이력테이블 구조도 바꾸고 이력도 자동으로 넣어주는 기능은 없는게 당연할겁니다.

뭐 꼭 필요하다면 테이블 구조가 바뀌는지 감시하는 프로시저를 만들어 주기적으로 실행하고, 바뀌었을 경우 이력테이블의 구조를 변경하고 트리거를 만들어서 자동으로 데이터를 백업하도록 배치작업을 만들면 가능도 하겠지만... 위험부담도 크고 DDL을 직접 프로시저로 만들어 쓰는것도 비추지만 만든다고 하면 만들수는 있을듯 합니다.


by 우리집아찌 [2022.08.25 11:46:40]

테이블이 정규화 되어있었으면 구분값으로 date2 , date3 관리가 되었을듯한데요.

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입