2009-03-17 5 views
0

나는 데이터베이스에서 히스토리를 가지고, 완료된 삽입/삭제/업데이트를 추적하는 가장 좋은 방법이 무엇인지 알아 내려고합니다. 내역 데이터는 사용자가 사용할 것이므로 프런트 엔드에 코딩해야합니다. 데이터가 여러 테이블에 분산되어 있으므로 "내역 테이블"(내역 저장에 사용되는 각 테이블의 복사본)을 만드는 것은 좋은 방법이 아닙니다.클라이언트 사용을위한 데이터베이스 히스토리

지금 시점에서 사용자에게 보여주고 싶은 출력이 테이블에 반영되도록 몇 가지 기록 테이블을 만드는 것이 가장 좋습니다. 특정 테이블을 변경할 때마다이 기록 테이블을 데이터로 업데이트 할 것입니다.

저는 앞으로 나아갈 수있는 최선의 방법이 무엇인지 알아 내려고하고 있습니다. 모든 제안을 주시면 감사하겠습니다. 나는 매우 성공적으로 모든 테이블은 감사 사본이있는 모델을 사용하고 오라클 + VB.NET

+0

http : // stackoverflow를 참조하십시오.com/questions/323065/323109 # 323109 –

답변

2

을 사용하고

- 같은 테이블 몇 가지 추가 필드 (타임 스탬프, 사용자 ID, 작업 유형을), 첫 번째 테이블에서 삽입/업데이트/삭제를위한 3 개의 트리거.
테이블과 트리거가 모델에서 생성 될 수 있고 관리 관점에서 약간의 오버 헤드가 있기 때문에 이것이 이것을 처리하는 매우 좋은 방법이라고 생각합니다. 응용 프로그램은 테이블을 사용하여 사용자에게 감사 내역을 표시 할 수 있습니다 (읽기 전용).

+0

기본 키, 고유 한 제약 조건 등을 변경해야 할 수도 있습니다. – dotjoe

+0

@dotjoe : 감사 테이블은 다른 테이블이며 같은 테이블에있는 다른 레코드가 아닙니다. –

+0

수정. 감사 테이블에는 조건 또는 색인이없고 원시 데이터 만 있습니다. 감사의 목적은 이름입니다. 데이터를 UI로 되돌려 야 할 필요가 있다면, 그것은 아마도 다른 비즈니스 사례 일 수 있으며 운영 모델의 일부로 다른 것을 설계하고 싶을 수도 있습니다. – cdonner

0

Google 시스템에는 이러한 요구 사항이 있습니다. AuditRow와 AuditField라는 두 개의 테이블, 하나의 헤더, 하나의 세부 사항을 추가했습니다. AuditRow는 다른 테이블에서 변경된 행당 하나의 행을 포함하며 AuditField는 이전 값 및 새 값으로 변경된 열당 하나의 행을 포함합니다.

각 삽입/업데이트/삭제에서 헤더 행 (AuditRow)과 필요한 세부 행 (변경된 열마다 하나씩)을 기록하는 모든 테이블에 트리거가 있습니다. 이 시스템은 행을 고유하게 나타낼 수있는 모든 테이블에 대한 guid가 있다는 사실에 의존합니다. "비즈니스"또는 "기본"키일 필요는 없지만 감사 테이블에서 식별 할 수 있도록 해당 행에 대한 고유 한 식별자입니다. 챔피언처럼 작동합니다. 잔인한가요? 아마,하지만 우리는 결코 감사관에게 문제가 없었습니다. :-)

그리고 예, 감사 테이블은 시스템에서 가장 큰 테이블입니다. 당신은 오라클 11g에있을 정도로 운이 좋은 경우에

0

를 사용할 수 있습니다, 나는 트리거 멀리 것이다. 디버깅을 할 때 악몽이 될 수 있으며, 수평 확장을 원한다면 반드시 최선은 아닙니다.

INSERT/UPDATE/DELETE를 수행하기 위해 PL/SQL API를 사용하는 경우, 히스토리 테이블에 대한 필요없이 (앞쪽으로) 설계를 간단하게 변경하여이를 관리 할 수 ​​있습니다.

DATE_FROM 및 DATE_THRU라는 두 개의 추가 열만 있으면됩니다. 레코드가 INSERT되면 DATE_THRU는 NULL로 남습니다. 해당 레코드가 UPDATEd 또는 DELETEd이면 DATE_THRU를 현재 날짜/시간 (SYSDATE)으로 지정하여 레코드를 "종료"합니다. 기록을 보여주는 것은 테이블에서 선택하는 것만 큼 간단합니다. DATE_THRU가 NULL 인 레코드 하나가 현재 또는 활성 레코드가됩니다.

변경 사항이 많을 것으로 예상되는 경우 이전 기록을 기록 테이블에 기록하는 것이 좋지만 여전히 트리거로 관리하지는 않습니다. API를 사용하여 기록합니다.

희망이 있습니다.

관련 문제