2010-07-01 3 views
0

C# 응용 프로그램에서 강력한 형식의 데이터 집합을 사용하고 있으며 사용자가 행에 변경 한 내용을 기록 할 수 있기를 원합니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?로깅 데이터베이스 행 변경

답변

0

C# 응용 프로그램의 변경 내용에 액세스 할 수 있도록 하시겠습니까? 아니면 그냥 로깅/감사 목적을위한 것입니까? 강력하게 형식화 된 데이터 집합이 SQL Server 테이블에 매핑되는 XSD 데이터 집합입니까? 내가 CB 리처드 엘리스에서 개발을 도운 큰 주문 시스템에서 SQL 서버

트리거, 우리는 버전 화 된 데이터를 유지하기 위해 별도의 테이블을 만들었습니다. 요청 테이블이 있다고 가정 해보십시오. Request_changes 테이블을 작성하십시오.

CREATE TRIGGER [dbo].[tr_Request_update] 
ON [dbo].[Request] 
FOR UPDATE 
AS 
    SET NOCOUNT ON 
    INSERT INTO dbo.Request_changes 
    (
     --ID,  // taken care of by IDENTITY(1,1) 
     --LogDate, // uses default value of GetDate() 
     ChangeAction, 
     SQLServerUser, 

     RequestID, 
     UserIDContact, 
     etc 
    ) 
    SELECT 
     'UPDATE', 
     system_user, 

     -- Request fields 
     RequestID, 
     UserIDContact, 
     etc 
    FROM 
     inserted 

    SET NOCOUNT OFF 
GO 

create TRIGGER [dbo].[tr_Request_insert] 
ON [dbo].[Request] 
FOR INSERT 
AS 
    SET NOCOUNT ON 
    INSERT INTO dbo.Request_changes 
    (
     --ID,  // taken care of by IDENTITY(1,1) 
     --LogDate, // uses default value of GetDate() 
     ChangeAction, 
     SQLServerUser, 

     RequestID, 
     UserIDContact, 
     Title, 
     etc 
    ) 
    SELECT 
     'INSERT', 
     system_user, 

     -- Request fields 
     RequestID, 
     UserIDContact, 
     etc 
    FROM 
     inserted 

    SET NOCOUNT OFF 
GO 

당신은 반드시 (다른 XSD 데이터 세트에 그지도를하지 않는 한)이 _changes 테이블에 액세스 할 수없는,하지만 로깅 및 감사 및 추적을위한 좋아요 : 그럼 당신은 다음과 같이 INSERT 및 UPDATE에 대한 트리거를 설정 다운 버그와 역사.

다른 옵션

은 아마 당신은 SQL 서버와 같은 영구 저장소에 의해 뒷받침되지 않는 XSD 데이터 집합을 가지고, 당신은 단지 메모리 데이터 세트에서 사용하고 있습니다. 속성 값이 변경되었을 때 사용자에게 알려주는 많은 다른 디자인 패턴과 잘 알려진 구문이 있습니다.

또한 XSD 데이터 세트를 사용하는 경우 기존 코드 기반 또는 레거시 응용 프로그램을 사용하고 있기 때문에 가능합니까? 당신이 새로운 발전을한다면, 나는 그들에게서 멀어 질 것입니다. MS가 더 이상 활발하게 개발하지 않는 것은 오래된 기술입니다. 최신 버전의 Visual Studio와 함께 제공되는 MS 스택에 머물고 싶다면 Linq to Sql 또는 Entity Framework가 가장 적합합니다. 둘 다 다루기 쉬워야하며 융통성이 있습니다 (예 : I don XSD 데이터 세트가 null 값을 잘 처리한다고 생각하며 생성 된 클래스에서 .NET nullable 유형을 지원하지 않습니다.

+0

사용자 감사 기능이 추가 된 레거시 시스템입니다. 현재 RowChanged 이벤트를 기반으로하는 로깅이 있지만 버그가있어 항상 기록하는 것은 아닙니다. 나는 모든 변경 사항을 로깅하는 더 나은 솔루션을 찾고 있는데 (액세스는 아마도 필요하지 않다), 괜찮 으면 애플리케이션 내부에서 볼 수있는 한 더 길다. 시스템에 자체 사용자 계정이 있지만 시스템 사용자 계정을 사용하는 것이 좋습니다. 너 자신에 대해 좀 더 설명해 주거나 나에게 뭔가를 연결시켜 주겠니? – Malfist

+0

귀하의 경우 트리거가 잘 작동 할 수 있습니다. 이 응용 프로그램은 SQL Server에 의해 백업됩니까? 개별 [tableName] _changes 테이블을 매핑하는 XSD 데이터 세트를 만들 수도 있으므로 변경된 데이터를 앱으로, 감사 페이지 용으로 쉽게 가져올 수 있습니다. –