Аудит изменений в MVC и Entity Framework (с использованием sprocs) - PullRequest
2 голосов
/ 22 августа 2011

У меня проблема с необходимостью аудита изменений данных, внесенных пользователями приложения MVC.

Аудит создания и удаления записей очень прост.

Обновления становятся проблемой.

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

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

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

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

Ответы [ 3 ]

0 голосов
/ 01 мая 2012

Если вы используете SQL Server, я рекомендую вам посмотреть Изменить сбор данных (CDC).

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

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

Поскольку ваше приложение asp.net может работать под одной конкретной учетной записью, вам, вероятно, потребуется добавить дополнительную информацию для отслеживания, чтобы зафиксировать пользователя, который внес изменение. К счастью, это также относительно просто. Следующий вопрос переполнения стека охватывает подход к этому с использованием ObjectStateManager

0 голосов
/ 22 ноября 2015

Я сам искал это, нашел это, заценил Трекер для EF

0 голосов
/ 22 августа 2011

Вы пробовали Аудиторский триггер, используя таблицы INSERTED и DELETED.http://weblogs.asp.net/jgalloway/archive/2008/01/27/adding-simple-trigger-based-auditing-to-your-sql-server-database.aspx

ИЛИ

В ваших хранимых процедурах для вставки, удаления, обновления вы можете использовать FOR XML AUTO.Чтобы получить XML для записи и добавить его в таблицу аудита.http://www.a2zdotnet.com/View.aspx?Id=71

ОБНОВЛЕНИЕ Пример T-SQL

BEGIN
-- these tables would be in your database
DECLARE @table TABLE(ID INT IDENTITY(1,1) PRIMARY KEY, STR VARCHAR(10), DT DATETIME)
DECLARE @audit_table TABLE(AuditXML XML, Type VARCHAR(10), Time DATETIME)
-- this is defined at the top of your stored procedure
DECLARE @temp_table TABLE(PK INT)
-- your stored procedure will add an OUTPUT to the temp table
INSERT INTO @table 
    OUTPUT inserted.ID INTO @temp_table
    VALUES  ('test1', GetDate()),
            ('test2', GetDate() + 2)
-- at the end of your stored procedure update your audit table
INSERT INTO @audit_table
    VALUES(
        (
            SELECT * 
                FROM @table 
                WHERE ID IN (SELECT PK FROM @temp_table) 
                FOR XML AUTO
        ), 
        'INSERTION', 
        GETDATE()
    )
-- your audit table will have the record data
SELECT * FROM @audit_table
END

В приведенном выше примере вы можете сделать temp_table клоном таблицы (иметь все столбцы из таблицы) и в предложении OUTPUT используйте INSERTED. * INTO @temp_table, это позволит избежать повторного выбора записей перед получением FOR XML AUTO.Еще одно примечание: для хранимых процедур, которые выполняют DELETE, вы должны использовать DELETED. * Вместо INSERTED. * В своем выходе.

...