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

Лучший способ реализовать контрольный журнал в sql-сервере?

Я не знаю, являются ли эти требования стандартными или нет, но мне интересно, есть ли решение, которое может сделать следующее:

  • Для указанного набора таблиц сохраните копию записи до ее изменения в контрольной версии соответствующей таблицы.

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

4b9b3361

Ответ 1

Есть много способов сделать это; это зависит от того, какую версию SQL Server вы используете.

Вот несколько

  • Аудит след с теневой таблицей и триггером Вот ссылка

  • Также вы можете рассмотреть возможность использования функции аудита SQL Server 2008. Вот ссылка

Ответ 2

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

CREATE TABLE [dbo].[AuditAll] (
    AuditId    int           NOT NULL IDENTITY(1,1),
    [DateTime] datetime      NOT NULL,
    TableName  nvarchar(255) NOT NULL,
    AuditEntry xml           NULL,

    CONSTRAINT [PK_AuditAll] PRIMARY KEY CLUSTERED ( AuditId ASC )
)

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

CREATE TRIGGER AuditSimple 
    ON Simple
    AFTER INSERT,DELETE,UPDATE
AS 
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

IF (SELECT COUNT(*) FROM deleted) > 0 
begin
    Declare @AuditMessage XML
    --set valut to all xml from deleted table
    set @AuditMessage = (select * from deleted for xml auto) 

    insert into AuditAll( DateTime, TableName, AuditEntry ) 
        values ( GetDate(), 'Simple', @AuditMessage )
end

END
GO

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

веселит

Ответ 3

Вы можете попробовать стороннее решение с таргетингом на триггер, например ApexSQL Audit - инструмент аудита для баз данных SQL Server, который фиксирует изменения данных, которые произошли в базе данных, включая информацию о том, кто внес изменения, какие объекты были затронуты, когда он был сделан, а также информацию о логине, приложении и хосте SQL, используемом для внесения изменений. Он сохраняет всю захваченную информацию в центральном репозитории и экспортирует их в формате, удобном для печати. ​​

Отказ от ответственности: я работаю инженером по поддержке продуктов на ApexSQL

Ответ 4

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

Ответ 5

Взгляните на эту статью - Аудит в SQL Server 2008, который прекрасно использует возможности аудита, уже присутствующие в SQL Server 2008.

Я должен также упомянуть, что @Microtechie отвечает на некоторые замечательные статьи. Прочитайте их и решите, какой из них легче адаптировать.

Ответ 6

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

Вы также можете прочитать информацию из журнала, чтобы получить измененную информацию.

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

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