我想要我的"审核"触发器更易于维护。 实际上,在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表吗?
我不知道自己是否足够清楚,如果需要,请发表评论。
非常感谢你的帮助!
答案 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触发器中使用预准备语句。