【发布时间】:2011-04-12 02:21:42
【问题描述】:
我需要对更新一行进行一些审核。
所以我有一个函数接收 some_table%ROWTYPE 类型的参数,其中包含要为该行保存的新值。
我还需要在历史记录表中保存一些关于更改了哪些列值的信息。我正在考虑从 all_tab_columns 中获取 some_table 的列名,然后遍历这些以比较旧值和新值并查看它是否已更改。问题是一旦我有了列名,我就不知道如何访问我的 ROWTYPE 变量中的值。类似 var.getProperty(columnName)。
我想这样做是为了避免有一堆 IF,每个字段一个,而且它也可以直接在表中添加一个新列。
我也不能使用触发器,因为上级说“没有触发器!”。 (如果这确实是唯一的方法,我可以尝试再次与他们讨论这个问题)。
【问题讨论】:
-
当然,有很多方法可以处理这个问题,但在我看来,触发器是维护历史表的最佳方法。
-
@BobJarvis - 触发器是调用某些代码的简单机制。我们在触发器中没有什么是我们不能在 Andrei 在这里描述的函数中做的。
-
@APC:我恭敬地提出,不同之处在于触发器在给定条件下提供自动执行,例如ON INSERT、ON DELETE 等。虽然可以在一个函数中实现相同的功能,但现在必须编写所有维护相关基表的代码来调用“历史表更新”函数,我的经验是这些类型的事情很容易被遗忘、忽视或绕过。如果@Andrei 的管理层下令“禁止触发!”历史表更新最好作为一个过程来实现,但 IMO 触发器会更好。 YMMV。
标签: oracle reflection plsql audit