Есть ли какой-нибудь независимый от базы данных способ получения уведомлений об изменении данных на уровне поля?
-
10-07-2019 - |
Вопрос
В настоящее время, используя SQL Server 2005, я опрашиваю " события Windows " база данных для определения изменений в таблице с именем WINDOWS_EVENTS, которая имеет поле метки времени. Глядя на временную метку, я могу определить, изменилась ли строка, но не то, какое поле в этой строке изменилось.
Есть ли какой-то универсальный (то есть независимый от базы данных способ) для обнаружения изменений на уровне поля? (Мне нужно, чтобы он был общим, потому что не известно, какую базу данных будет использовать клиент, поэтому я не хочу использовать Notification Services или другую технологию, специфичную для SQL-сервера. Я мог бы использовать любое решение, .NET, Java или любое другое. другой язык, если это поможет мне решить мою проблему.)
Решение
Во-первых, я бы порекомендовал изменить структуру вашей таблицы примерно так:
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