需要简化MySQL触发器,它比较所有旧的和新的更改

需要简化MySQL触发器,它比较所有旧的和新的更改,mysql,triggers,Mysql,Triggers,我希望我的“审计”触发器更易于维护。 实际上,在更新前触发器上,逻辑如下: IF NEW.field <> OLD.field THEN INSERT INTO table SET field=OLD.field 如果是NEW.field OLD.field,则插入表集合field=OLD.field 我正在检查每一列的更改,因为我不想存储未真正更新的行。有许多受监视的列,当我更改表(添加或删除列)时,我必须编辑触发器以反映新的表结构 有没有一种简单的方法可以这样穿过每一个柱:

我希望我的“审计”触发器更易于维护。 实际上,在更新前触发器上,逻辑如下:

IF NEW.field <> OLD.field THEN INSERT INTO table SET field=OLD.field
如果是NEW.field OLD.field,则插入表集合field=OLD.field
我正在检查每一列的更改,因为我不想存储未真正更新的行。有许多受监视的列,当我更改表(添加或删除列)时,我必须编辑触发器以反映新的表结构

有没有一种简单的方法可以这样穿过每一个柱:

FOR EACH COL BEGIN IF NEW.COL <> OLD.COL THEN SET changedetected=true; END IF; END
对于每个列,如果NEW.COL OLD.COL开始,则设置changedetected=true;如果结束;结束
然后,使用FOR循环以相同的方式用表的所有列填充审计表

我不知道我是否足够清楚,如果需要请发表评论


非常感谢你的帮助

您可以从

SELECT column_name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'tbl_name'
ORDER BY ordinal_position;
然后,您可以将查询包装成一个循环并遍历名称

为了便于比较,我想你可以为它写一份声明

SET @s = CONCAT('SELECT OLD.', col_name, ' = NEW.', col_name, ' INTO @cmp');
PREPARE stmt FROM @s;
EXECUTE stmt;
IF @cmp ...

您不能在MySQL触发器中使用准备好的语句