이것이 감사 트레일을 만드는 가장 좋은 방법입니까?
문제
해당 페이지의 기반에 날짜가있는 감사와 함께 주어진 사용자 양식의 데이터가 시간이 지남에 따라 어떻게 변경되었는지에 대한 감사 트레일을 유지하는 기능을 만들려고합니다. 예를 들어:
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)를위한 좋은 응용 프로그램처럼 보이며, 여기서 많은 메타 데이터를 필요로하지 않고도 의미있는 것을 버릴 수있는 객체 모델에 반사를 사용할 수 있습니다.