我需要创建一个数据库表来存储不同的更改日志/审计 (添加、删除、修改等内容时)。我不需要存储特别详细的信息,所以我在考虑以下内容:

  • 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

那时我们的审计日志的设计才真正稳定下来(几年了)。

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

其他提示

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

现在,这取决于您真正需要的审核详细程度以及级别。

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

尖端:

  • 包括之前/之后的值

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

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

  • 花大量时间准备报告 - 尤其是那些您可能需要恢复的报告

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

我们还在审计详细信息表中记录旧值和新值以及它们所在的列以及正在审计的表的主键。想想你需要审计表做什么?您不仅想知道谁在何时进行了更改,而且当发生错误的更改时,您还需要一种快速的方法来恢复数据。

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

这里和类似的问题有很多有趣的答案。我可以从个人经验中补充的唯一内容是:

  1. 将您的审计表放在另一个数据库中。理想情况下,您希望与原始数据分离。如果您需要恢复数据库,您实际上并不想恢复审计跟踪。

  2. 尽可能合理地反规范化。您希望表对原始数据的依赖性尽可能少。审计表应该简单且能够快速检索数据。无需通过其他表进行花哨的联接或查找来获取数据。

我们的表中有什么:-

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 指向表中已更新的行,表名称是该表的字符串名称。不是一个好的数据库设计,但是非常有用。我们所有的表都有一个代理键列,因此效果很好。

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

  1. 添加一个 mod_user 字段添加到源表(您要记录的表)。

  2. 创建一个日志表,其中包含要记录的字段以及 log_datetimeseq_num 场地。 seq_num 是主键。

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

现在您已经记录了每项更改以及更改者。

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

根据分离原理:

  1. 审计数据表需要与主数据库分开。由于审计数据库可能包含大量历史数据,因此从内存利用率的角度来看,将它们分开是有意义的。

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

聚会迟到了,但我强烈推荐 自动审计项目.
它是 100% 免费和开源的。它的作者是 SQL MVP Paul Nielsen 和 John Sigouin。它非常稳定,目前版本为 3.30。

安装简单。只需运行他们提供的 SP 即可。它将创建一个审计模式、一些维护 SP 以及进行审计所需的触发器。从那里,只需选择您想要审核哪些表以及审核哪些详细信息。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top