繁体   English   中英

跟踪 SQL 服务器数据库的用户活动日志

[英]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

或者

  • 让代码处理更改。 您将拥有一个带有数据的基本 class 和反射,您可以迭代所有 object 属性并查看发生了什么变化。 然后将其保存到您的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM