我有一张有 120 列的表。我需要设置审计跟踪,如果它被更改,它将记录任何列。就像现在一样,我想我必须为每一列设置一个条件如下的触发器:
IF(NEW.columnName != OLD.columnName)
THEN //log the old value
这需要做 120 次……虽然 20 年前我会接受这种方法,但今天我拒绝相信不可能自动化这样一个简单的过程来自动查找更改的列。
这是我到目前为止发现的:
- NEW 和 OLD 都不是表格,它是一种语言结构,因此您不能执行“SELECT NOW.*”或类似的操作。
- 触发器中不允许使用动态 SQL(这可以解决问题)。
- 触发器中不允许使用动态 SQL 的过程(说真的,Oracle,看起来您无论如何都非常努力地禁用此功能)。
我正在考虑将 BEFORE 和 AFTER 触发器与可能解决问题的临时表和变量结合使用,但是仍然需要动态 SQL。我觉得我走到了死胡同。
有没有办法解决这个问题?
一个附带问题:这在 PostgreSQL 中可能吗?
更新:我发现了 2 个潜在的解决方案,但它们对我来说都不够清楚: