2009-08-03 7 views
0

현재 SQL Server 2005를 사용하여 "Windows 이벤트"데이터베이스를 폴링하여 타임 스탬프 필드가있는 WINDOWS_EVENTS라는 테이블의 변경 사항을 확인합니다. 타임 스탬프를 보면 행이 변경되었는지 확인할 수 있지만 해당 행의 어떤 필드가 변경되었는지는 알 수 없습니다.데이타베이스 독립적 인 방법으로 필드 레벨에서 데이터 변경 통지를 받습니까?

필드 수준의 변경 사항을 감지하는 일반적인 (즉, 데이터베이스 독립적 인) 방법이 있습니까? (고객이 어떤 데이터베이스를 사용할 것인지 알려주지 않으므로 일반화해야하므로 Notification Services 또는 다른 SQL Server 관련 기술을 사용하고 싶지 않습니다.) 솔루션, .NET, Java 또는 . 그 날이 내 문제를 해결하는 데 도움을 준다 경우 다른 언어)

+0

Ionno 그러나 데이터베이스 독립적 인 것으로 원하면 ORM이 필요합니다. – mpen

+0

@ 마크, 예를 들어 nHibernate에서 필요한 것은 무엇입니까? 또한 ORM이 주어진 시간에 대략 100,000 개의 레코드가있는 테이블 (10 만 개가 넘지 않음)에 적합할지 확신하지 못합니다. – Liao

답변

0

첫째,이 같은 것을에서 테이블 구조를 변경하는 것이 좋습니다 :

id  field1 field2 field3 field4 timestamp 

이런 일에 :

Table 1 
------- 
id  fieldKey value timestamp 
1  1   42  12:03am 
2  3   'Cow' 1:45am 
3  2   'Moo' 2:33am 
4  4   99  3:59am 

Table 2 
------- 
fieldKey  fieldLabel 
1   Field One 
2   Field Two 
3   Event One 
4   Event Two 

두 번째 , 당신은 당신이 원하는 것을 얻을 수 있습니다. (long 필드의 경우) 필드 값의 해시를 계산하고 타임 스탬프와 함께 다른 필드 (oldField1, oldField2 등)에 저장 한 다음 테이블을 폴링합니다. 모든 데이터베이스는 SHA1 ('xyz') 또는 MD5 ('abc')와 같은 해시 함수를 가지고 있다고 믿지만 각 데이터베이스마다 약간 다른 이름이있을 수 있습니다.

테이블을 폴링 할 때 변경된 행이 표시되며 필드 비교를 통해 필드를 변경하여 어떤 필드가 변경되었는지 확인할 수 있습니다. 따라서 field1을 oldField1, field2를 oldField2, field3을 oldField3 등과 비교합니다. BLOB의 경우 SHA1 (field4)을 oldField4와 비교할 수 있습니다.

타임 스탬프를 업데이트 할 때 필드를 복사하는 저장 프로 시저 트리거를 만듭니다.

다른 해결책은 변경 사항 만 저장하는 데이터 변경 로그 테이블을 만드는 것입니다. 그것은 트리거 저장 프로 시저를 통해 삽입 될 것이고, 이것은 다음과 같이 보일 것입니다.

id tableName  rowKey fieldName  oldValue  newValue  timestamp 
1  WINDOWS_EVENTS 42  event1  stable  crash  4:44am 
관련 문제