Подтвердить что ты не робот

Как отслеживать изменения данных в таблице базы данных

Каков наилучший способ отслеживания изменений в таблице базы данных?

Представьте, что у вас есть приложение, в котором пользователи (в контексте приложения, а не пользователи БД) могут изменять данные, хранящиеся в некоторой таблице базы данных. Какой лучший способ отслеживать историю всех изменений, чтобы вы могли показать, какой пользователь в какое время меняет данные, как?

4b9b3361

Ответ 1

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

В языках, поддерживающих такую ​​вещь аспектно-ориентированное программирование, может быть хорошей методикой для использования в этом приложении. Изменения таблицы аудита базы данных - это вид операции, которую вы обычно хотите регистрировать для всех операций, поэтому AOP может работать очень хорошо.

Имейте в виду, что изменения базы данных журналов создадут много данных и замедлят работу системы. Может быть разумным использовать решение очереди сообщений и отдельную базу данных для выполнения журнала аудита в зависимости от размера приложения.

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

Ответ 2

Один из методов, который я видел довольно часто, - это иметь таблицы аудита. Затем вы можете показать, что изменилось, изменилось и изменилось, или что бы вы ни пожелали. Тогда вы можете написать триггер для фактического ведения журнала. Не слишком больно, если все сделано правильно...

Независимо от того, как вы это делаете, это зависит от того, как ваши пользователи подключаются к базе данных. Используют ли они одного пользователя приложения через контекст безопасности в приложении, подключаются ли они с помощью собственных учетных записей в домене или приложение просто подключается к общей учетной записи sql?

Если вы не можете получить информацию о пользователе из подключения к базе данных, это немного больнее. И тогда вы можете посмотреть, как вести журнал в приложении, поэтому, если у вас есть процесс под названием "CreateOrder" или что-то еще, вы можете войти в таблицу Order_Audit или что-то еще.

Выполнение всего этого в приложении открывает немного больше изменений, внесенных извне приложения, но если у вас есть несколько приложений, все используют одни и те же данные, и вы просто хотите посмотреть, какие изменения были внесены вашими, может быть, что что вы хотели... <shrug>

Удачи вам, хотя!

- Кевин

Ответ 3

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

На базовом уровне базы данных вы можете отслеживать изменения, имея отдельную таблицу, которая получает добавленную к ней запись через триггеры в операторах INSERT/UPDATE/DELETE. Это общий способ отслеживания изменений в таблице базы данных.

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

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

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

Ответ 4

При исследовании этого же вопроса я нашел дискуссию здесь очень полезной. Это предполагает наличие параллельной таблицы для отслеживания изменений, где каждая таблица отслеживания изменений имеет те же столбцы, что и отслеживание, плюс столбцы для тех, кто ее изменил, когда и если она была удалена. (Необходимо создать схему для этого более или менее автоматически, используя расширенную версию существующих ранее скриптов.)

Ответ 5

Предположим, что у меня есть таблица Person с 10 столбцами, которые включают PersonSid и UpdateDate. Теперь я хочу отслеживать любые обновления в таблице Person. Вот простой метод, который я использовал:

  • Создайте таблицу person_log

    создать таблицу person_log (дата datetime2, sid int);

  • Создайте триггер для таблицы Person, который будет вставлять строку в таблицу person_log всякий раз, когда будет обновляться таблица Person:

    создать триггер tr на dbo.Person
    для обновления
    в виде вставить в person_log (date, sid) выберите updatedDTTM, PersonSID из вставленного

После любых обновлений, зайдите в таблицу person_log, и вы сможете увидеть personSid, который был обновлен. То же самое можно сделать для Insert, delete.

Пример выше для SQL, дайте мне знать в случае каких-либо запросов или используйте эту ссылку: http://www.4guysfromrolla.com/webtech/042507-1.shtml

Ответ 6

Журнал трассировки в отдельной таблице (с столбцом идентификатора, возможно с отметками времени)?

Вы также захотите отменить изменения - возможно, предварительно создайте инструкцию отмены (DELETE для каждого INSERT, (un-) UPDATE для каждого обычного UPDATE) и сохраните это в трассировке?

Ответ 7

Попробуйте использовать этот компонент с открытым исходным кодом:

https://tabledependency.codeplex.com/

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

Ответ 8

Если все изменения с php. Вы можете использовать класс для регистрации evS INSERT/UPDATE/DELETE перед запросом. Это будет сохранение действия, таблицы, столбца, newValue, oldValue, < сильная > дата, система (при необходимости), ip, UserAgent, clumnReference, operatorReference, valueReference. Все таблицы/столбцы/действия, необходимые для регистрации, настраиваются.