摘要:介绍一个完整的Audit Trail解决方案,不仅可以记录每一笔业务操作的信息(比如操作时间、操作者等),并且可以追踪每一笔业务引起的说有数据的改变(如果需要)。
一、数据表的设计
在数据库中,我们通过如右图所示的具有主子关系的两个表存储AuditLog相关信息。我们将“事务”作为我们进行追踪的单位,不过这里的讲的“事务”更多地指业务处理事务的概念。每一个被追踪的事务在AuditLog表具有一条匹配的记录,该记录表示该事务的基本信息:UserName(操作者)、AuditTime(操作时间)、Activity(可以看成是对事物的命名)和Description(事务补充性的描述)。主键TransactionId唯一标识一个事务。
子表AuditLogData记录事务详细的信息,即事务所引起的数据变化。一个完整的业务逻辑往往涉及到对多个数据表、多条记录的操作。而AuditLogData每一条记录表示某个事务针对某个单一数据表所带来的数据变化,而SourceTable字段表示源表的名称。而DataChange字段以XML的形式表示数据的改变,它具有如下的格式。
二、数据变化的表示
数据操作类型无外乎添加、更新和删除,我们通过不同的XML结构表示不同操作引起的数据改变。具体来说,对于添加操作,我们需要记录下插入的记录;对于删除操作,需要记录下原来的记录;而对于数据更新,则需要同时记录下更新先后的记录。
举个例子,假设我们具有一个Users表,它具有三个基本字段:Id、Name和Birthday。下面的XML分别表示添加、删除和更新操作后我们需要记录下的数据变化。
1: <?xml version="1.0" encoding="utf-8" ?> 2: <cdc operation="insert"> 3: <current> 4: <Id type="VARCHAR(50)">001</Id> 5: <Name type="NVARCHAR(50)">Foo</Name> 6: <BirthDay type="DATE">1981-08-24</BirthDay> 7: </current> 8: </cdc> 1: <?xml version="1.0" encoding="utf-8" ?> 2: <cdc operation="delete"> 3: <original> 4: <Id type="VARCHAR(50)">001</Id> 5: <Name type="NVARCHAR(50)">Foo</Name> 6: <BirthDay type="DATE">1981-08-24</BirthDay> 7: </original> 8: </cdc> 1: <?xml version="1.0" encoding="utf-8" ?> 2: <cdc operation="update"> 3: <original> 4: <Id type="VARCHAR(50)">001</Id> 5: <Name type="NVARCHAR(50)">Foo</Name> 6: <BirthDay type="DATE">1981-08-24</BirthDay> 7: </original> 8: <current> 9: <Id type="VARCHAR(50)">001</Id> 10: <Name type="NVARCHAR(50)">Bar</Name> 11: <BirthDay type="DATE">1982-07-10</BirthDay> 12: </current> 13: </cdc> |
当然,你也可以根据需要自定义XML的结构。