복붙노트

[SQL] 역사 / 감사 데이터베이스

SQL

역사 / 감사 데이터베이스

이 질문은 여기 내 다른 질문 중 하나에서 찾을 수 있습니다 스키마 관련이있다. 기본적으로 내 데이터베이스에서 나는 다른 것들 사이에 사용자, 위치 센서를 저장합니다. 이러한 모든 것들이 사용자에 의한 시스템의 편집 및 삭제 가능합니다.

그러나 - 항목을 편집하거나 내가 이전 데이터를 저장할 필요가 삭제 될 때; 나는 데이터를 변경하기 전에 무엇인지 볼 수 있어야합니다.

예 : "읽기"로 데이터베이스에서 편집 할 수없는 항목도 있습니다. 그들은 정말 로그의 더 많은 것이다. 독서는 특정 센서에 대한 판독 때문에, 센서에 대해 기록된다.

나는 독서의 보고서를 생성 할 경우에, 나는 위치 또는 센서의 속성이 독서의 시간에 무엇인지 볼 수 있어야합니다.

기본적으로 나는 특정 시점의 데이터를 재구성 할 수 있어야한다.

지금, 나는 전에이 일을하고 편집 가능한 각 테이블에 다음 열을 추가하여 잘 작동하고있어 :

valid_from
valid_to
edited_by

valid_to은 9999-12-31 23시 59분 59초은 그 현재 레코드입니다 =합니다. valid_to가 VALID_FROM 같다면, 그 기록은 삭제됩니다.

그러나, 나는 내가 외래 키 일관성을 적용하는 데 사용하는 데 필요한 트리거와 행복한 적이 없었다.

나는 아마도 "PostgreSQL의"데이터베이스 확장을 사용하여 트리거를 방지 할 수 있습니다. 이것은 당신이 두 날짜 사이의 기간을 저장할 수 있습니다 "기간"라는 열 유형을 제공 한 다음 중복 기간을 방지하기 위해 CHECK 제약 조건을 수행 할 수 있습니다. 그건 해답이 될 수 있습니다.

또 다른 방법이 있는지하지만 궁금입니다.

나는 사람들이 특별한 역사적 테이블을 사용하여 언급 본 적이 있지만 나는 (여전히 가능성이 될 수도 있지만) 거의 모든 1 테이블 2 개 테이블을 maintainling의 생각처럼 정말하지 않습니다.

valid_to이 9999-12-31 23시 59분 59초입니다 즉 레코드 만에 제약을 확인하기 위해 귀찮게 - 어쩌면 내가 "현재"없는 기록의 일관성을 확인 귀찮게하지 내 초기 구현을 줄일 수 있습니다. Afterall는, 역사적 테이블을 사용하는 사람들은 해당 테이블 (같은 이유로, 당신은 트리거를 필요할 것)에 제약 조건 검사를하지 않는 것.

사람이 이것에 대해 어떤 생각을 가지고 있습니까?

추신 - 제목도 감사 데이터베이스를 언급하고있다. 내가 언급 이전 시스템에서는 항상 edited_by 필드가있다. 이것은 우리가 항상 기록을 변경하는 사람들 볼 수 있도록 모든 변경 사항을 추적 할 수있었습니다. 할 수있는 것을 얼마나 차이가 확실하지.

감사.

해결법

  1. ==============================

    1.좋아, 내가 앉아 어디 사이에 간격이 (완전 감사 데이터베이스를 제공는, 당신은의 특정 요구 사항 인) 당신이 앉아 여기서 질문이나 의견에 따라. 어떤 우리는 아마 해설에서 작동합니다. 여기에서 시작하는 위치입니다.

    좋아, 내가 앉아 어디 사이에 간격이 (완전 감사 데이터베이스를 제공는, 당신은의 특정 요구 사항 인) 당신이 앉아 여기서 질문이나 의견에 따라. 어떤 우리는 아마 해설에서 작동합니다. 여기에서 시작하는 위치입니다.

    음 ... 아니. 그것은 중요한 정보를 보유하는 데이터베이스입니다; 참조 무결성 아닌 스크래치 패드로, 그래서 사용자가 뭔가를 "삭제"거기에 걸어 수 없습니다. (, 경고, 긍정, 액션, 다운로드 읽기에)이 기록 데이터를 유지하기 위해 동일한 사용자 요구 사항에 위배됩니다.

    또한 제외 : 다운로드; 감사의 글; 행위.

    그리고 참조 테이블 : SensorType; 을 alertType; ActionType.

    그리고 새로운 역사 테이블 :가 삽입되지만, 업데이트 또는 삭제할 수 없습니다.

    필요한 모든 것은 각 변경 테이블에 대한 히스토리 테이블입니다. 나는 네 확인 테이블에 대한 Hiistory 테이블을 제공 한 : 위치; 감지기; NetworkSlave; 및 사용자.

    회계 의미에서 감사 대상을 이해하기위한이 읽어 보시기 바랍니다.

    역사와 센서 데이터 모델 링크 (2 페이지는 역사 테이블과 컨텍스트를 포함).

    관계형 모델링 표준에 익숙하지 않은 독자는 IDEF1X 표기법이 유용 할 수있다.

    (1) 내 첫 번째 문제는 내가 아니에요 역사적인 데이터를 참조 무결성,의 확인 어떤 있다는 것을, 그리고이 있는지 확실 어떻게 작동하는지 모르겠어요. 예를 들어, SensoryHistory에 당신이 무슨 뜻인지 볼 경우 자체가 존재 위치 이전 날짜의 시간을 나타내는 UpdatedDtm을 가진 레코드를 추가 할 수있을 것이다. 맨 위에있을 그 시행 -이 여부 사실 잘 모르겠어요 문제입니다.

    (당신은 다른 질문에 비슷한 문제를 제기했다.) 그것은있을 수 있습니다 당신이 실제로 자리에 참조 무결성이 없었 경험 한 DBS; 관계 선은 단지 문서에 대한이 있다고; 국제 로타리는 (더 RI이 없음을 의미) "응용 프로그램 코드에서 구현"되었다.

    이것은 ISO / IEC / ANSI 표준 SQL 데이터베이스입니다. 즉 선언적 참조 무결성을 할 수 있습니다. 모든 관계는 선 PK : FK 참조 선언되는 실제 제약 조건으로 실시된다. 예를 들면 : TABLE 위치를 만들     ...     CONSTRAINT UC_PK         PRIMARY KEY (LocationId)     ... 표 센서를 CREATE     ...     CONSTRAINT UC_PK         PRIMARY KEY (LocationId, SensorNo)     CONSTRAINT Location_Sensor_fk         FOREIGN KEY (LocationId)         REEFERENCES 위치 (LocationId)     ... 표 SensorHistory을 CREATE     ...     CONSTRAINT UC_PK         PRIMARY KEY (LocationId, SensorNo, UpdatedDtm))     CONSTRAINT Sensor_SensorHistory_fk         FOREIGN KEY (LocationId, SensorNo)         REEFERENCES 센서 (LocationId, SensorNo)     ...

  2. ==============================

    2.나뿐만 아니라 전에이 상황으로 실행했습니다. 당신이 추적하고자하는 데이터의 양에 따라, 그것은 위협이 될 수 있습니다. 그런 다음, 역사 테이블의 레코드의 '스냅 샷'을 받아 생산 테이블에서 필요에 따라 변경할 수 있기 때문에 역사적 표는 시간에 사용하기 쉽게 잘 작동합니다. 그러나 그것은 당신이 그것을 변경 얼마나 자주, 매우 큰 역사적 테이블로 끝날 수있는 데이터의 양에 따라 매우 정직하고 구현하는 방법입니다.

    나뿐만 아니라 전에이 상황으로 실행했습니다. 당신이 추적하고자하는 데이터의 양에 따라, 그것은 위협이 될 수 있습니다. 그런 다음, 역사 테이블의 레코드의 '스냅 샷'을 받아 생산 테이블에서 필요에 따라 변경할 수 있기 때문에 역사적 표는 시간에 사용하기 쉽게 잘 작동합니다. 그러나 그것은 당신이 그것을 변경 얼마나 자주, 매우 큰 역사적 테이블로 끝날 수있는 데이터의 양에 따라 매우 정직하고 구현하는 방법입니다.

    또 다른 옵션은 발생하고 추적 무엇을 '재생'에 사람을 수 있도록 모든 변경 사항을 기록합니다. 각각의 변화가 무엇인지 즉에 년 12 월 31 일까지 변경되었습니다, 어떤 테이블이나 추적 필드 (필요에 따라)에 로그인 2010 년 밥 '폐쇄 형'에서 '열기'에서 상태를 변경했습니다.

    당신이 일반적으로 사용하고자하는 시스템을 유지하기 you'l 필요에 따라 달라집니다 / 리뷰 / 나중에 데이터를 사용합니다. 자동화 된 보고서, 사람의 검토, 두 가지의 조합 등

  3. ==============================

    3.예산 및 / 또는 환경에 따라 오라클의 플래시백 아카이브 기능을 사용하여 고려할 수 있습니다.

    예산 및 / 또는 환경에 따라 오라클의 플래시백 아카이브 기능을 사용하여 고려할 수 있습니다.

    당신은 자동 테이블의 행의 "보관"를 켠 다음과 같은 basetable 사용하여 뭔가에 문을 실행할 수 있습니다

    SELECT *
    FROM important_data
    AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '5' DAY)
    

    오라클은 별도의 (그림자) 테이블의 역사를 유지하고 처리한다. 조인과 함께 당신은 또한 쿼리를 수행 할 수 있도록 모든 테이블이 작업을 수행 할 수 있습니다.

  4. from https://stackoverflow.com/questions/4491173/historical-auditable-database by cc-by-sa and MIT license