2011-04-27 79 views
2

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

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语句逐一检查每列(首先选择当前值,然后使用文本框的值检查每个列)I做了另一个ASPX网络应用程序,这是痛苦的。

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

+0

你有没有找到一种方法来做到这一点?你用什么数据库结构来保存这些信息......我现在有同样的问题:)谢谢 – VAAA 2012-08-27 20:41:56

回答

0

我看到的样子,你有两个选择:

  • 在数据库端创建触发器,映射变化表通过表基础和获得的结果为Log

OR

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

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

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) 

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

1

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

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

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

但是您需要第三方sql transaction log reader。红门只有sql server 2000的免费解决方案。如果你的服务器是2005或更高,你可能会想要去ApexSQL Log

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