为我们的应用程序实现审计跟踪

时间:2013-06-01 01:23:52

标签: sql-server database-design

我想为我们的系统添加审计跟踪,因此当发生任何添加/删除/更新操作时,我将使用以下信息进行记录: -

  1. CRUD操作类型。是添加,删除还是更新。

  2. 已修改的记录ID。

  3. 日期和时间。

  4. 现在我发现了两种方法; 要么要有一个包含以下字段的审计跟踪表: -

    • ID。如123445。
    • CRUD_description。如删除
    • RECORD_ID。如Qaeop12771
    • 日期。如1june2O13

    有两个表用于CRUD操作的查找表,例如

    • CRUD_ID。比如3。
    • CRUD_Description.such,例如删除。

    然后审计审判将参考上表: -

    • ID。例如123445。
    • CRUD_ID(这将是CRUD表的外键),例如3。
    • RECORD_ID。如Qaeop12771
    • 日期。如1june2O13

    那么哪种方法更好?

    第二个问题如果我将遵循第二种方法。然后我最好在我的代码中使用CRUD_ID,例如,如果oprration是delete我可能有我的代码: -

    Inset into audit_trail (ID, CRUD_ID, Record_ID, Date) values ( 123445, 3,12771,1june2O13) //CRUID 3 represents delete operation.
    

    最好的问候

2 个答案:

答案 0 :(得分:10)

从数据库设计的角度来看(忽略数据库功能和应用程序架构)我希望通过实现一个名为Trail_History的平面表,为每个实体和每个字段设置一个审计跟踪表(更改历史记录)。没有外键到任何表,列将是:

  1. UserCode:表示进行更改的应用程序用户唯一标识符。 (强制)
  2. TransactionCode:任何CRUD操作都需要具有唯一的交易代码(如GUID)(必填)
  3. ChangeDate:交易日期。 (强制)
  4. EntityName:正在操纵的实体(表格)。(必填)
  5. ObjectId:被操纵主键的实体。
  6. FieldName:实体字段名称。
  7. OldValue:实体字段旧值。
  8. NewValue:实体字段新值
  9. OperationType:CRUD操作鉴别器。 (强制)
  10. 采用这种方法
    可以跟踪任何实体(表格)。报告将是可读的。只记录更改。
    事务代码将是检测更改的关键点通过一个动作和第二个问题将得到回答。

    希望对你有所帮助。

答案 1 :(得分:0)

实际上这两种方法的含义大致相同。

如果你需要一个新的审计操作,你需要在类型表中插入一条新记录,那么seond one将会更有效但灵活性更低。

您需要审核的信息量更有趣。因为说三个用户在彼此之后更新了记录,你仍然不知道谁更改了你设计中的内容。