2012-03-10 5 views
2

У меня есть таблица проверок и таблица заказов на покупку с отношением «один ко многим». (Каждая проверка имеет n заказов на поставку, каждый заказ на поставку имеет 1 или ноль чеков) Пользователи обычно добавляют чек в заказ на поставку, а затем изменяют данные проверки. Иногда они позже удаляют чек из ПО и добавляют другое.SQL: Аудит изменений объекта с несколькими таблицами

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

  • PO Детали изменены (имя_пользователя) на (дата). Изменено поле1 от x до y, field2 ... и т. Д.
  • PO Детали изменены (имя_пользователя) на (дата). Измененный field1 от х к у, field2 ... и т.д.
  • Добавлена ​​проверка хххх на ПО (имя пользователя, дата и т.д.)
  • Измененные детали проверка XXXX и т.д. и т.п.
  • Убрана проверка хххх
  • Добавлена ​​проверка гггг к ПО
  • Изменена проверка гггг подробнее ...

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

Рассмотрите подход, в котором у меня есть таблицы ChequeAudit и POAudit, и сохраняйте строку в этих таблицах каждый раз, когда что-то в базовой таблице изменяется. Теперь, чтобы предоставить пользователю список изменений в Заказе на поставку, я могу вернуть все строки, касающиеся самого ПО, и, кроме того, все строки, касающиеся любых проверок, которые когда-либо были на PO. Но тогда мне нужно было бы исключить строки, касающиеся изменений в чеке, которые были сделаны до того, как проверка была добавлена ​​в PO, или после того, как чек был удален из ПО. И прямое соединение в интервале дат не будет работать, так как проверка может быть подключена и удалена снова, сколько угодно раз.

Я не разработал способ хранения одной записи в журнале изменений чека и легко связать ее с заказом (-ами) покупки. В частности, какая структура базы данных мне нужна для того, чтобы запросить PO, и вернуть все изменения, внесенные в какие-либо проверки, произошедшие , а чек был прикреплен к ПО? Может ли это быть нормализовано, или я вынужден регистрировать одно изменение на чеке в отношении каждого отдельного связанного ПО?

+0

Какова структура данных Trent? :) – Naval

ответ

2

Я бы определил одну таблицу аудита для PO и другую таблицу проверок для проверок. Параметры ведения журнала включают в себя:

  1. Добавление пункта OUTPUT к вашему INSERT/UPDATE/DELETE заявления, , как я показал here.
  2. DML Triggers - это еще один распространенный способ обновления журнала журналов для аудита. Пока я привел пример триггера here, более подробное обсуждение можно найти на MSDN.

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

+0

Тривиально проверять изменения в любой из задействованных таблиц. Проблема у меня есть в последнем абзаце моего сообщения. Я отредактировал свой пост для ясности – Trent

+0

Где ваш последний абзац говорит «во время проверки был прикреплен», я предвижу, что с помощью NULL-ключа связывается проверка на PO. Это верно? –

+0

Да, внешний ключ может быть нулевым (без проверки). – Trent

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