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

时间:2011-04-27 19:53:43

标签: sql-server linq-to-sql asp.net-mvc-3 logging

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

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网络应用程序,它很痛苦。

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

3 个答案:

答案 0 :(得分:1)

您还可以通过将数据库置于完全恢复模式然后读取事务日志来实现此目的。

当数据库处于完全恢复模式时,sql server会将所有更新,插入和删除(以及其他如create,alter,drop ..)语句记录到其事务日志中。

因此,使用此方法,您无需对应用程序或数据库结构进行任何附加更改。

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

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

答案 1 :(得分:0)

我认为,你有两种选择:

  • 在数据库端创建触发器,按表格映射表中的更改并将结果导入Log

OR

  • 让代码处理更改。您将拥有一个包含数据和反射的基类,您可以迭代所有对象属性并查看已更改的内容。然后将其保存到您的Log表中。当然,编码将在您的数据访问层上。

顺便说一下,如果你有一个很好的代码结构/架构,我会选择第二个选项。

答案 2 :(得分:0)

您可以在要监视的每个表上触发(AFTER insert / update / deelte)。美丽是columns_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)

我有一个特殊的功能,可以解码位掩码值,但由于某种原因,它在这里没有好好粘贴。给我留言,我会通过电子邮件发给你。