需要简化比较所有OLD和NEW以进行更改的MySQL Trigger

时间:2011-12-13 15:39:42

标签: mysql triggers

我想要我的"审核"触发器更易于维护。 实际上,在Before更新触发器上,逻辑如下:

IF NEW.field <> OLD.field THEN INSERT INTO table SET field=OLD.field

我正在检查每个列的更改,因为我不想存储未真正更新的行。有许多受监控的列,当我更改表(添加或删除列)时,我必须编辑触发器以反映新的表结构。

是否有一种简单的方法可以像这样浏览每个列:

FOR EACH COL BEGIN IF NEW.COL <> OLD.COL THEN SET changedetected=true; END IF; END

之后,使用FOR循环以相同的方式用所有表格的列填充Audit表吗?

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

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:0)

您可以从

获取列列表
SELECT column_name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'tbl_name'
ORDER BY ordinal_position;

然后您可以将查询包装到CURSOR并循环显示名称。

为了进行比较,我想你可以PREPARE为它做一个陈述

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

答案 1 :(得分:0)

您不能在MySQL触发器中使用预准备语句。