【发布时间】:2012-07-24 06:39:51
【问题描述】:
我正在编写一个触发器来跟踪表中发生的所有更改。不幸的是,该表有 150 多列,我想避免在代码中编写每一列(例如 new.col1、new.col2 ....),因此我在“更新触发器后”中编写了以下查询
INSERT INTO logs SELECT *, NOW() FROM abc WHERE abc.id = NEW.Id;
由于更新查询中未更改的数据重复,此想法导致了多个问题。
简而言之,我想动态找出哪些列是更新查询的一部分,如果不可能,有没有办法遍历“新”行的所有列,以便我可以动态比较 old.@colName == new.@colName?
我已经看过了 Oracle PL/SQL: Loop Over Trigger Columns Dynamically、How to determine if anything changed in update trigger in t-sql 和 MySQL UPDATE trigger: INSERTing the values of the columns that actually changed。
最后一个链接是我所需要的,只有一个区别,我不想在下面的语句中硬编码列名,因为我在所有要编写类似触发器的表中都有超过 100 列为了!!
IF NEW.column1 <> OLD.column1 THEN INSERT INTO... END IF; IF NEW.column2 <> OLD.column2 THEN INSERT INTO... END IF
【问题讨论】: