Database 更改日志/审核数据库表的最佳设计?

Database 更改日志/审核数据库表的最佳设计?,database,database-design,audit,Database,Database Design,Audit,我需要创建一个数据库表来存储不同的变更日志/审核 (当某物被添加、删除、修改等时)。我不需要存储特别详细的信息,所以我想大致如下: id(用于活动) 触发它的用户 事件名称 事件描述 事件的时间戳 我是不是遗漏了什么?显然,我可以继续改进设计,尽管我不打算让它变得复杂(为事件类型或类似的东西创建其他表是不可能的,因为这是我需要的一个复杂问题)。有很多方法可以做到这一点。我最喜欢的方式是: 将mod_user字段添加到源表(要记录的表)中 创建包含要记录的字段的日志表,以及log\u date

我需要创建一个数据库表来存储不同的变更日志/审核 (当某物被添加、删除、修改等时)。我不需要存储特别详细的信息,所以我想大致如下:

  • id(用于活动)
  • 触发它的用户
  • 事件名称
  • 事件描述
  • 事件的时间戳

我是不是遗漏了什么?显然,我可以继续改进设计,尽管我不打算让它变得复杂(为事件类型或类似的东西创建其他表是不可能的,因为这是我需要的一个复杂问题)。

有很多方法可以做到这一点。我最喜欢的方式是:

  • mod_user
    字段添加到源表(要记录的表)中

  • 创建包含要记录的字段的日志表,以及
    log\u datetime
    seq\u num
    字段
    seq_num
    是主键

  • 在源表上构建一个触发器,每当任何监视字段发生更改时,该触发器都会将当前记录插入日志表


  • 现在,您已经有了每项更改的记录以及更改人。

    我们还将新旧值及其来源的列以及正在审核的表的主键记录在审核详细信息表中。想想你需要审计表做什么?你不仅想知道是谁做了改变,什么时候做了改变,而且想知道当坏的改变发生时,你想用一种快速的方法把数据放回去


    在设计时,应该编写代码来恢复数据。当您需要恢复时,通常是匆忙的,最好已经做好准备。

    我们的表中有:-

    Primary Key
    Event type (e.g. "UPDATED", "APPROVED")
    Description ("Frisbar was added to blong")
    User Id
    User Id of second authoriser
    Amount
    Date/time
    Generic Id
    Table Name
    

    通用id指向表中已更新的行,表名是该表的字符串名称。不是一个好的数据库设计,但非常有用。我们所有的表都有一个单独的代理键列,因此效果很好。

    在我正在处理的项目中,审核日志也从非常简约的设计开始,如您所述:

    event ID
    event date/time
    event type
    user ID
    description
    
    想法是一样的:保持事情简单

    然而,这种极简主义的设计显然是不够的。典型的审计归结为以下问题:

    Who the heck created/updated/deleted a record 
    with ID=X in the table Foo and when?
    
    因此,为了能够快速回答这些问题(使用SQL),我们在审计表中增加了两列

    object type (or table name)
    object ID
    
    这时,我们的审计日志设计才真正稳定下来(几年前)


    当然,最后的“改进”只适用于具有代理键的表。但是你猜怎么着?我们所有值得审计的表都有这样一个键

    这里和类似的问题都有很多有趣的答案。根据个人经验,我唯一可以补充的是:

  • 将审核表放在另一个数据库中。理想情况下,您希望与原始数据分离。如果需要恢复数据库,则不需要恢复审核跟踪

  • 尽可能合理地去规范化。您希望表与原始数据的依赖关系尽可能少。审计表应该简单、快速,以便从中检索数据。不需要通过连接或跨其他表查找数据


  • 您可能还需要审核其他一些内容,例如表/列名、进行更新的计算机/应用程序等

    现在,这取决于您真正需要的审计的详细程度和级别

    我们开始构建我们自己的基于触发器的审核解决方案,我们希望审核所有内容,并且手头有一个恢复选项。结果证明这太复杂了,所以我们最终对基于触发器的第三方工具进行了反向工程,以创建我们自己的定制解决方案

    小贴士:

    • 包括前后值

    • 包括3-4列用于存储主键(如果是复合键)

    • 按照Robert的建议,将数据存储在主数据库之外

    • 花相当多的时间准备报告,尤其是那些您可能需要恢复的报告

    • 计划存储主机/应用程序名称–这对于跟踪可疑活动可能非常有用


    • 根据分离原理:

    • 审计数据表需要与主数据库分开。因为审计数据库可能有很多历史数据,所以从内存利用率的角度来看,将它们分开是有意义的

    • 不要使用触发器来审核整个数据库,因为最终会有一大堆不同的数据库需要支持。您必须为DB2、SQLServer、Mysql等编写一个

    • 通常,自定义审核(创建各种表)是一个不好的选择。可以禁用数据库/表触发器以跳过某些日志活动。自定义审核表可以被篡改。可能会发生导致应用程序停止的异常。更不用说设计健壮解决方案的困难了。到目前为止,我在讨论中看到了一个非常简单的例子。您需要与当前数据库和任何特权用户(DBA、开发人员)完全分离。 每一个主流RDBMS都提供了审计功能,即使是DBA也无法禁用、秘密篡改这些功能。因此,RDBMS供应商提供的审计能力必须是第一选择。另一个选项是第三方事务日志读取器或自定义日志读取器,它将分解的信息推送到消息传递系统中,最终以某种形式的审计数据仓库或实时事件处理程序结束。
      总之:解决方案架构师/“动手数据架构师”需要根据需求设计这样一个系统。通常情况下,交给开发人员解决问题是非常严肃的事情。

      那么……mod_用户字段应该做什么?告诉你是谁做的更改。更新代码应该包括一些设置该字段为当前用户的内容。abo是什么