3

我在 Oracle 的审计方面需要一些帮助。我们有一个包含许多表的数据库,我们希望能够审计对任何字段中的任何表所做的每一次更改。所以我们希望在这次审计中拥有的东西是:

  • 修改的用户
  • 发生变化的时间
  • 旧值和新值

所以我们开始创建触发器,该触发器应该对任何表执行审计,但随后出现问题......

正如我之前提到的,我们有这么多表,我们不能为每个表创建一个触发器。所以这个想法是创建一个主触发器,它可以为任何触发触发器的表动态地运行。我试图做到这一点,但一点也不幸运……似乎 Oracle 仅针对由代码声明的表限制了触发器环境,而不是像我们想要的那样动态地声明。

您对如何执行此操作或解决此问题的任何其他建议有任何想法吗?

4

2 回答 2

5

如果你有 10g 企业版,你应该看看 Oracle 的Fine-Grained Auditing。这绝对比自己滚动要好。

但是,如果您有一个较小的版本或由于某种原因 FGA 不符合您的口味,这里是如何做到的。关键是:为每个应用表建立一个单独的审计表

我知道这不是您想听到的,因为它与您上面概述的表结构不匹配。但是为受更新影响的每一列存储一个包含 OLD 和 NEW 值的行是一个非常糟糕的主意:

  1. 它不能扩展(触摸十列的单个更新会产生十个插入)
  2. 插入记录时呢?
  3. 在任何给定时间组装记录的状态是一件非常痛苦的事情

因此,每个应用程序表都有一个审计表,具有相同的结构。这意味着在应用程序表中包含 CHANGED_TIMESTAMP 和 CHANGED_USER,但这并不是一件坏事。

最后,你知道这会导致什么,在每个表上都有一个触发器,它将仅包含 :NEW 值的整个记录​​插入到审计表中。触发器应在 INSERT 和 UPDATE 上触发。这给出了完整的历史记录,很容易区分记录的两个版本。对于 DELETE,您将插入仅填充主键且所有其他列为空的审计记录。

你的反对意见是你有太多的表和太多的列来实现所有这些对象。但是从数据字典(user_tables、user_tab_columns)生成表并触发 DDL 语句已经足够简单了。

于 2010-05-06T18:32:38.673 回答
4

您不需要编写自己的触发器。

Oracle 提供灵活且细粒度的审计跟踪服务。请查看此文档(9i) 作为起点。(编辑:这是同一文档的10g11g版本的链接。)

您可以进行如此多的审计,以至于它就像从消防水管中喝水一样- 这可能会在某些时候损害服务器性能,或者可能会给您留下如此多的审计信息,以至于您无法快速从中提取有意义的信息,和/或您最终可能会占用大量磁盘空间。花一些时间思考您真正需要多少审计信息,以及您可能需要保留它多长时间。为此,可能需要从基本配置开始,然后在您能够获得实际收集的审计跟踪数据量的样本后对其进行定制。

于 2010-05-06T18:05:36.017 回答