ewa*_*all 15 t-sql sql-server ado.net triggers
我被要求创建一个简单的DataGrid风格的应用程序来编辑数据库的单个表,这很容易.但部分请求是创建一个审计跟踪,包括所做的更改,制作者以及日期/时间.
你怎么能解决这种事情?
(我将在VS2008中使用C#,ADO.NET连接到SQL Server 2005,WPF和Xceed的DataGrid,如果它有任何区别.)
Sim*_*ens 12
创建审计跟踪有两种常用方法.
两者都有优点和缺点.有些人比较喜欢一个人.它通常取决于应用程序的类型以及您可以预期的数据库使用类型.
如果你在DA层中这样做,那就非常适合你了.您只需要为保存到数据库的每个方法添加代码,以便保存更改日志.如果您使用存储过程来处理所有内容,则此审核代码可能位于DA层代码中,甚至可能存储在数据库中的存储过程中.基本上前提是相同的,每当您对数据库进行更改时,请记录该更改.
如果你想沿着触发器路径走下去,你可以为每个表编写自定义触发器,或者设置一个在许多表上工作相同的更通用的触发器.查看有关审核触发器的文章.无论何时进行更改,触发器都会触发,触发器会记录更改.请记住,如果要审核SELECT语句,则不能使用触发器,您必须在代码/存储过程审核中执行此操作.值得记住的是,根据您的数据库,触发器可能无法在所有情况下触发.例如,大多数数据库在TRUNCATE语句期间不触发触发器.在您需要审核的任何情况下检查您的触发器是否被触发.
或者,您还可以查看使用服务代理在专用计算机上执行异步审核.这更复杂,需要进行一些配置才能进行设置.
无论您采用哪种方式,都需要确定审核日志的格式.通常,您会将此日志保存在数据库中,但您可以将其保存在日志文件中或任何符合您要求的日志中.您可以使用记录所有更改的单个审计表,也可以在每个要审计的主表上使用审计表.对于大规模实现,您甚至可以考虑将审计表放在完全独立的数据库中.如果您登录到表中,通常会有一个"更改类型"字段,指示审核的更改是插入,更新还是删除更改方式,以及更改的数据,进行更改的用户以及日期/时间改变了.不要忘记包含更新样式更改的旧数据和新数据.
最通用的方法是创建另一个表来存储第一个表中的记录版本.然后,您可以从主表中删除所有数据.假设您需要对表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.