데이터베이스 히스토리 테이블 / 트래킹 테이블


13

현재 다음과 같이 추적 / 기록 테이블을 구성하고 싶습니다.

  • 기본 키-ID
  • OtherTableId-fk
  • fieldName-추적하는 필드 이름
  • OldValue
  • NewValue
  • 사용자 이름
  • CreateDateTime

기본적으로 다른 테이블 기록을 추적하고 변경된 필드의 열 이름을 새 값과 이전 값으로 저장하는 테이블을 만들고 싶습니다. 내 질문은 누구나 이것에 구멍을 뚫을 수 있습니까? 또한 추적하는 테이블의 열 이름 만 fieldName 열에 입력되도록하는 가장 쉬운 방법은 무엇입니까? 현재 내 옵션은 내가 구축중인 서비스에 열거 형을 두거나 다른 상태 테이블을 만들고 fieldName을 fk로 만드는 것입니다. 더 좋은 아이디어가 있습니까?

목표 수정 : 현재 추적해야 할 필드는 2 개뿐입니다. 한 필드는 웹 페이지에 표시되어 기록을 표시하고 다른 필드는 한 부서에서만 액세스하며 쿼리 할 수있는 데이터베이스보기에 액세스 할 수 있습니다. 누가이 필드를 쿼리하여 누가 필드를 변경했는지와 무엇을 변경해야하는지에 대한 정보를 얻었습니다. 이것이 테이블 레코드 히스토리의 정확한 사본이 아닌 데이터베이스 필드가 테이블 열을 정의하는 위치를 설정하려는 이유입니다. 앞으로 필드를 추가하거나 제거 할 수있는 가능성을 추적하는 두 개의 필드 만 원합니다.

감사!


몇 개의 테이블을 추적하는지 미리 알고 있습니까?
Kofi Sarfo

이 테이블은 다른 테이블 하나만 추적하며 지금까지는이 테이블 하나만 추적합니다.
user76982

따라서이 방법은 과도 할 수 있습니다. 더 나쁜 것은 스냅 샷을 다시 생성해야하는 시점에서 실시간으로 데이터를 재생성하기 위해 함께 모니터링되는 테이블을 사용하여이 테이블을 쿼리하는 것은 쉽지 않습니다.
Kofi Sarfo

1
반대로, 가장 자주 변경되는 열을 확인하는 쿼리는 제안한 접근 방식을 사용하면 더 쉽습니다.
Kofi Sarfo

dba.stackexchange.com 에서 검색 할 수 있습니다 . 비슷한 질문이 있으며 일부 답변을 사용할 수도 있습니다.
FrustratedWithFormsDesigner

답변:


8

구멍 뚫기 : 데이터베이스 스키마가 나중에 같은 시점에 변경되고 열 이름이 변경되거나 열이 완전히 삭제되면 어떻게됩니까? 많은 데이터베이스 시스템이이를 허용합니다. 그러면 "fieldName"은 어떻게됩니까?

데이터 무결성을 위해 : 모든 업데이트 또는 삭제 작업이 추적 테이블을 확실히 업데이트해야합니다. 이는 저장 프로 시저를 호출하는 트리거에 의해 가장 잘 수행됩니다. 저장 프로 시저에만 추적 테이블에 대한 쓰기 권한이 있는지 확인해야하므로 다른 사람이 잘못된 값을 쓸 수 없습니다.

DB 공급 업체별 솔루션을 사용할 수있는 경우 : 대부분의 DB 시스템에는 스키마 정보 (테이블 이름, 테이블 ID, 열 이름 등)가 저장된 시스템 테이블이 있습니다. 이러한 시스템 테이블에 대한 외래 키 참조를 설정할 수 있는지 확인할 수 있습니다. 데이터베이스가 이와 같은 것을 지원하는 경우 필드 이름을 필드 ID로 바꿀 수 있습니다.

실제로 작은 열의 하위 집합이 아닌 모든 열을 포함하여 특정 테이블의 전체 행을 추적해야하는 경우 @sarfeast의 제안을 고려해야합니다. 이름-값 쌍 모델의 단점에 대해이 기사 를 읽으십시오 .


8

내가 본 가장 성공적인 변경 감사 (기록 추적) 구현은 덜 일반적이고 훨씬 간단합니다. 여기에는 모니터링하려는 각 테이블에 대한 변경 로그 테이블을 작성하고 동일한 열 이름 및 데이터 유형을 유지합니다 (타임 스탬프에 대한 추가 열 포함).

최종 목표, 즉 감사 된 데이터로 수행하려는 목표는 각 접근 방식이 얼마나 적합한 지 평가하는 데 도움이됩니다.


Sarfeast 님, 달성하고자하는 최종 목표를 추가했습니다. 이것을 포함하지 않아서 죄송합니다.
user76982

이 방법에는 단점이 있습니다. 여기를 읽으십시오 : database-programmer.blogspot.co.uk/2008/07/history-tables.html
Tuukka Haapaniemi

7

간단히 말해 : 값 변경을 추적하려는 테이블에 대해 감사 추적 메커니즘 을 설정해야합니다 .

단일 감사 추적 테이블 :

테이블 이름, 필드 이름 abd 이전 및 새 버전의 데이터를 기록 할 테이블을 작성하십시오. 이 방법에서는 이전 버전과 새 버전의 데이터와 변경된 필드 만 기록하는 것이 일반적입니다. 이를 트리거로 구현하려면 테이블에 기본 키가 있거나 단일 행만 업데이트되어야합니다.

다음은이를 달성하는 방법에 대한 스크립트가 포함 된 유용한 게시물입니다. 감사 추적 작성

다른 유용한 참고 자료 :


두 번째 링크는 지금 나쁩니다.
Jeremy Harris

@cillosis, 이것을 알아 주셔서 감사합니다. 그것은 지금 업데이트됩니다 :)
Yusubov

3

아이디어 가 있는지 NHibernate Envers 프로젝트 문서 를 확인하십시오 .

기본적으로 타임 스탬프 또는 사용자와 같은 추가 데이터를 추가 할 수있는 하나의 리비전 테이블이 있습니다. 그런 다음 추적하는 각 테이블에는 모든 열이 복제되고 수정 테이블에 fk 및 수정 유형 (추가, 수정, 삭제)이있는 추가 감사 테이블이 표시됩니다. AFAIK, 감사 테이블이 실제 테이블에 대한 실제 FK를 갖기를 원하지 않으므로 삭제가 불가능합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.