Использование аудита таблиц для получения «снимков» таблицы - PullRequest
3 голосов
/ 12 января 2012

Мне нужно решение для следующей проблемы:

У меня будет таблица в SQL Server 2008, которая будет меняться ежедневно. Это небольшая таблица, максимум 5000 строк и около 5 полей.

Клиенту понадобится возможность просматривать все данные в таблице так, как они были в данный момент времени. Например, «покажи мне, как все данные выглядят в таблице 2 недели назад».

Кто-то упоминал, что проверка таблицы с помощью http://autoaudit.codeplex.com/ решит эту проблему.

Мои вопросы:

  1. Есть ли решение этой проблемы, которое включало бы простой аудит?
  2. Если так, то как бы я использовал одитинг для решения этой проблемы?
  3. Существует ли уже другое решение для такого рода задач, чтобы мне не пришлось изобретать велосипед?

Ответы [ 4 ]

2 голосов
/ 12 января 2012

Иметь аудиторскую таблицу, которой управляют триггеры.Что-то вроде:

create table YourAuditTable
(
    -- all of your source table's columns
    CreateDate datetime not null,
    DeleteDate datetime null
)
go

И ваш триггер будет выглядеть так:

create trigger AuditYourTable
on dbo.YourTable
after insert, update, delete
as

    if exists(select * from inserted)
    begin
        if exists(select * from deleted)
        begin
            -- this is for an update
            update YourAuditTable
            set DeleteDate = getdate()
            where YourIDCol in (select YourIDCol from deleted)
        end 

        -- this is just for an insert
        insert into YourAuditTable
        select *, getdate() as CreateDate
        from inserted
    end
    else
    begin
        -- this is just for a delete
        update YourAuditTable
        set DeleteDate = getdate()
        where YourIDCol in (select YourIDCol from deleted)
    end

go

Что это позволит вам сделать, это запросить таблицу аудита на определенный момент времени.Другими словами, просто используйте DATEDIFF, чтобы определить, была ли строка создана до этого заданного момента времени и удалена после нее (или вообще не удалена).1012 *

Чтобы запросить в таблице аудита данные о времени:

select *
from YourAuditTable
where CreateDate <= @PointInTimeDateTime
and
(
    DeleteDate is null or
    DeleteDate > @PointInTimeDateTime
)
1 голос
/ 12 января 2012

Вы можете реализовать свои таблицы как «временные таблицы» .

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

Существует дополнительная нагрузка на производительность вставки / обновления / удаления (но будет для любого решения на основе триггера).

Он легко поддерживает запрашиваемый вами «момент времени» (через UDF).

Если вы хотите что-то добавить или объяснить с этим, пожалуйста, дайтея знаю - я написал статью (и продолжение) довольно много месяцев назад, но потом не хватило пар / идей о том, что добавить дальше.

1 голос
/ 12 января 2012

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

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

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

Вам придется изменить способ, которым вы обычно выполняете процесс обновления записи (я бы сделал это вместо триггера), чтобы при обновлении записи она вставляла неактивную дату в текущую запись и добавляла новый. Сделайте то же самое с удалением, используя вместо триггера, чтобы деактивировать запись, а не удалить ее. Если это новый процесс, вы можете пропустить триггеры и просто написать обновления, которые делают то же самое, а также обновления неактивной даты, поданной, когда вы хотите удалить. Тем не менее, я считаю, что триггеры более надежны с точки зрения обеспечения целостности данных. Я бы лично сделал вместо триггеров и тех, позволил разработчикам писать нормальные обновления и удаления в пользовательском интерфейсе. Это обеспечит правильную обработку всех ошибок, независимо от того, пришли они из графического интерфейса или из-за adhoc-обновления в SSMS.

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

0 голосов
/ 12 января 2012

Это для MS SQL.(Также будет работать только в том случае, если вам нужно отобразить данные на конкретную дату, если вам нужно перейти к более точному моменту времени, перейдите к ответу таблицы аудита.)

Видя, что таблица настолько малаЛучше всего использовать функциональность Снимок, предоставляемую MS SQL.

Чтобы сделать снимок базы данных:

CREATE DATABASE YourDB_Snapshot_DateStamp ON
( NAME = YourDB_Data, FILENAME = 
'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Data\YourDB_Snapshot_DateStamp.ss' )
AS SNAPSHOT OF YourDB;
GO

См. эту страницу для справки: http://msdn.microsoft.com/en-us/library/ms175876.aspx

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

Важно отметить: снимки доступны только для чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...