在Oracle中进行审计

时间:2010-05-06 17:58:29

标签: oracle triggers audit auditing

我需要在Oracle的审核方面提供一些帮助。我们有一个包含许多表的数据库,我们希望能够审计对任何字段中的任何表所做的每个更改。因此,我们希望在此审计中拥有的内容是:

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

所以我们开始创建触发器,该触发器应该对任何表执行审计,但后来遇到了问题......

正如我之前提到的,我们有很多表,我们不能为每个表创建一个触发器。因此,我们的想法是创建一个主触发器,它可以动态地触发任何触发触发器的表。我试图这样做,但根本没有幸运......似乎Oracle限制了触发器环境只是为了一个由代码声明的表而不是像我们想要的那样动态。

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

2 个答案:

答案 0 :(得分:5)

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

但如果您的版本较少或因某些原因FGA不符合您的口味,请按照以下步骤操作。关键是:为每个应用程序表构建一个单独的审计表

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

  1. 它没有缩放(触摸十列的单个更新产生十个插入)
  2. 插入记录时怎么样?
  3. 在任何给定时间组装记录状态是完全痛苦的
  4. 因此,为每个应用程序表创建一个具有相同结构的审计表。这意味着在应用程序表上包含CHANGED_TIMESTAMP和CHANGED_USER,但这不是一件坏事。

    最后,你知道它在哪里领先,在每个表上都有一个触发器,它将只有:NEW值的整个记录​​插入到审计表中。 INSERT和UPDATE将触发该触发器。这给出了完整的历史记录,很容易区分两个版本的记录。对于DELETE,您将插入一个审核记录,其中只填充了主键,所有其他列都为空。

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

答案 1 :(得分:4)

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

Oracle提供灵活且细粒度的审计跟踪服务。以this document(9i)为出发点。 (编辑:以下是同一文档的10g11g版本的链接。)

您可以审核它可以like drinking from the firehose - 这可能会在某些时候损害服务器性能,或者可能会给您留下如此多的审核信息,导致您无法从中提取有意义的信息它很快,和/或你可能最终占用大量的磁盘空间。花一些时间考虑一下你真正需要多少审计信息,以及你需要多长时间来保持它。要做到这一点,可能需要从基本配置开始,然后在能够获得实际收集的审计跟踪数据量的样本之后对其进行定制。