oracle - Oracle 中的审计

标签 oracle triggers audit auditing

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

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

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

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

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

最佳答案

如果您有 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 语句已经足够简单了。

关于oracle - Oracle 中的审计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2783298/

相关文章:

database - Oracle 数据库 11g 使用了哪个 PKCS#11 函数?

sql - 只打印列中的最大值

mysql - 分隔符$$和//有什么区别

mysql - 使用 sql 审核 .net 应用程序

mysql - 比较最接近交易日期的有效历史记录

php - 当字符串也是字符串变量时,如何为字符串中存在的变量赋值?

oracle - 在Oracle中如何 "select * from my_table;"返回错误ora-00904?

mysql - 检查重复电子邮件地址的触发器

Mysql 插入时触发错误

ruby-on-rails - 如何捕获 ActiveRecord 表的审计历史