Sql server 跟踪SQL Server数据库的用户活动日志

Sql server 跟踪SQL Server数据库的用户活动日志,sql-server,linq-to-sql,asp.net-mvc-3,logging,Sql Server,Linq To Sql,Asp.net Mvc 3,Logging,我有一个包含多个表的数据库,我想通过我的MVC3Web应用程序记录用户的活动 User X updated category HELLO. Name changed from 'HELLO' to 'Hi There' on 24/04/2011 User Y deleted vehicle Test on 24/04/2011. User Z updated vehicle Bla. Name changed from 'Blu' to 'Bla' on 24/04/2011.

我有一个包含多个表的数据库,我想通过我的MVC3Web应用程序记录用户的活动

User X updated category HELLO. Name changed from 'HELLO' to 'Hi There' on 24/04/2011       
User Y deleted vehicle Test on 24/04/2011.
User Z updated vehicle Bla. Name changed from 'Blu' to 'Bla' on 24/04/2011.
User Z updated vehicle Bla. Wheels changed from 'WheelsX' to 'WheelsY' on 24/04/2011.
User Z updated vehicle Bla. BuildProgress changed from '20' to '50' on 24/04/2011
我最初的想法是在我所有有数据库crud的操作上添加几行代码,将这些字符串输入到表中

有没有更好的方法来检查哪一个表和列被修改了,而不是用if语句逐个检查每一列。首先,我选择当前值,然后用文本框的值检查每一列。我为另一个ASPX web应用程序做了这样的检查,这很痛苦


现在我正在使用MVC和ADO.NET实体数据模型,我想知道是否有一种更快的方法来查找已更改的列,并像上面那样构建日志。

按照我的理解,您有两种选择:

在数据库端创建触发器,逐个表映射表中的更改,并将结果放入日志表中 或

让代码处理更改。您将拥有一个包含数据和反射的基类,您可以迭代所有对象属性并查看发生了什么变化。然后将其保存到日志表中。当然,这种编码将在您的数据访问层上进行。
顺便说一句,如果您有一个好的代码结构/体系结构,我会选择第二个选项。

您可以在要监视的每个表的insert/update/deelte之后使用触发器。beauty是columns\u updated,它返回一个barbinary值,指示哪些列已更新

下面是我放在每个触发器中的一些代码片段:

IF (@@ROWCOUNT = 0) return declare @AuditType_ID int , @AuditDate datetime , @AuditUserName varchar(128), @AuditBitMask varbinary(10) select @AuditDate = getdate() , @AuditUserNAme = system_user, @AuditBitMask = columns_updated() -- Determine modification type IF (exists (select 1 from inserted) and exists (select 1 from deleted)) select @AuditType_ID = 2 -- UPDATE ELSE IF (exists (select * from inserted)) select @AuditType_ID = 1 -- INSERT ELSE select @AuditType_ID = 3 -- DELETE (record this data to your table of choice)
我有一个特殊的函数可以解码位掩码值,但由于某些原因,它在这里粘贴不好。给我发消息,我会通过电子邮件发送给你。

你也可以通过将数据库置于完全恢复模式,然后读取事务日志来完成此操作

当数据库处于完全恢复模式时,sql server会记录所有更新、插入和删除以及其他操作,如创建、更改、删除。。语句输入到它的事务日志中

因此,使用这种方法,您不需要对应用程序或数据库结构进行任何额外的更改

但你需要第三方。Red gate仅提供用于sql server 2000的免费解决方案。如果您的服务器是2005或更高版本,您可能希望使用


此外,这种方法将无法审核select语句,但如果您真的不需要审核select查询,那么它肯定是最容易实现的方法。

您好,您找到这样做的方法了吗?您使用什么数据库结构来保存此信息。。。我现在有同样的问题:谢谢