Asp.net mvc 在MVC和实体框架下审核更改(使用存储过程控制)

Asp.net mvc 在MVC和实体框架下审核更改(使用存储过程控制),asp.net-mvc,entity-framework,audit,Asp.net Mvc,Entity Framework,Audit,我面临的挑战是需要审核MVC应用程序用户所做的数据更改 审核记录的创建和删除很容易 事实证明,更新是个问题 我正在寻找一种自动化的方法,但我遇到的问题是,应用程序正在使用存储过程返回复杂类型 然后,这些值用于构建视图模型,回发后,控制器将接收从视图传回的表单值构建的新视图模型。因此,原始值不再可用 是否有人对保存原始值的安全方法有任何建议,以便将其与更新后的值进行比较,从而存储更改 我很感激我可以返回数据库进行这些操作,但效率不高,我必须保留所有参数以重新进行相同的调用,并找到一种方法来自动化该

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

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

事实证明,更新是个问题

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

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

是否有人对保存原始值的安全方法有任何建议,以便将其与更新后的值进行比较,从而存储更改


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

您是否尝试过使用插入表和删除表的审核触发器。

在用于插入、删除、更新的存储过程中,可以使用XML AUTO。获取记录的XML并将其添加到审核表。

更新一个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子句use INSERTED.*设置为@temp_table,这样可以避免在获取FOR XML AUTO之前必须重新选择记录。另一个注意事项是,对于确实删除的存储过程,您将在输出中使用DELETED.*而不是INSERTED.*。

您是否尝试过使用INSERTED和DELETED表的审核触发器。

在用于插入、删除、更新的存储过程中,可以使用XML AUTO。获取记录的XML并将其添加到审核表。

更新一个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子句use INSERTED.*设置为@temp_table,这样可以避免在获取FOR XML AUTO之前必须重新选择记录。另一个注意事项是,对于确实删除的存储过程,您将在输出中使用DELETED.*而不是INSERTED.*。

如果使用SQL Server,我建议您查看CDC

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

如果您的站点有任何支持应用程序,也将介绍这些应用程序,它还具有直接对数据库(例如运行脚本的DBA)所做的任何更改进行审核的好处


由于您的asp.net应用程序可能在一个特定帐户下运行,因此您可能需要添加其他跟踪信息以捕获做出更改的用户。幸运的是,这也相对简单。下面介绍了使用

的方法。如果使用SQL Server,我建议您查看CDC

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

如果您的站点有任何支持应用程序,也将介绍这些应用程序,它还具有直接对数据库(例如运行脚本的DBA)所做的任何更改进行审核的好处


由于您的asp.net应用程序可能在一个特定帐户下运行,因此您可能需要添加其他跟踪信息以捕获做出更改的用户。幸运的是,这也相对简单。下面介绍了一种使用

的方法,我自己在找这个,找到了这个,签出了

我自己在找这个,找到了这个,签出了

在我们的环境中,触发器是不允许的,所以for XML听起来像是一个选项,不幸的是,本文没有详细说明如何在我们的环境中使用它进行审核,触发器是不允许的,因此for XML听起来像是一个选项,不幸的是,本文没有详细说明如何使用它进行审核