[英]Tracking User activity log for SQL Server database
我有一个包含多个表的数据库,我想通过我的 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 语句逐一检查每一列(首先我 select 当前值,然后用文本框的值检查它们中的每一个)我做了另一个ASPX web 应用程序,这很痛苦。
现在我正在使用 MVC 和 ADO.NET 实体数据 Model 我想知道是否有一种更快的方法来查找已更改的列并构建像上面那样的日志。
您还可以通过将数据库置于完全恢复模式然后读取事务日志来完成此操作。
当数据库处于完全恢复模式时,sql 服务器将所有更新、插入和删除(以及其他诸如创建、更改、删除等)语句记录到其事务日志中。
因此,使用这种方法,您不需要对应用程序或数据库结构进行任何附加更改。
但是您将需要第 3 方sql 事务日志阅读器。 Red Gate 仅针对 sql server 2000 提供免费解决方案。 如果您的服务器是 2005 或更高版本,您可能希望 go 与ApexSQL 日志
此外,这种方法将无法审核 select 语句,但如果您真的不需要审核 select 查询,它绝对是最容易实施的。
在我看来,你有两个选择:
Log
表或者
Log
表中。 当然,该编码将在您的数据访问层上。顺便说一句,如果你有一个好的代码结构/架构,我会选择 go 和第二个选项。
您可以在要监视的每个表上都有一个触发器(插入/更新/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)
我有一个特殊的 function 可以解码位掩码值,但由于某种原因,它不能很好地粘贴在这里。 给我发消息,我会 email 给你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.