2010-07-06 3 views
6

PostgreSQL에서 Java/Spring/Hibernate를 사용하는 새로운 시스템을 구현하고 있습니다. 이 시스템은 테이블의 레코드에 대한 수정/삭제가 완료되면 즉시 모든 레코드의 복사본을 만들어야합니다. 나중에 Audit Table (들)은 Reports에 의해 질의되어 사용자에게 데이터를 표시합니다.PostgreSQL에서 테이블 수정의 감사/버전 관리 구현 방법

수정 된 행 (삭제 된 행)의 복사본을 "TO"테이블에 ENTITY_VERSIONS라는 테이블을 만들 수있는 트리거를 사용하여이 감사/버전 관리 기능을 구현할 계획이었습니다.이 테이블에는 약 20 개의 열 col1, col2, col3, col4 등으로 위의 표의 열을 저장합니다. 그러나 문제는 버전이 하나 이상인 테이블과 모든 테이블 버전을 저장하는 유일한 1 TARGET 테이블 (ENTITY_VERSIONS)이있는 경우 TARGET 테이블을 어떻게 디자인합니까?

또는 버전 관리가 필요한 각 테이블에 대한 VERSION 테이블의 COPY가 더 좋을까요?

감사/버전 관리를 구현하기위한 PostgreSQL 트리거 (및 관련 저장 프로 시저) 코드에 대한 일부 포인터를 공유 할 수 있다면 보너스가됩니다.

P.S : 나는 Suggestions for implementing audit tables in SQL Server?을 보았고, 어떤 유형이 OldValue와 NewValue가되어야 하는지를 알지 못한다는 점을 제외하고는 대답을 좀 좋아합니까?

P.P.S : 테이블에서 하드 삭제 대신 SOFT DELETE (팬텀 삭제)를 사용하는 경우 조언이 변경됩니까?

답변

4

나는 당신이 보관하고 싶은 테이블의 버전을 유지하기 위해 각 테이블의 복사본을 가지고 있습니다. 글로벌 버전 관리 테이블을 유지 관리하고 사용하는 것은 다소 악몽처럼 들립니다.

This link은 Postgres 문서에서 Postgres의 일부 감사 트리거 예제를 보여줍니다.

+0

+1 에 대해 작동합니다. "글로벌 감사 테이블"대 "각 테이블에 대한 감사 테이블"의 장점은보고 용 데이터를 쿼리하는 것입니까? – anjanb

+1

어떻게 든 GLOBAL 감사 테이블을 관리하는 경우, 나는 타입 캐스팅을 많이 예상합니다. 내 말은 ... 어떤 기둥을 모든 유형에 저장할 것인가? – rfusca

+0

rfusca : 오른쪽. 예, 그것은 나의 의심이었습니다! – anjanb

2

전역 테이블에서 모든 열을 hstore 유형으로 단일 열에 저장할 수 있습니다. 방금 감사를 시도했는데 훌륭하게 작동합니다. 좋습니다. 굉장한 감사 테이블 예제는 감사 기록을 유지하기 시작할 테이블에 트리거를 추가하기 만하면 단일 테이블의 모든 변경 사항을 추적합니다. 모든 변경 사항은 v 9.1 + this link