对于我正在处理的项目,我被要求创建对记录所做的所有更改的审计跟踪。这是我第一次创建审计跟踪,所以我一直在研究这个问题。
该应用程序将在PHP / MSSQL中开发,并且流量较低。
从我的阅读中,我几乎决定使用审计表并使用触发器来记录表中的更改。
申请中显示的两个要求如下:
能够查看对字段所做的所有更改的日志(我非常知道如何执行此操作)
在查看应用程序中的记录时,能够看到记录中任何字段旁边的指示符(以及可能的其他信息,如上次更改的日期)。
项目#2是目前给我悲伤的那个。如果不对每个字段(或者需要很长时间执行的非常长的嵌套查询)执行单独查询,是否有人建议以最佳方式执行此操作? (我曾想过为表中的每个字段添加一个额外的“ModifiedFlag”字段,如果该字段曾被编辑过,它将作为布尔指示符,但这似乎是很多开销。
答案 0 :(得分:4)
我会尽可能地将审核信息与实际域信息分开处理。
要求#1: 我认为您将创建其他审计表来记录更改。 Eric建议是一个很好的建议,使用SQL数据库中的触发器创建审计信息。这样您的应用程序就不需要了解审计逻辑。
如果您的数据库不支持触发器,那么您可能正在使用某种持久性或数据库层。这也是放置这种逻辑的好地方,同样,最小化普通应用程序代码和审计代码之间的任何依赖关系。
要求#2: 至于显示指标:我不会在存储实际的表中创建布尔字段。 (这会导致普通应用程序代码与审计跟踪代码之间存在各种依赖关系。)
我会尝试让负责显示表单的代码也负责在字段级别显示审计数据。这将导致查询开销,但这是显示此额外信息层的成本。也许您可以通过向审计信息添加元数据来最小化数据库开销,以便于检索。
我维护的一些大型企业应用大致使用以下结构:
字段:
changeId, changeTable, changedPrimaryKey, userName, dateTime
- 与更改字段对应的更改字段表。
字段:
changeId, changeField, oldValue, NewValue
示例内容:
更改标题:
'1', 'BooksTable', '1852860138', 'AdamsD', '2009-07-01 15:30'
更改项目:
'1', 'Title', 'The Hitchhiker's Guide to the Gaxaly', 'The Hitchhiker's Guide to the Galaxy'
'1', 'Author', 'Duglas Adasm', 'Douglas Adams'
这种结构既可以轻松查看审计跟踪,也可以轻松检索以显示所需的指标。一个查询(Header和Items表中的内部联接)足以检索要在单个表单中显示的所有信息。 (或者当你有一个显示Id的列表时甚至是一张表)
答案 1 :(得分:2)
作为一般要求,标记变更字段“闻起来”略显奇怪。如果记录长期存在并且随着时间的推移而发生变化,那么最终所有字段都会被标记。因此,我想知道任何用户如何理解每个字段的一组简单指标。
这种思路使我怀疑您存储的数据需要如您所描述的那样,记录所有更改的真实审计跟踪,并且第一个真正的挑战是决定如何将信息呈现给用户。
我认为你准备某种aggregateOfTheAuditTrail数据的想法可能非常有用。问题是每个记录足够一个标志?如果用户的主要访问权限是通过列表,那么可能只需突出显示已更改的记录以便以后向下钻取。或者记录值的最后更改日期,以便仅突出显示最近更改的记录 - 全部返回到用户的实际需求。我发现很难想象3年前改变的记录和上周改变的记录一样。
然后当我们来钻取到单个记录时。同样,每个字段的简单标记听起来并不有用(尽管您的域名,您的要求)。如果是,那么你的总结想法很好。我的猜测是,字段的一系列更改以及记录整体更改的顺序更加有趣。员工加薪,员工搬迁部门,员工晋升=三个单独的商业活动或一个?
如果需要的不仅仅是一个简单的标志,那么我怀疑你只需要返回记录的整个(或最近的)审计跟踪,并让UI弄清楚如何呈现它。
所以,我最初的想法:对摘要记录进行某种滚动维护听起来是个好主意。必要时在后台线程或批处理作业中维护。我们认为,每次都不需要完整的审计跟踪,这对业务有用。然后,为了进行详细分析,我们允许检索部分或全部路径。
答案 2 :(得分:0)
就个人而言,我会使跟踪变得简单,报告也很简单。
每次用户插入记录时,都会在该表的审核表中插入
'I', 'Date', 'User', 'Data column1','Data Column2', etc.
假设表的结构不会随时间而改变(重新计算数据列的数量)
有关更新,请插入
'U', 'Date', 'User', 'Data column1', etc
插入用户刚输入的内容作为更新。
然后,在插入和更新之后,您将拥有以下
'I','May 3 2009','BLT','person005','John','Smith','Marketing'
'U','May 4 2009','BLT','person005','John','Smith','Accounting'
然后,这只是一个简单的报告,显示独特的人物记录'person005'有一个插入和更新,其部门已更新。
由于系统使用率低,在更改时进行简单插入,因此更复杂的报告过程不会影响性能。这种风格仍然适用于更高流量的系统,因为编辑的额外负载是最小的,而报告更改的更高强度的工作负载并不像更新那样频繁地完成,因此系统不会倒下。 / p>