【发布时间】:2019-06-21 13:23:04
【问题描述】:
我正在尝试将“基本”表的旧值和新值插入到审计表“审计”中。 问题在于如何将数据存储在审计表中。 如果更新了不止一列,我应该能够以这种格式存储它。
“审计”表的结构
Id | Column_Name | Old_Value | New_Value
1 | Strike | 4 | 5
2 | Spare | 3 | 7
3 | Score | 10 | 18
我的解决方案给出了以下结构
Id | old_strike | new_strike | old_spare | new_spare | old_score | new_score
1 | 4 | 5 | 3 | 7 | 10 | 18
我尝试过使用触发器将新旧值保存在一行中,但很难弄清楚如何遍历每列的单个插入语句。
AFTER INSERT OR UPDATE OR DELETE ON frame -- after event
FOR EACH ROW // fires for each record
BEGIN
INSERT INTO frame_audit(bowler_id,game_id,frame_number,
old_strike,new_strike,
old_spare,new_spare,
old_score,new_score,
change_date,operation)
VALUES(:NEW.bowler_id,:NEW.game_id,:NEW.frame_number,
:OLD.strike,:NEW.strike,
:OLD.spare,:NEW.spare,
:OLD.score,:NEW.score,
SYSDATE,'UPDATE');
END audit_frames```
// Structure of 'Audit' table
Id | Column_Name | Old_Value | New_Value
1 | Strike | 4 | 5
2 | Spare | 3 | 7
3 | Score | 10 | 18
【问题讨论】:
-
没有动态读取列的新旧值的选项,您必须为所有列显式插入行
-
每列一行是一种熟悉的审计反模式。这似乎是明智的,但这是一场性能噩梦。更新表中的一行在审计中插入三行?母马。十列表这么十个插入?母马。只需审核已更改的列?祝你好运重新组装唱片的更改历史。另一个'母马。但是,如果您喜欢该结构,请确保您的 AUDIT 表具有 TRANSACTION_ID 列来标识一次更改的所有行。否则你将永远无法重建记录的状态。
标签: oracle plsql triggers database-trigger