문제

해당 페이지의 기반에 날짜가있는 감사와 함께 주어진 사용자 양식의 데이터가 시간이 지남에 따라 어떻게 변경되었는지에 대한 감사 트레일을 유지하는 기능을 만들려고합니다. 예를 들어:

02/04/09 21:49 이름이 "Tom"에서 "Chris"로 변경되었습니다.

세션에서 데이터를 현재 형식으로 저장 한 다음 저장된 데이터에 차이가 있는지 확인하여 저장 하여이 작업을 수행하고 있습니다. 있다면, 나는 히스토리라는 테이블에서 최신 편집 이전의 데이터를 저장하고 현재 사용자 테이블에 새 값을 저장하고 있습니다.

이것이 최선의 접근 방식입니까?

도움이 되었습니까?

해결책

하나의 제안; 데이터베이스 트리거에서는 비교적 쉽습니다. 이 경우 업데이트를 실행하는 코드가 히스토리 레코드를 추가 한 것으로 기억하는지 걱정할 필요가 없습니다.

다른 팁

"최상의 접근 방식"이 하나인지 확신하지 못합니다. 개발 경로가 얼마나 멀리 떨어져 있는지를 포함하여 고려해야 할 변수가 너무 많습니다.

코드 기반 및 DB 트리거 감사 솔루션을 모두 살펴본 결과 아래에 몇 가지 의견을 나열했습니다. (개발 측면에서) 현재 어디에 있는지 확인할 수 있기를 바랍니다.

  • 데이터를 변경 한 사용자를 매핑 해야하는 경우 (일반적으로 수행하는) DB 트리거는이 정보를 어떻게 든 가져와야합니다. 불가능하지는 않지만 더 많은 작업 과이 접근 방법 (DB 사용자 실행 쿼리, 각 테이블의 공통 사용자 열 등)
  • DB 트리거를 사용하고 쿼리에서 반환 된 영향을받는 행 카운트에 의존하는 경우 감사 트리거는이 꺼져 있거나 기존 코드를 설명하도록 수정해야합니다.
  • IMHO DB 트리거는 더 많은 보안을 제공하고 감사 자동화를 더 쉬운 경로를 제공하지만 적절한 액세스가있는 사람은 트리거를 비활성화하고 데이터를 수정 한 다음 다시 활성화 할 수 있으므로 완벽하지 않습니다. 즉, DB 보안 액세스 권한이 빡빡한지 확인하십시오.
  • 단일 테이블 옵션을 사용하는 경우, 이것에 소비 할 시간이 많지 않으면, 삽입물을 피하려고 유혹 할 수는 있지만 업데이트 나 삭제에 대해서만 감사를 시도하는 데 너무 멋진 시간을 가지지 마십시오 (대부분의 앱에서는이 작업을 수행하기 때문에 감사 기록을 재구성하는 데는 상당한 작업이 필요합니다.
  • 서버 나 데이터가 여러 시간 Zones에 걸쳐있는 경우 타임 라인을 저장하고 재구성 할 수있는 적절한 DateTime 유형을 사용하여 UTC의 감사 이벤트 날짜 및 TimeZone 오프셋을 포함하여 저장 감사 이벤트 날짜를 고려하십시오.
  • 이러한 감사 테이블은 엄청날 수 있으므로 성능에 영향을 미치기 시작하면 전략이 있습니다. 옵션은 다른 디스크, 아카이브 등에 테이블 파티셔닝을 포함합니다. 기본적으로 문제가 될 때가 아니라 지금 여기에 대해 생각합니다 :)

나는 항상 "활성"테이블과 "히스토리"테이블로 분해하는 대신 하나의 테이블을 사용하는 팬이었습니다. 이 테이블에 4 개의 열을 넣고 모든 타임 스탬프 : 생성, 삭제, 시작, 끝. "생성"및 "삭제"는 상당히 자명합니다. "시작"및 "종료"타임 스탬프는 레코드가 실제로 "활성"레코드 일 때입니다. 현재 활동적인 레코드는 이전에 "시작"시간이 있습니다. now() 그리고 a NULL "종료"시간. "생성 된"및 "시작"시간을 분리하면 향후 변경 사항을 예약 할 수 있습니다.

이 디자인은 2 테이블 디자인과 달리 올바른 데이터에서 자동으로 작동하는 쿼리를 쉽게 쓸 수 있습니다. 테이블이 시간이 지남에 따라 세율을 저장한다고 가정 해 봅시다. 계산에 세율을 사용하는 모든 질문을 원하지 않는다. 예 : 송장이 현재 세율인지 아닌지에 관계없이 송장이 하나의 질문에 생성 된 시점에 적용되는 세율을 찾을 수 있습니다.

온라인 책.

세션 참여는 저를 조금 조심스럽게 만듭니다 (두 사용자가 동시에 동일한 데이터를 동시에 작업 할 때 올바르게 처리하고 있습니까?), 일반적으로 기록 테이블을 유지하는 것이 옳은 일입니다.

또한 레코드의 해시 또는 CRC 계산과 같은 데이터가 앱의 외식을 변경하고 어딘가에 필드에 저장 한 다음 데이터를 읽을 때 확인하기 위해 검출 할 수있는 작업을 수행 할 수도 있습니다.

이것은 또한 AOP (Aspects)를위한 좋은 응용 프로그램처럼 보이며, 여기서 많은 메타 데이터를 필요로하지 않고도 의미있는 것을 버릴 수있는 객체 모델에 반사를 사용할 수 있습니다.

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