2009-08-03 2 views
0

В настоящее время, используя SQL Server 2005, я опросу базы данных «События Windows», чтобы определить изменения в таблице WINDOWS_EVENTS, которая имеет поле timestamp. Глядя на метку времени, я могу определить, изменилась ли строка, но не изменилось какое поле в этой строке.Есть ли какой-то независимый от базы данных способ получения уведомлений об изменении данных на уровне поля?

Есть ли какой-то общий (то есть, независимый от базы данных способ) для обнаружения изменений уровня поля? (Мне нужно, чтобы он был общим, потому что нет никакой информации о том, какая база данных будет использоваться клиентом, поэтому я не хочу использовать службы Notification Services или другие технологии SQL-Server. Я мог бы использовать любое решение .NET, Java или . любой другой язык, если это помогает мне решить мою проблему)

+0

Ionno, но если вы хотите, чтобы он не зависел от базы данных, похоже, вам понадобится ORM. – mpen

+0

@Mark, что мне нужно, например, с nHibernate? Кроме того, я не уверен, что ORM будет подходящим для таблицы с примерно 100 000 записей в любой момент времени (не более 100 000). – 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 

Второй , вы можете добиться того, чего хотите по копиям используя старое значение или вычисляя хэш значений поля (для длинных полей) и сохраняя их в другом поле (oldField1, oldField2 и т. д.) вместе с меткой времени, затем опросите таблицу. Я считаю, что все базы данных имеют хеш-функцию, такую ​​как SHA1 («xyz») или MD5 («abc»), хотя в каждом из них может быть несколько другое имя.

Затем, когда вы проводите опрос таблицы изменений, вы видите строку, которая изменилась, и вы можете провести полевое сравнение, чтобы узнать, какое поле изменилось. Таким образом, вы бы сравнили field1 с oldField1, field2 с oldField2, field3 и oldField3 и т. Д. Для blobs вы могли сравнить SHA1 (field4) и oldField4).

Создайте триггер хранимой процедуры, чтобы скопировать поля при обновлении метки времени.

Другим решением является создание таблицы журнала изменений данных, которая сохраняет только изменения. Он будет вставлен с помощью хранимой процедуры триггера и будет выглядеть так:

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

 Смежные вопросы

  • Нет связанных вопросов^_^