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是什么