在Oracle中进行审计

Alv*_*tro 3 oracle audit triggers auditing

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

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

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

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

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

APC*_*APC 5

如果你有10g企业版,你应该看看Oracle的细粒度审计.这绝对比滚动你自己更好.

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

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

  1. 它没有扩展(触摸十列的单个更新产生十个插入)
  2. 插入记录时怎么办?
  3. 在任何给定时间组装记录状态是完全痛苦的

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

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

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