我正在制作一个相当简单的票务管理系统。我想保留一个日志,以获取添加,删除和更改的内容。MySQL UPDATE触发器:插入实际更改的列的值
我创建了三个触发器,AFTER INSERT
,AFTER DELETE
和AFTER UPDATE
。 INSERT
/DELETE
触发器很简单,它是我遇到问题的UPDATE
触发器。
我想补充这列已经改变了在表中的旧&新值,即colname changed from X to Y
触发我现在有“作品”,当然除了它不插入实际值我想要。
如何使用col_name
变量从OLD
和NEW
获取值?
我也不知道这是做这个的最好可能方式......所以,如果任何人有这想法,他们是欢迎太...这个触发器开始了简单了很多。 ..
BEGIN
DECLARE num_rows, i int default 1;
DECLARE col_name CHAR(255);
DECLARE updated TEXT;
DECLARE col_names CURSOR FOR
SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'storing'
ORDER BY ordinal_position;
OPEN col_names;
SELECT FOUND_ROWS() INTO num_rows;
SET i = 1;
SET @updated = 'Updated columns: ';
the_loop: LOOP
IF i > num_rows THEN
LEAVE the_loop;
END IF;
FETCH col_names INTO col_name;
/* So, how do I get the proper values? */
/* IF [email protected]_name != [email protected]_name THEN */
/*SET @updated = CONCAT(@updated, [email protected]_name, ' changed into ', [email protected]_name, ' ');*/
SET @updated = CONCAT(@updated, 'OLD', ' changed into ', 'NEW', ' ');
/* END IF;*/
SET i = i + 1;
END LOOP the_loop;
CLOSE col_names;
INSERT INTO `log` (`storing`, `medewerker`, `actie`, `data`)
VALUES (NEW.`id`, NEW.`medewerker`, "Storing aangepast", @updated);
END
谢谢,这个工程,我实现它(第一个)作为一个临时解决方案,但说实话,它并不真正非常漂亮......我宁愿循环的列名... – Carpetsmoker
所以我去了这个结束。它看起来可能不是特别漂亮,但我认为列不会改变那么多,而且它更简单很多(比较少出错,对未来的维护人员不太了解等)。 – Carpetsmoker