Как сохранить аудит/историю изменений в таблице

Кроме того, необходимо удостовериться, что SQL Server Service работает как пользователь, который имеет доступ к сети - и полномочия к доле, где файл резервной копии живет. 'Локальная Система' не будет иметь полномочий получить доступ к сети.

15
задан ewall 25 November 2009 в 23:18
поделиться

6 ответов

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

  1. Закодируйте свой уровень доступа к данным.
  2. В самой базе данных с помощью триггеров.

У обоих есть преимущества и недостатки. Некоторые люди предпочитают одно другому. Часто все сводится к типу приложения и типу использования базы данных, которое вы можете ожидать.

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

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

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

Каким бы способом вы это ни делали, вам необходимо решить, в каком формате будет журнал аудита. Обычно вы сохраняете этот журнал в своей базе данных, но вы можете просто сохранить его в файле журнала или в том, что соответствует вашим требованиям. Вы можете использовать одну таблицу аудита, в которой регистрируются все изменения, или у вас может быть таблица аудита для каждой проверяемой основной таблицы. Для крупномасштабных реализаций вы даже можете рассмотреть возможность помещения аудиторских таблиц в совершенно отдельную базу данных. Если вы входите в таблицу, обычно есть поле «тип изменения», которое указывает, было ли проверяемое изменение стилем изменения вставки, обновления или удаления, вместе с измененными данными, пользователем, который внес изменение, и датой / временем. изменение было внесено. Не забудьте включить старые и новые данные для изменения стиля обновления.

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

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

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

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

12
ответ дан 1 December 2019 в 01:45
поделиться

Также используйте триггеры.

Любой, кто рассматривает возможность мягкого удаления, должен прочитать книгу Ричарда Дингволла Проблема с мягким удалением .

8
ответ дан 1 December 2019 в 01:45
поделиться

Наиболее универсальным методом было бы создание другой таблицы для хранения версий записи из первой таблицы. Затем вы можете удалить все данные из основной таблицы. Предположим, вам необходимо управление версиями таблицы. Person (PersonId, Name, Surname):

CREATE TABLE Person 
(
   PersonId INT,                   // PK
   CurrentPersonVersion INT        // FK
);

CREATE TABLE PersonVersion
(
  PersonVersionId INT,             // PK
  PersonID                         // FK 
  Name VARCHAR,                    // actual data
  Surname VARCHAR,                 // actual data

  ChangeDate                       // logging data
  ChangeAuthor                     // logging data
)

Теперь любое изменение требует вставки новой версии PersonVersion и обновления CurrentPersonVersionID.

8
ответ дан 1 December 2019 в 01:45
поделиться

Другой способ сделать это помимо триггеров:

  1. Имеет четыре столбца, UpdFlag , DelFlag , EffectiveDate и TerminatedDate для каждой таблицы, в которой вы хотите вести контрольный журнал.
  2. закодируйте свой sproc таким образом, чтобы при обновлении передавать все данные столбца строки в sproc обновите строку, установив для TerminatedDate дату, которая была обновлена, отметьте UpdFlag и поместите дату и время в столбец
  3. . Затем создайте новую строку с новыми данными (которые действительно обновлен). и введите новую дату сейчас для EffectiveDate и TerminatedDate , установленную на максимальную дату.

Аналогичным образом, если вы хотите удалить строку, просто обновите строку, пометив DelFlag как установленный, TerminatedDate с датой и временем сейчас. Фактически вы выполняете мягкое удаление, а не фактическое удаление sql.

Таким образом, когда вы хотите проверить данные и показать след изменений, вы можете просто отфильтровать строки для тех, которые имеют UpdFlag установлен или между EffectiveDate и TerminatedDate . Аналогичным образом для тех, которые были удалены, вы фильтруете те, у которых установлен DelFlag или между EffectiveDate и TerminatedDate . Для текущих строк отфильтруйте строки, у которых установлены оба флага. Преимущество состоит в том, что вам не нужно создавать другую таблицу для аудита при использовании триггера!

TerminatedDate с датой и временем сейчас. Фактически вы выполняете мягкое удаление, а не фактическое удаление sql.

Таким образом, когда вы хотите проверить данные и показать след изменений, вы можете просто отфильтровать строки для тех, которые имеют UpdFlag установлен или между EffectiveDate и TerminatedDate . Аналогичным образом для тех, которые были удалены, вы фильтруете те, у которых установлен DelFlag или между EffectiveDate и TerminatedDate . Для текущих строк отфильтруйте строки, у которых установлены оба флага. Преимущество состоит в том, что вам не нужно создавать другую таблицу для аудита при использовании триггера!

TerminatedDate с датой и временем сейчас. Фактически вы выполняете мягкое удаление, а не фактическое удаление sql.

Таким образом, когда вы хотите проверить данные и показать след изменений, вы можете просто отфильтровать строки для тех, которые имеют UpdFlag установлен или между EffectiveDate и TerminatedDate . Аналогичным образом для тех, которые были удалены, вы фильтруете те, у которых установлен DelFlag или между EffectiveDate и TerminatedDate . Для текущих строк отфильтруйте строки, у которых установлены оба флага. Преимущество состоит в том, что вам не нужно создавать другую таблицу для аудита при использовании триггера!

если вы хотите проверить данные и показать след изменений, вы можете просто отфильтровать строки для тех строк, у которых установлен UpdFlag , или между EffectiveDate и TerminatedDate . Аналогичным образом для тех, которые были удалены, вы фильтруете те, у которых установлен DelFlag или между EffectiveDate и TerminatedDate . Для текущих строк отфильтруйте строки, у которых установлены оба флага. Преимущество состоит в том, что вам не нужно создавать другую таблицу для аудита при использовании триггера!

если вы хотите проверить данные и показать след изменений, вы можете просто отфильтровать строки для тех строк, для которых установлен UpdFlag , или между EffectiveDate и TerminatedDate . Аналогичным образом для тех, которые были удалены, вы фильтруете те, у которых установлен DelFlag или между EffectiveDate и TerminatedDate . Для текущих строк отфильтруйте строки, у которых установлены оба флага. Преимущество состоит в том, что вам не нужно создавать другую таблицу для аудита при использовании триггера!

вы фильтруете те, у которых установлен DelFlag или между EffectiveDate и TerminatedDate . Для текущих строк отфильтруйте строки, у которых установлены оба флага. Преимущество состоит в том, что вам не нужно создавать другую таблицу для аудита при использовании триггера!

вы фильтруете те, у которых установлен DelFlag или между EffectiveDate и TerminatedDate . Для текущих строк отфильтруйте строки, у которых установлены оба флага. Преимущество состоит в том, что вам не нужно создавать другую таблицу для аудита при использовании триггера!

1
ответ дан 1 December 2019 в 01:45
поделиться

Я бы пошел по маршруту триггеров, создав таблицу со структурой, аналогичной обновленной, с дополнительными столбцами для отслеживания изменений, например ModifiedAt и т. Д. А затем добавив триггер обновления, который будет вставлять изменения в эту таблицу . Я считаю, что это легче поддерживать, чем содержать все в коде приложения. Конечно, многие люди склонны забывать о триггерах, когда речь идет о таких вопросах, как «Что, если эта таблица меняется?») Ура.

0
ответ дан 1 December 2019 в 01:45
поделиться

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

2
ответ дан 1 December 2019 в 01:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: