Php 我如何使用审核跟踪来显示哪些字段曾经被编辑过?

Php 我如何使用审核跟踪来显示哪些字段曾经被编辑过?,php,sql-server,audit,trail,Php,Sql Server,Audit,Trail,对于我正在从事的一个项目,我被要求对记录所做的所有更改创建审计跟踪。这是我第一次创建审计跟踪,所以我一直在做很多关于这个主题的研究 该应用程序将在PHP/MSSQL中开发,并且将具有低流量 从我的阅读中,我几乎决定创建一个审计表,并使用触发器记录表中的更改 应用程序中显示的两个要求如下: 能够查看对字段所做的所有更改的日志(我非常知道如何做到这一点) 在应用程序中查看记录时,能够看到记录中任何已更改字段旁边的指示器(以及可能的其他信息,如上次更改的日期) 第#2项是目前让我感到悲伤的一项。如果不

对于我正在从事的一个项目,我被要求对记录所做的所有更改创建审计跟踪。这是我第一次创建审计跟踪,所以我一直在做很多关于这个主题的研究

该应用程序将在PHP/MSSQL中开发,并且将具有低流量

从我的阅读中,我几乎决定创建一个审计表,并使用触发器记录表中的更改

应用程序中显示的两个要求如下:

  • 能够查看对字段所做的所有更改的日志(我非常知道如何做到这一点)

  • 在应用程序中查看记录时,能够看到记录中任何已更改字段旁边的指示器(以及可能的其他信息,如上次更改的日期)


  • 第#2项是目前让我感到悲伤的一项。如果不对每个字段执行单独的查询(或者执行很长的嵌套查询,需要很长时间),是否有人对执行此操作的最佳方法提出了建议?(我曾想过为表中的每个字段添加一个额外的“ModifiedFlag”字段,如果该字段曾经被编辑过,它将充当布尔指示符,但这似乎是一个很大的开销。

    我会尽可能将审计信息与实际域信息分开处理

    要求#1: 我认为您将创建额外的审计表来记录更改。 Eric的建议很好,在SQL数据库中使用触发器创建审计信息。这样应用程序就不需要知道审计逻辑

    如果您的数据库不支持触发器,那么您可能正在使用某种持久性或数据库层。这也是放置这种逻辑的好地方,因为您可以将普通应用程序代码和审核代码之间的任何依赖关系降至最低

    要求#2: 至于显示指标:我不会在表中创建存储实际值的布尔字段(这会导致普通应用程序代码和审计跟踪代码之间存在各种依赖关系)

    我会尝试让负责显示表单的代码也负责在字段级别显示审核数据。这将导致查询开销,但这是显示这一额外信息层的成本。也许您可以通过向审核信息添加元数据来最小化数据库开销,以便轻松检索。

    我维护的一些大型企业应用程序大致使用以下结构:

    • 与表中记录的更改相对应的更改标题表
    字段:

    changeId, changeTable, changedPrimaryKey, userName, dateTime
    
    changeId, changeField, oldValue, NewValue
    
    -与已更改字段相对应的更改字段表

    字段:

    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'
    

    此结构允许轻松查看审核跟踪以及轻松检索以显示所需的指标。一个查询(标题和项目表中的内部联接)就足以检索所有信息以单个形式显示。(或者,当您有显示的Id列表时,甚至可以检索一个表)

    作为一般要求,标记更改的字段“气味”有点奇怪。如果记录存在很长时间并且随着时间的推移会发生变化,那么最终所有字段都会被标记。因此,我想知道任何用户如何理解每个字段的一组简单指标

    这种思路让我怀疑,正如您所描述的,您存储的数据需要是一个记录了所有更改的真实审计跟踪,而第一个真正的挑战是决定如何将信息呈现给用户

    我认为您准备AuditRail数据的某种聚合的想法可能非常有用。问题是每个记录有一个标志就足够了吗?如果用户的主要访问权限是通过列表,那么只需突出显示更改的记录以供以后深入查看就够了。或者记录值的上次更改日期,以便我发现很难想象3年前更改的记录会像上周更改的记录一样有趣

    然后,当我们深入到单个记录时,每个字段的简单标志听起来也没什么用处(尽管是您的域、您的需求)。如果是的话,那么你的总结想法是好的。我猜一个字段的一系列更改以及记录的整体更改顺序更有趣。员工加薪、员工调动部门、员工晋升=三个单独的业务事件还是一个

    如果需要的不仅仅是一个简单的标志,那么我怀疑您只需要返回记录的整个(或最近的)审计跟踪,并让UI知道如何显示它


    因此,我最初的想法是:对摘要记录进行某种滚动维护听起来是个好主意。如果有必要,可以在后台线程或批处理作业中进行维护。我们将其设计为业务有用,而无需每次查看完整的审计跟踪。然后,为了进行详细分析,我们允许检索部分或全部跟踪。

    我个人认为我会让追踪变得简单,报告也变得有趣

    每次用户插入记录时,您都会向该表的审核表中插入一条记录

    '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”有一个插入和更新,他们的部门在那里被更新

    由于系统的使用率较低,在更改时插入一个简单的内容,然后进行更复杂的回购