更新日志/审计数据库表的最佳devise?
我需要创build一个数据库表来存储不同的更改日志/审计(当添加,删除,修改等)。 我不需要存储特别详细的信息,所以我正在思考一些问题:
- id(事件)
- 触发它的用户
- 事件名称
- 事件描述
- 事件的时间戳
我在这里错过了什么? 显然我可以继续改进devise,虽然我不打算使它变得复杂(为事件types创build其他表或类似的东西是不可能的,因为这是我需要的复杂)。
在我正在进行的项目中,审计日志也从极简主义的devise开始,就像您所描述的那样:
event ID event date/time event type user ID description
这个想法是一样的:保持简单。
但是,这个简约的devise显然是不够的。 典型的审计就是这样的问题:
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
那时候我们的审计日志的devise就真的稳定下来了(现在几年了)。
当然,最后的“改进”只适用于具有代理键的表格。 但猜猜怎么了? 我们所有值得审计的表格都有这样的关键!
还有更多的事情可能需要审计,如表/列名,更新的计算机/应用程序等等。
现在,这取决于您真正需要的详细审计以及在什么级别。
我们开始构build我们自己的基于触发器的审计解决scheme,我们希望审计所有事情,并且还有一个恢复选项。 事实certificate,这太复杂了,所以我们最终逆向工程基于触发器的第三方工具ApexSQL Audit来创build我们自己的定制解决scheme。
提示:
– 包括值之前/之后
– 包括3,4列用于存储主键(万一它是一个组合键)
– 如Robert所build议的,在主数据库之外存储数据
– 准备报告 – 特别是那些你可能需要恢复的报告 – 花费大量的时间
– 用于存储主机/应用程序名称的计划 – 这可能对跟踪可疑活动非常有用
我们还会在审计详细信息表中logging新旧值和它们所在的列以及正在审计的表的主键。 想想你需要审计表吗? 你不仅想知道谁做了什么改变,什么时候做什么,但是当一个坏的改变发生的时候,你想要一个快速的方法把数据放回去。
在devise时,您应该编写代码来恢复数据。 当你需要恢复时,通常是匆忙,最好已经做好准备。
有很多有趣的答案在这里和类似的问题。 我唯一能从个人经验中增加的是…
-
把你的审计表放入另一个数据库。 理想情况下,你想从原始数据分离。 如果您需要恢复数据库,则不需要恢复审计跟踪。
-
非常规范化尽可能合理的可能性。 您希望表格尽可能less地依赖于原始数据。 审计表应该简单快捷地从中检索数据。 没有花哨的join或查找跨其他表来获得数据。
有很多方法可以做到这一点。 我最喜欢的方式是:
0 – 将mod_user字段添加到您的源表(您想要logging的表)
1 – 创build一个日志表,其中包含您要logging的字段,以及一个log_datetime和seq_num字段。 seq_num是主键。
2 – 在源表上构build一个触发器,用于检查对任何受监视字段的更改,并将当前logging插入到任何更改的日志表中
现在你已经logging了每一个变化和谁做的。
我们在桌上有什么:
Primary Key Event type (eg "UPDATED", "APPROVED") Description ("Frisbar was added to blong") User Id User Id of second authoriser Amount Date/time Generic Id Table Name
通用标识指向已更新的表中的一行,表名是该表的string的名称。 不是一个好的数据库devise,但非常实用。 我们所有的表都有一个代理键列,所以这个效果很好。
一般来说,自定义审计(创build各种表)是一个不好的select。 可以禁用数据库/表触发器以跳过某些日志活动。 自定义审计表可能被篡改。 例外情况可能会导致申请失败。 不要提到devise一个强大的解决scheme的困难。 到目前为止,我在这个讨论中看到一个很简单的例子。 您需要从当前数据库和任何特权用户(DBA,Developers)完全分离。 每个主stream的RDBMS都提供审计工具,即使DBA也不能禁用,篡改保密。 因此,RDBMS供应商提供审计function必须是第一select。 其他选项可能是第三方事务日志读取器或自定义日志读取器,将分解的信息推送到消息系统,最终以某种forms的审计数据仓库或实时事件处理程序结束。 总而言之:解决scheme架构师/“Hands on Data Architect”需要根据需求涉及这样一个系统。 这通常是太严肃的东西,只是交给开发人员来解决。
根据分离的原则:
1)审计数据表需要与主数据库分开。 因为审计数据库可以有很多的历史数据。
所以从内存使用情况来看也是有道理的,也是分开的。
2)不要使用触发器来审计孔数据库。 因为你最终会得到不同的数据库支持。你必须为DB2,SQLServer和Mysql等编写一个。
晚会之后,我强烈推荐AutoAudit项目 。
它是100%免费和开源的。 它由SQL MVP Paul Nielsen和John Sigouin撰写。 它非常稳定,目前在3.30版本。
安装简单。 只要运行他们提供的SP。 它将创build审计模式,一些维护SP和执行审计所需的触发器。 从那里,只要select你想要审核的表格和细节。