动态审核触发器

时间:2018-02-16 05:27:07

标签: oracle plsql

我想将所有表的日志保存到1个单一的日志表中。假设在DB内的任何表上进行任何DML操作。应该记录在1个单独的表中。

但是应该有一个动态触发器,它不会对每个表的列名进行硬编码。

有没有解决方案。

此致

Somdutt Harihar

2 个答案:

答案 0 :(得分:3)

  

“有没有解决方案”

没有。这不是数据库的工作方式。强制执行的数据结构就是他们所做的,并且与事务表一样适用于审计表。

原因很清楚:保存不写特定于每个事务表的审计代码的时间是编写查询以检索审计记录所花费的时间。不同之处在于,当您试图获取审计记录时,您的老板会站在您的肩膀上,要求知道何时可以告诉他们上个月工资单记录发生了什么。或者问你需要多长时间才能为监管机构制作这份报告,你是否试图让公司看起来像一群小丑?你得到了照片。这不是你想要的地方。

另外,单个表的性能是否存储了数据库中所有表的所有更改?那将是如此缓慢,你不知道。

关键是,我们可以生成审计代码。编写一些查询the data dictionary并为目标表和触发器生成DDL以填充这些表的SQL很容易。

事实上,它在11.2.0.4及更高版本中变得更加容易,因为我们可以使用FLASHBACK DATA ARCHIVE(以前的Oracle Total Recall)自动构建和维护这样的日志功能,并使用as of语法自动查询。 Find out more

好的,技术上有一个解决方案。你可以在每个表上有一个触发器,它执行一些动态PL / SQL来查询数据字典并组装一块JSON,你可以将它放入你的单个表中。单个表可以按日期范围进行分区,并按表名进行子分区(假设您已获得“分区”选项的许可)以降低查询性能。

但这非常复杂。为每个DML语句运行动态PL / SQL将对性能产生不良影响,用户会注意到这一点。这仍然无法解决在需要时检索审计跟踪的基本问题。

答案 1 :(得分:0)

要审核任何表上的DML操作,只需使用以下代码启用此类审核:

audit insert table, update table, delete table;

所有带表的操作都将记录到 sys.dba_audit_object 表中。

审核只会记录时间戳,用户,主机和其他参数,而不是新行或旧行的精确副本。