如何使用审计跟踪来显示哪些字段已被编辑?

Kir*_*ehn 7 php sql-server audit trail

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

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

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

申请中显示的两个要求如下:

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

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

项目#2是目前给我悲伤的项目.如果不对每个字段(或者需要很长时间执行的非常长的嵌套查询)执行单独查询,是否有人建议以最佳方式执行此操作?(我曾想过为表中的每个字段添加一个额外的"ModifiedFlag"字段,如果字段已被编辑,它将作为布尔指示符,但这似乎是很多开销.

dwe*_*ees 4

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

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

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

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

我会尝试让负责显示表单的代码也负责显示字段级别的审计数据。这会导致查询开销,但这就是显示这层额外信息的成本。也许您可以通过将元数据添加到审计信息中以方便检索,从而最大限度地减少数据库开销。

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

  • 与表中记录的更改相对应的更改头表。

领域:

changeId, changeTable, changedPrimaryKey, userName, dateTime
Run Code Online (Sandbox Code Playgroud)

- 与被改变的字段对应的改变字段表。

领域:

changeId, changeField, oldValue, NewValue
Run Code Online (Sandbox Code Playgroud)

样本内容:

改变标题:

'1', 'BooksTable', '1852860138', 'AdamsD', '2009-07-01 15:30'
Run Code Online (Sandbox Code Playgroud)

更改项目:

'1', 'Title', 'The Hitchhiker's Guide to the Gaxaly', 'The Hitchhiker's Guide to the Galaxy'
'1', 'Author', 'Duglas Adasm', 'Douglas Adams'
Run Code Online (Sandbox Code Playgroud)

这种结构既可以轻松查看审计跟踪,也可以轻松检索以显示所需的指标。一个查询(标题和项目表中的内部联接)足以检索所有信息以在单个表单中显示。(或者当您有显示的 ID 列表时甚至是一个表格)