문제

테이블을 감사하는 방법에 대한 주제는 최근에 우리의 토론에서 시작되었습니다 ... 그래서 나는 이것에 접근하는 가장 좋은 방법에 대한 당신의 의견을 좋아합니다. 우리는 이전의 각 DBA가 자신이 올바른 방법이라고 생각했던 것처럼 데이터베이스에서 두 가지 접근법 (좋지 않음)이 혼합되어 있습니다. 따라서 하나의 모델을 따라 가려면 변경해야합니다.

CREATE TABLE dbo.Sample(
Name VARCHAR(20),
...
...
Created_By VARCHAR(20),
Created_On DATETIME,
Modified_By VARCHAR(20),
Modified_On DATETIME
)

CREATE TABLE dbo.Audit_Sample(
Name VARCHAR(20),
...
...
Created_By VARCHAR(20),
Created_On DATETIME,
Modified_By VARCHAR(20),
Modified_On DATETIME
Audit_Type VARCHAR(1)  NOT NULL
Audited_Created_On DATETIME
Audit_Created_By VARCHAR(50)
)

Approach 1: 감사 테이블에 메인 테이블에서 교체/삭제 된 레코드 만 (시스템 테이블 삭제) 저장하십시오. 따라서 메인 테이블에서 각 업데이트 및 삭제마다 교체중인 레코드는 'upure'u '(업데이트) 또는'd '(삭제 용)로'Audit_type '열이있는 감사 테이블에 삽입됩니다.

인서트가 감사되지 않습니다. 모든 레코드의 현재 버전의 경우 항상 메인 테이블을 쿼리합니다. 그리고 역사의 경우 감사 테이블을 쿼리합니다.

장점 : 이전 버전의 레코드 단점을 저장하려면 직관적 인 것 같습니다. 특정 레코드의 기록을 알아야하는 경우 메인 테이블과 함께 감사 테이블에 가입해야합니다.

atpraoch 2 : 감사 테이블에 메인 테이블에 들어가는 모든 레코드 (시스템 테이블 삽입)를 저장하십시오.

메인 테이블에 삽입/업데이트/삭제되는 각 레코드도 감사 테이블에 저장됩니다. 따라서 새 레코드를 삽입하면 감사 테이블에도 삽입됩니다. 업데이트되면 새 버전 (삽입 된) 테이블이 감사 테이블에 저장됩니다. 삭제되면 이전 버전 (삭제 된) 테이블이 감사 테이블에 저장됩니다.

장점 : 특정 기록의 역사를 알아야한다면 한 위치에 모든 것이 있습니다.

나는 여기에 모든 것을 나열하지는 않았지만 각 접근 방식에는 장단점이 있습니까?

도움이 되었습니까?

해결책

나는 함께 갈 것이다 :

atpraoch 2 : 감사 테이블에 메인 테이블에 들어가는 모든 레코드 (시스템 테이블 삽입)를 저장하십시오.

아이템 당 한 줄이 실제로 DB를 죽일 것입니까? 이런 식으로 당신은 완전한 역사를 함께 가지고 있습니다.

행 (X 일보다 오래된 범위)을 제거하면 무언가가 변경되었는지 여부를 여전히 알 수 있습니다.

  • 감사 행이 존재하는 경우 (정화되지 않음) 문제의 행이 변경되었는지 확인할 수 있습니다.
  • 항목에 대한 감사 행이 존재하지 않으면 (모두 정화 됨) 아무것도 변경되지 않았습니다 (완전히 새로운 항목을 포함하여 감사 테이블에 변경이 작성되었으므로)

Ahbsaoch 1 : 그리고 범위를 제거하면 새로운 인서트와 모든 행이 제거 된 곳을 알려주는 것은 어려울 것입니다 (퍼지 날짜를 기억해야합니다).

다른 팁

우리가 많이 사용하는 세 번째 접근법은 흥미로운 열만 감사하고 각 행에 '새'및 '오래된'값을 모두 저장하는 것입니다.

따라서 "이름"열이 있으면 감사 테이블에는 "name_old"및 "name_new"가 있습니다.

삽입 트리거에서 선호도에 따라 "name_old"가 공백/null로 설정되고 "name_new"가 삽입에서 설정됩니다. 업데이트 트리거에서 "name_old"는 Deleted에서 설정되고 Delete Trigger에 삽입 된 "name_new"가 삭제 된 "name_old"가 삭제 된 "New_name"에서 blank/null로 설정됩니다.

(또는 모든 경우에 전체 가입과 하나의 트리거를 사용합니다)

Varchar Fields의 경우, 이것은 좋은 생각처럼 보이지 않을 수도 있지만 정수, DateTime 등의 경우 업데이트의 차이를 쉽게 볼 수 있다는 이점을 제공합니다.

즉, 실제 테이블에 수량 필드가 있고 5에서 7까지 업데이트되면 감사 테이블에 있습니다.

quantity_old  quantity_new
           5             7

특정 시간에 수량이 2 증가했다고 쉽게 계산할 수 있습니다.

감사 테이블에 별도의 행이있는 경우 차이를 계산하기 위해 "다음"과 함께 한 행에 가입해야합니다. 경우에 따라 까다로울 수 있습니다 ...

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