2009-08-27 2 views
4

개체에 대한 모든 변경 사항을 추적하는 좋은 방법을 찾고 있습니다.asp.net mvc (nhibernate)에서 개체의 변경 내용을 어떻게 추적해야합니까?

우리는 사용자 정의 프레임 워크를 구축하고 있으며 누가 언제 어떤 객체를 변경했는지에 대한 내역 (종류)이 필요합니다.

이 경우 좋은 연습은 무엇입니까?

저장/업데이트 방법을 확장하여 "로그"를 작성 하시겠습니까? log4net 또는 로깅 확장 프로그램을 사용해 볼까요?

저장/업데이트/루틴 확장에 대한 오버 헤드가 걱정됩니다.

편집 : 는 그래, 난 ... 고객이 때로는 손실 된 데이터에 대해 불평하고 그들이 그것을 삭제하는 것이 "잊지"한 달 동안 적어도 변화를 볼 필요가

는 는

Edit2가 (더 나은 이해를 위해, questons 질문 주석에) : 내역은 db (ms sql)에 저장되어야하며 모든 클래스에 대해 모든 작업에 로깅을 추가하는 것을 원하지 않습니다. 로드, 업데이트, 삭제 등을 제공하는 내 기본 클래스에서 상속받은 모든 클래스 ... 추가 답변/의견 주셔서 감사합니다 :)

답변

0

데이터 저장소로 관계형 데이터베이스를 사용한다고 가정합니다.

데이터베이스에 원래 엔티티와 거의 동일한 테이블 스키마가있는 히스토리 테이블을 추가해야합니다.

해당 테이블의 각 행은 원본 (라이브) 엔티티에 대한 외래 키와 타임 스탬프를 가지므로 이제 순서가 변경되었습니다. 나중에 테이블에서 orignialID로 모든 기록 정보를 검색하고 시간 소인별로 정렬 한 다음 변경 사항을 기반으로 사용자 정의 로그 메시지를 작성할 수 있습니다 (반영 고려).

당신은 그러나 변경 사항 추적, 당신은 histor 테이블에 원래 행을 복사 모든 업데이트에 대한

(관계 등의 변경 사항을 추적) 객체 그래프를 통과 원본을 참조하는 방법 "깊이"를 결정해야합니다

행을 수정하고 타임 스탬프를 추가하십시오.

업데이트를 저장하기 위해 저장 프로 시저를 사용하는 것이 좋습니다.

+0

예 저는 현재 관계형 데이터베이스 (SQL Server 2005)를 사용하고 있습니다. 관계 추적도 필요합니다 (예 : 제품 설명이 사용자 y에서 x에 추가됨). – griti

0

얼마나 오래 역사가 필요합니까? 대답이 응용 프로그램 인스턴스보다 길면 데이터베이스 경로를 사용해야합니다. 그렇다면 코드에서가 아니라 db 레벨에서이 모든 것을 처리 할 것입니다. 아마도 트리거, 여기 당신의 친구 ...

+0

좋은 점은, 역사 항목과 물건을 복원하는 유용성에 대해 더 살펴볼 것입니다. 데이터베이스 레벨에서 나는 모든 객체에 대한 히스토리 - 스터디를 생성해야한다. 때로는 객체 당 3 개 이상의 테이블 ... uff <: – griti

+0

까지, 고객의 요구 사항을 확인하고, 히스토리는 nHibernate와 함께 애플리케이션 레벨에서 수행되어야한다. . 트리거와 nHibernate를 사용하면 솔루션이되지만 내 경우에는 그렇지 않습니다. – griti

0

당신이 관계형 데이터베이스를 사용하고 있다는 가정에 대한 흥미로운 일이 될 수 있습니다 당신은 단순히 코드를 삽입, 업데이트 트리거 수 및 이벤트 삭제 다른 테이블에 동작을 기록 할 수 있습니다.

기록 된 원본 데이터 테이블과 동일한 정의가있는 기록 테이블을 사용하는 것도 좋은 생각입니다. 이렇게하면 원본 테이블을 최대한 가벼운 상태로 유지할 수 있으므로 데이터베이스 내의 테이블에 DQL의 성능이 향상되고 실수로 삭제 된 레코드로 Delete 이벤트를 추적 할 때 모든 레코드를 가져올 필요가 없습니다 사용자에 의해.

또 다른 방법으로, 매일 처리되는 행의 수에 따라 필드가 삭제되었는지 여부에 상관없이 true 또는 false로 플래그를 지정하고 현재 작업을 저장해야하는 열을 추가 할 수 있습니다. Active Directory와 작동하도록 DB를 구성 했으므로 현재 사용자를 정밀도로 식별 할 수 있습니다.

글쓰기 동안, 나는 또 다른 생각을 들었다. 당신은 아마 이미 그것에 대해 생각했습니다! :-) 어쨌든, 보안 문제를 관리하는 DLL을 빌드하십시오. 코드 내에서 보안 DLL로 식별되는 현재 로그인 한 사용자와 매개 변수를 간단히 전달할 수 있습니다.

무엇이든지, log4net 나는 그것을하는 좋은 방법이라고 생각합니다. 모든 사용자의 이벤트를 개인용 에디션의 무료 DB 인 SQLite DB에 기록 할 수 있습니다. Microsoft Enterprise Library 4.1 - 2008 년 10 월, 올바르게 기억하면 매우 유용한 도구를 제공하며 프로그래머는 다시 실행해야하고 다시 다시해야 할 작업을 빠르게 지루하게 만듭니다. MEL은 반복적 인 코드 재 작성의 고통을 피하기 위해 이러한 반복 가능한 루틴을보다 쉽게 ​​만들도록 특별히 설계되었습니다. 이를 통해 고객은 고객에게 중요한 요소, 기능 및 요구 사항에 집중할 수 있습니다. OpenSource이며 IBM, HP 및 기타 대기업과 같은 회사의 요구에 따라 Microsoft가 관리합니다. 어쩌면 우리는 여전히 그 존재를 무시하고 있습니다. 어쨌든, 필자는 엔터 프라이즈 라이브러리가 구성에 의해서만 거의 작동하기 때문에 언제나 아키텍처를 고려하면서 갈 수있는 최선의 방법이라고 생각합니다.

리플렉션에 익숙하다면 반영 및 저장 중에 동시에 기록하는 루틴을 사용하여 오브젝트의 인스턴스를 초기화 할 수 있습니다.

아시다시피 많은 노력 없이도 가능한 많은 방법이 있습니다. 그것은 모두 아키텍처에 따라 다릅니다.

음, 많이 썼습니다. 아무도 지루하지 않기를 바래요! :-)

좋은 하루 되세요!

+0

트리거는 그것을하는 한 가지 방법이지만, 또한 그것을로드하려면 nhibernate에 모두 매핑해야합니다 ("올바른"방법). 물론 반사 식으로 더 유연해질 것이므로 전체 추적/로깅에 대해 생각하고 고객이 원하는 것을 확인하십시오/지불하십시오) – griti

+0

또한 응용 프로그램 수준에서 로깅/트리거를하고 싶습니다. 잊어 버렸습니다. 내 코멘트에 언급 :-) – griti

+0

나는 엔터 프라이즈 라이브러리 로깅 기능을 알고. 주로 Enterprise 라이브러리는 제대로 작동하려면 구성 만 필요합니다. 나는 이것이 흥미로운 탐구 방법이 될 것 같아요. –

2

기본적으로 감사 솔루션을 찾으십니까? 나는 Hibernate가 Hibernate Envers라는 addon 프로젝트를 사용하는 기능을 가지고 있음을 안다. 이걸 내가 가장 빨리 찾을 수있는 건 this blog post입니다. NHibernate에 관해서는, NHibernate 로의 이식 (Enversing)을 .NET 커뮤니티를 위해 이식하는 작업이 있다고 생각합니다.

별도의 솔루션으로 들어가기 전에 ETA가 무엇인지 알아내는 것이 가치 있다고 생각합니다. ORM에 내장 된 것을 얻을 수 있다면 좋을 것입니다. ;-)

그냥 빨리 확인했는데, 적어도 그의 트위터 피드에 따르면 Tuna Toksoz이 그것에 대해 작업하고 있다고 생각합니다.

+0

내 문제가 깊어 질수록 감사 로그가 필요한 것 같습니다. Envers 소리가 정말 좋으며 융통성이 완벽 해 보입니다. 그러나 .Net 포트에 대한 심각한 정보를 찾지 못했습니다. Tuna Toksoz에는 블로그 게시물이 없습니다 ... 또한 읽었습니다 (http://nhforge.org/wikis/howtonh/creating-an-audit-log-using). -nhibernate-events.aspx) 이것은 나 자신이 할 수있는 방법처럼 보입니다. – griti

+0

@Erik van Brakel 덕분에 수동으로 로깅을 구성하는 작업을 많이 절약 할 수있었습니다! – Rowan