Есть ли какой-нибудь независимый от базы данных способ получения уведомлений об изменении данных на уровне поля? - PullRequest
0 голосов
/ 03 августа 2009

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

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

1 Ответ

0 голосов
/ 03 августа 2009

Во-первых, я бы порекомендовал изменить структуру вашей таблицы примерно так:

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 и т. Д. Для BLOB-объектов вы можете сравнить SHA1 (field4) со oldField4).

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

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

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