2012-06-29 3 views
1

나는 회계 부서에서 사용할 웹 사이트를 만들고 있습니다. 다른 프로젝트별로 예산 지출을 추적합니다.데이터베이스의 변경 사항을 어떻게 추적합니까?

데이터베이스에 SQL Server 2008 R2를 사용하고 웹 사이트에 ASP.net C# MVC 3을 사용하고 있습니다.

내 상사가 수행해야하는 것은 사용자가 프로젝트를 업데이트하거나 만들 때마다 변경 사항을 Mapping_log이라는 새 테이블에 기록해야한다는 것입니다. 저장되거나 생성되는 전체 Mapping 행을 기록해야하며 사용자와 날짜 스탬프도 추가로 기록해야합니다. 메모 입력란은 필수 항목이며 메모는 Mapping_log에 저장해야합니다.

이제 PA를 편집 할 때 Notes 필드는 항상 비어 있고 그 아래에는 이전 노트의 날짜별로 정리 된 목록이 있어야합니다. 어쩌면 Nlog와 Log4net을 사용해 보았지만 광산과 같은 상황에 적합한 튜토리얼을 찾을 수 없었습니다. 이러한 모듈은 주로 오류 로깅에 사용되는 것으로 보이지만 중요한 것은 정확히 내가 지금하려고하는 것이 아닙니다.

나는 어떤 방향을 원한다. 누군가 사이트의 사용자가 데이터를 변경 한 과정을 어떻게 추적 할 수 있는지 배우는 데 사용할 수있는 조언이나 자습서가있다.

도움/조언을 주셔서 감사합니다.

+1

데이터베이스 트리거에 가장 적합합니다. – Josh

+0

데이터베이스 트리거는 Josh가 말한 것처럼 작동 할 수 있습니다. 이것은 꽤 똑바로 앞으로의 요구 사항처럼 나에게 소리. 나는 바퀴를 재발 명할 것을지지하지 않지만이 기능에 대한 제 3 자 도구를 구현하려고 시도하는 것이 잔인한 문제 일 수 있다고 생각합니다. 직접 로깅 기능을 만들 수 없습니까? –

+0

다른 테이블을 사용해야합니까? 동일한 테이블에서 변경 사항을 로깅하는 아주 좋은 솔루션이 있습니다. isDeleted, datestamp 및 username 열을 추가 할 수 있습니다. 행을 만들 때 단순히 추가하지만, 업데이트 할 때 현재 행을 삭제 된 것으로 표시하고 새 행을 추가합니다. 이렇게하면 변화의 역사가 있습니다. – shizik

답변

3

SQL Server 2008에서 새로 도입 된 두 가지 기능 (Change TrackingChange Data Capture)을 고려해 볼 수 있습니다.

당신은 이것을 사용하여 사용자 정의 Mapping_log 테이블을 피할 수 있습니다.

그러나 좀 더 복잡한 비즈니스 규칙을 적용해야하는 경우 데이터베이스가 아닌 응용 프로그램 계층에서 더 잘 수행 할 수 있습니다.

감사합니다.

+0

변경 내용 추적에 대한 흥미로운 기사가 ​​있지만 편집보기에서 변경 사항을 표시하기 위해 MVC 3을 어떻게 사용합니까? 지금 당장이 작업을 수행하는 방법을 찾고 있습니다. 그러나 귀하의 답변을 읽었 음을 알려 드리기 위해이 솔루션이 저에게 효과가 있는지 이해하려고합니다. 감사! – Goldentp

+0

안녕하세요! 나는 잠시 동안이 기능의 존재를 알았지 만 그것을 사용할 기회가 없었습니다. 변경 데이터 캡처의 경우 [cdc.fn_cdc_get_all_changes_ ] (http://msdn.microsoft.com/ko-kr/library/bb510627(v=sql.105).aspx)라는 함수를 사용해야 할 것 같습니다. (이는 테이블 값 함수 임). 어쩌면 결과를 EF 엔티티에 매핑하거나 cdc를 래핑하는 자체 함수를 만든 다음 사용자 정의 함수를 EF와 매핑 할 수 있습니다. – Chopin

+0

제안과 같이 응용 프로그램 계층에서 작업을 마쳤습니다. 특정 사용자의 변경 사항을 추적해야하고 데이터베이스를 통해 변경 사항을 추적하면 모든 로그 항목에 root 권한이 부여됩니다. 제안 해 주셔서 감사합니다! – Goldentp

1

나는 단지 두 개의 트리거를 만듭니다. 하나는 업데이트 용이고 하나는 삽입 용입니다.

CREATE TRIGGER trg_Mapping_Insert 
ON dbo.Mapping 
AFTER INSERT 
AS 
    INSERT INTO dbo.Mapping_Log(col1, col2, ..., colN, User, DateStamp, Operation) 
     SELECT 
     col1, col2, ..., colN, SUSER_NAME(), GETDATE(), 'INSERT' 
     FROM 
     Inserted 

(당신의 UPDATE 트리거는 매우 유사하다 - : 당신은 또한 당신의 Mapping_Log 테이블에 작동 (갱신 대 삽입)을 기록 할 가정 -

이 트리거는 다음과 같이 보일 것입니다 "삽입"을 "업데이트"로 교체하십시오.)

이것은 "장면의 배경"으로 이루어집니다. 한 번 설치하면 더 이상이 작업을 "기록"할 수 없습니다. 귀하의 Mapping_Log 테이블.

관련 문제