如何保持对表的更改的审计/历史记录

ewa*_*all 15 t-sql sql-server ado.net triggers

我被要求创建一个简单的DataGrid风格的应用程序来编辑数据库的单个表,这很容易.但部分请求是创建一个审计跟踪,包括所做的更改,制作者以及日期/时间.

你怎么能解决这种事情?

(我将在VS2008中使用C#,ADO.NET连接到SQL Server 2005,WPF和Xceed的DataGrid,如果它有任何区别.)

Sim*_*ens 12

创建审计跟踪有两种常用方法.

  1. 编码您的数据访问层.
  2. 在数据库本身使用触发器.

两者都有优点和缺点.有些人比较喜欢一个人.它通常取决于应用程序的类型以及您可以预期的数据库使用类型.

如果你在DA层中这样做,那就非常适合你了.您只需要为保存到数据库的每个方法添加代码,以便保存更改日志.如果您使用存储过程来处理所有内容,则此审核代码可能位于DA层代码中,甚至可能存储在数据库中的存储过程中.基本上前提是相同的,每当您对数据库进行更改时,请记录该更改.

如果你想沿着触发器路径走下去,你可以为每个表编写自定义触发器,或者设置一个在许多表上工作相同的更通用的触发器.查看有关审核触发器的文章.无论何时进行更改,触发器都会触发,触发器会记录更改.请记住,如果要审核SELECT语句,则不能使用触发器,您必须在代码/存储过程审核中执行此操作.值得记住的是,根据您的数据库,触发器可能无法在所有情况下触发.例如,大多数数据库在TRUNCATE语句期间不触发触发器.在您需要审核的任何情况下检查您的触发器是否被触发.

或者,您还可以查看使用服务代理在专用计算机上执行异步审核.这更复杂,需要进行一些配置才能进行设置.

无论您采用哪种方式,都需要确定审核日志的格式.通常,您会将此日志保存在数据库中,但您可以将其保存在日志文件中或任何符合您要求的日志中.您可以使用记录所有更改的单个审计表,也可以在每个要审计的主表上使用审计表.对于大规模实现,您甚至可以考虑将审计表放在完全独立的数据库中.如果您登录到表中,通常会有一个"更改类型"字段,指示审核的更改是插入,更新还是删除更改方式,以及更改的数据,进行更改的用户以及日期/时间改变了.不要忘记包含更新样式更改的旧数据和新数据.

  • 应用程序/存储过程中的审计代码是一个坏主意:访问该表的不同程序/交互式用户可能会绕过审计. (2认同)
  • 什么都做aufditing inteh数据访问层,这只是要求麻烦.还有其他方法可以更改需要记录的数据.如果您想要完整的审计跟踪,这必须在数据库中完成. (2认同)

Pan*_*nek 8

最通用的方法是创建另一个表来存储第一个表中的记录版本.然后,您可以从主表中删除所有数据.假设您需要对表Person(PersonId,Name,Surname)进行版本控制:

CREATE TABLE Person 
(
   PersonId INT,                   // PK
   CurrentPersonVersion INT        // FK
);

CREATE TABLE PersonVersion
(
  PersonVersionId INT,             // PK
  PersonID                         // FK 
  Name VARCHAR,                    // actual data
  Surname VARCHAR,                 // actual data

  ChangeDate                       // logging data
  ChangeAuthor                     // logging data
)

现在任何更改都需要插入新的PersonVersion并更新CurrentPersonVersionID.


mar*_*ton 8

同上使用触发器.

任何考虑软删除的人都应该阅读Richard Dingwall的软删除问题.