DB 애플리케이션에 대한 감사 추적/변경 내역을 남기는 효과적인 전략은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/23770

문제

상당히 복잡한 데이터베이스에서 데이터의 변경 내역을 유지하기 위해 사람들이 성공한 전략은 무엇입니까?제가 자주 사용하고 개발하는 응용 프로그램 중 하나는 시간이 지남에 따라 레코드가 어떻게 변경되었는지 추적하는 보다 포괄적인 방법을 통해 실제로 이점을 얻을 수 있습니다.예를 들어, 현재 레코드에는 여러 개의 타임스탬프와 수정된 사용자 필드가 있을 수 있지만 현재로서는 작업이 롤백되는 경우와 같이 여러 변경 사항을 기록하는 체계가 없습니다.완벽한 세상에서는 매번 저장한 후 기록을 그대로 재구성하는 것이 가능할 것입니다.

DB에 대한 몇 가지 정보:

  • 주당 수천 건의 레코드를 늘릴 수 있는 용량 필요
  • 50-60 테이블
  • 기본 개정 테이블에는 각각 수백만 개의 레코드가 있을 수 있습니다.
  • 합리적인 양의 외래 키 및 인덱스 세트
  • PostgreSQL 8.x 사용
도움이 되었습니까?

해결책

과거에는 트리거를 사용하여 db 업데이트/삽입/삭제 로깅을 구성했습니다.

특정 테이블에서 위 작업 중 하나가 수행될 때마다 해당 작업, 해당 작업을 수행한 DB 사용자, 타임스탬프, 작업이 수행된 테이블 및 이전 값을 추적하는 로깅 테이블에 레코드를 삽입할 수 있습니다.

실제 삭제 또는 업데이트가 수행되기 전에 값을 캐시해야 하기 때문에 더 나은 대답이 있을 수 있다고 생각합니다.하지만 이를 사용하여 롤백을 수행할 수 있습니다.

다른 팁

사용할 수 있는 전략 중 하나는 MVCC(다중 값 동시성 제어)입니다.이 구성표에서는 테이블을 업데이트하지 않고 삽입만 수행하고 각 레코드의 버전 번호를 유지합니다.이는 어느 시점에서든 정확한 스냅샷을 제공할 수 있다는 장점이 있으며, 많은 데이터베이스를 괴롭히는 업데이트 잠금 문제를 완전히 피할 수도 있습니다.

그러나 이는 거대한 데이터베이스를 만들고 레코드의 현재 버전을 선택하려면 추가 절이 필요한 모든 항목을 선택합니다.

Hibernate를 사용하고 있다면 다음을 살펴보십시오. JBoss 엔버스.프로젝트 홈페이지에서:

Envers 프로젝트는 지속적인 JPA 클래스의 쉬운 버전 관리를 목표로 합니다.당신이 해야 할 일은 버전을 지정하려는 영구 클래스나 해당 속성 중 일부에 @Versioned로 주석을 다는 것뿐입니다.버전이 지정된 각 엔터티에 대해 엔터티에 대한 변경 내역을 보관하는 테이블이 생성됩니다.그러면 많은 노력 없이 기록 데이터를 검색하고 쿼리할 수 있습니다.

이는 다음과 다소 유사합니다. 에릭의 접근 방식, 그러나 아마도 훨씬 적은 노력이 필요할 것입니다.하지만 데이터베이스에 액세스하는 데 어떤 언어/기술을 사용하는지 모르겠습니다.

트리거를 사용할 때의 유일한 문제점은 삽입/업데이트/삭제의 성능 오버헤드가 추가된다는 것입니다.더 높은 확장성과 성능을 위해 데이터베이스 트랜잭션을 최소한으로 유지하려고 합니다.트리거를 통한 감사는 트랜잭션 수행에 필요한 시간을 늘리며, 볼륨에 따라 성능 문제가 발생할 수 있습니다.

또 다른 방법은 Oracle의 경우처럼 데이터베이스가 "Redo" 로그를 마이닝하는 방법을 제공하는지 탐색하는 것입니다.리두 로그는 데이터베이스가 실패하여 복구해야 하는 경우 데이터를 다시 생성하는 데 사용되는 것입니다.

트리거와 유사하게(또는 트리거를 사용하여) 모든 트랜잭션이 비동기적으로 로깅 이벤트를 실행하도록 하고 다른 프로세스(또는 스레드)가 실제로 로깅을 처리하도록 할 수 있습니다.애플리케이션에 따라 이를 구현하는 방법에는 여러 가지가 있습니다.첫 번째 트랜잭션에서 불필요한 로드가 발생하지 않도록 애플리케이션에서 이벤트를 실행하도록 하는 것이 좋습니다(이로 인해 계단식 감사 로그가 잠기는 경우도 있음).

또한 감사 데이터베이스를 별도의 위치에 보관하여 기본 데이터베이스의 성능을 향상시킬 수도 있습니다.

저는 PostgreSQL이 아닌 SQL Server를 사용하므로 이것이 효과가 있을지 확신할 수 없습니다. 하지만 Pop Rivett는 여기에서 감사 추적 생성에 대한 훌륭한 기사를 제공했습니다.Pop rivett의 SQL Server FAQ No.5:감사 추적에 참여하세요

감사 테이블을 구축한 다음 감사하려는 각 테이블에 대한 트리거를 만듭니다.

힌트:사용 코드스미스 트리거를 구축합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top