Лучшие практики для аудита данных в SQL Server и получения данных на определенный момент времени - PullRequest
1 голос
/ 22 октября 2011

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

Моя главная цель - записать любые изменения в записи за определенный день. Если в день происходит более одного изменения, то будет существовать только одна запись истории. Мне нужно записать дату, когда запись была изменена, также, когда я получаю данные, мне нужно извлечь правильную запись из истории, как это было в конкретное время. Например, у меня есть таблица клиентов, и я хочу узнать, какой у них был адрес на определенную дату. Мои Sprocs, такие как get Cust, будут принимать необязательную дату, и если дата не будет передана, то будет возвращена самая последняя запись.

Итак, вот что я искал для совета:

Сохраню ли я таблицу истории в той же таблице и использую логический флаг удаления, чтобы скрыть исторические? Обычно я этого не делаю, так как некоторые таблицы могут сильно меняться и иметь много записей. Я использую отдельную таблицу, которая отражает основную таблицу? Я обычно делаю это. Должен ли я помещать только записи изменений в таблицу истории, а не в текущую? Как наиболее эффективно использовать заданную дату, чтобы извлечь нужную запись в определенный момент времени, получить каждую запись для клиента <= дата, переданную, а затем отсортировать по самой последней дате и взять вершину? </p>

Спасибо за помощь ... С уважением, M

Ответы [ 4 ]

3 голосов
/ 10 октября 2013

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

С помощью триггеров вы можете выполнить требование не хранить более одного обновления записи в день.

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

Это даст вам хорошее начало, и вы сможете работать там.

Отказ от ответственности: не связан с ApexSQL, но я использую их инструменты ежедневно.

1 голос
/ 23 октября 2011

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

Я полагаю, это решит ваши проблемы с изменением исторических данных

1 голос
/ 22 октября 2011

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

0 голосов
/ 23 октября 2011

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

Вы можете создать пользовательскую функцию, которая возвращает таблицу и принимает имя таблицы (varchar) и момент времени (datetime) в качестве параметров.UDF должен перестроить таблицу с использованием аудита (исторические значения) и предоставить вам эффективные значения на эту дату и время.

...