2010-07-29 6 views
1

나는이 다음 표 :SQL 서버 - 논리 질문

Id INT/PK 
UserId INT/FK 
CreatedDate DATETIME 
ActivityMarker INT/FK 
이 테이블에 기록에서 삭제할 수 있습니다

(예를 들어 오늘 내가 2010년 1월 1일에서 레코드를 삭제할 수 있습니다 (포함 레코드 업데이트가.)). CreatedDate는 레코드가 작성된 날짜를 포함합니다. ActivityMarker 및 UserId를 업데이트 할 수 있습니다.

내가해야 할 일은 주어진 UserId X에 대해 ActivityMarker Y가있는 레코드의 일일 기록을 기록하는 것입니다.이 정보는 사용자에게 주어진 마커에 대해 얼마나 많은 항목이 있는지를 차트로 나타 내기 위해 필요합니다 시각.

본인은 현재 테이블 구조가 이러한 유형의 기록 정보를 지원하지 않는다는 것을 알고 있습니다. 누군가가 ActivitiyMarker 또는 UserId의 가치를 변경하면 이전 값은 영원히 사라지고 변경 사항이 언제 발생했는지 알 수 없습니다.

특정 날짜에 주어진 UserId 및 ActivityMarker에 대한 레코드 수를 얻을 수 있도록이 정보를 유지하는 가장 좋은 방법을 제안 할 수 있습니까?

답변

3

효과적인 데이트를 사용하여 변경 사항을 기록하십시오.

또는

또는

거기에 당신을 위해 무엇인가를 할 수 있습니다 (SQL 2008 감사 기능을 살펴보십시오 다른 테이블에 감사 트리거를 사용하여,하지만 난 그것을 잘 모르겠어요 친숙한 기능이 될 것입니다.)

효과적인 데이트는 모든 기록을 유지하고 어떤 종류의 날짜 논리 또는 깃발을 통해 현재 활동중인 것으로 표시하는 것입니다. 다음은 개념을 설명하는 문서입니다 - http://www.simple-talk.com/sql/database-administration/database-design-a-point-in-time-architecture/.

트리거를 사용한 감사는 매우 일반적이며 이에 대한 많은 정보를 찾을 수 있어야합니다.

SQL 감사는 2008 년의 새로운 기능으로, 개체에 대한 로그의 상호 작용을 덤프하는 것처럼 보이지만 열의 실제 값이 아닌 t-sql 문과 사용자 ID 만 저장할 수 있습니다.

+0

'효과적인 데이트'제안에 대해 자세히 설명해 주시겠습니까? 어떻게 도움이됩니까? – Alex

+0

나중에 그룹 별 성명을 사용하여 그 사람의 레코드를 얻지 못한 가장 최근의 유효 날짜가있는 레코드를 찾을 수 있습니다. 트리거를 사용하면 활성 레코드의 플래그를 업데이트하여 쿼리를 쉽게 할 수 있으므로 darn 테이블을 쿼리 할 때마다 max (effective_date)로 전체 그룹을 수행 할 필요가 없습니다. – Sam

+0

테이블이 커질 수 있으며이 테이블을 작게 유지해야하는 경우 감사 테이블이 더 나은 선택 일 수 있습니다. 물론, 감사 트리거는 리소스를 사용하지만 삽입/업데이트 중에 만 사용합니다. – Sam

0

그런 다음 매일 실행이

Id INT/PK -- alternately UserId + Rundate could be the PK 
UserId INT/FK 
RunDate DATETIME 
AMCount INT 

같은 테이블을 필요할 것 :

INSERT INTO HistoricalActivityMarkers(UserId, RunDate, AMCount) 
    SELECT UserId, GETDATE(), count(*) 
    FROM ActivityMarkerTbl 
    GROUP BY UserId, GETDATE() 

만 매일 기록을 원하기 때문에, 모든 변경 사항을 기록 할 트리거에 대한 필요가 없다 또한 적어도 하루에 한 번 이상 통증이 나타나지 않으면 매일 기록을 남기지 못합니다.

+0

그래서 매일 끝날 때 INSERT를 실행하겠습니까? – Alex

+0

예. 그것은 각 사용자에 대한 행을 HistoricalActivityMarkers 테이블에 추가합니다 (더 나은 이름을 부여하십시오) –

0

기록의 스냅 샷을 기록 테이블에 기록하는 방법은 어떻습니까? SQL Server에서 바로 작업하는 경우 트리거를 사용할 수 있습니다. ORM 도구를 사용하여 작업하는 경우 변경 사항을 가로채는 기능이 있습니다.

+0

트리거를 사용하여이를 수행하는 방법에 대해 조금 자세히 설명해 주시겠습니까? – Alex

+0

테이블에 대한 삽입/업데이트시 트리거를 생성합니다. 이 트리거에서 타임 스탬프와 함께 기록 테이블에 모든 필드를 삽입합니다 (또는 원하는 경우 업데이트 용으로 변경). –