【问题标题】:Auditing Changes under MVC & Entity Framework (using sprocs)审计 MVC 和实体框架下的更改(使用 sprocs)
【发布时间】:2011-11-01 08:54:04
【问题描述】:

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

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

事实证明更新是问题所在。

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

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

有没有人建议以安全的方式保留原始值,以便与更新后的值进行比较,从而存储更改?

(我很感激我可以为这些返回数据库,但效率不高,我必须保留所有参数以重新进行相同的调用,并找到一种方法来自动化这部分过程)。

【问题讨论】:

    标签: asp.net-mvc entity-framework audit


    【解决方案1】:

    您是否尝试过使用 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 之前必须重新选择记录汽车。另请注意,对于执行 DELETE 的存储过程,您将在 OUTPUT 中使用 DELETED.* 而不是 INSERTED.*。

    【讨论】:

    • 在我们的环境中,触发器是不允许的,所以 For XML 听起来像是一个选项,不幸的是,这篇文章没有详细说明如何使用它进行审计
    【解决方案2】:

    如果使用 SQL Server,我建议您查看 Change Data Capture (CDC)。

    这是一种开箱即用的解决方案,用于审核对应用程序基础表的更改,并且设置起来相对简单,因此您无需再维护自定义解决方案。

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

    由于您的 asp.net 应用程序可能在一个特定帐户下运行,您可能需要添加额外的跟踪信息来捕获进行更改的用户。幸运的是,这也相对简单。以下Stack Overflow question 介绍了使用ObjectStateManager 的方法

    【讨论】:

      【解决方案3】:

      我自己也在找这个,找到了,看看Tracker for EF

      【讨论】:

        猜你喜欢
        • 2014-12-08
        • 2015-08-24
        • 1970-01-01
        • 2014-01-24
        • 2011-04-18
        • 2017-04-03
        • 2013-10-31
        • 1970-01-01
        • 2018-05-15
        相关资源
        最近更新 更多