MVC 和实体框架下的审计更改(使用 sprocs)



我面临的挑战是需要审计MVC应用程序的用户所做的数据更改。

审计记录的创建和删除是容易的。

更新被证明是问题所在。

我正在寻找一种自动化的方法,但是我遇到的问题是应用程序使用存储过程来恢复EF"复杂类型"。

这些然后用于构建视图模型,在回发之后,控制器接收从视图传回的表单值构建的新视图模型。因此,原始值不再可用。

有没有人有任何安全的方法来保持原始值,以便它们可以与更新的值进行比较,以便可以存储更改?

(我很感激我可以回到数据库中获取这些,但效率不高,而且我必须保留所有参数来重新创建相同的调用,并找到一种方法来自动化该过程的那一部分)。

您是否尝试过使用insert和DELETED表的Audit Trigger ?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

UPDATE一个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创建为table的克隆(拥有table中的所有列),并在OUTPUT子句中使用insert。* INTO @temp_table,这将避免在获得FOR XML AUTO之前必须重新选择记录。另一个注意事项,对于执行DELETE的存储过程,您应该使用DELETED。*代替insert。

如果使用SQL Server,我建议您查看更改数据捕获(CDC)。

这是一个开箱即用的解决方案,用于审计对应用程序底层表的更改,并且设置相对简单,因此不需要自定义解决方案,然后必须维护。

如果您的站点有任何支持应用程序,它们也将被覆盖,并且它还具有审计直接对数据库进行的任何更改的好处,例如来自DBA运行脚本的更改。

由于您的asp.net应用程序可能在一个特定的帐户下运行,您可能需要添加额外的跟踪信息来捕获进行更改的用户。幸运的是,这也是相对简单的。下面的堆栈溢出问题涵盖了使用ObjectStateManager

实现此目的的方法

我自己也在找这个,找到了这个,检查跟踪器EF

相关内容

  • 没有找到相关文章

最新更新