我正在研究一个相当简单的票务管理系统。我想记录添加,删除和更改的内容。
我创建了三个触发器,AFTER INSERT
,AFTER DELETE
和AFTER UPDATE
。 INSERT
/ DELETE
触发器很简单,它是我遇到问题的UPDATE
触发器。
我想在表格中添加哪些列已经更改了旧的&新值,即colname changed from X to Y
我现在已经“工作”的触发器,当然除了它没有插入我想要的实际值。
如何使用OLD
变量获取NEW
和col_name
的值?
我也不确定这是否是最佳可行的方式...所以如果有人有这方面的想法,他们也欢迎...这个触发器开始了更简单...
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 NEW.@col_name != OLD.@col_name THEN */
/*SET @updated = CONCAT(@updated, OLD.@col_name, ' changed into ', NEW.@col_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
答案 0 :(得分:1)
由于这里不可能使用预处理语句,我建议你调用一些INSERT语句,例如: -
IF NEW.column1<> OLD.column1然后 插入... 万一; 如果NEW.column2<> OLD.column2然后 插入... 万一; ...
或尝试将您需要的所有字段复制到另一个表格中。
在这些情况下,您将避免使用光标。
答案 1 :(得分:0)
尝试使用prepared statements 像这样:
SET @s = CONCAT('SELECT new.', @col_name, ', old.', @col_name, ' FROM ', /*here is the query details like inner joins etc.*/, ' where ', 'NEW.', @col_name, '!= OLD.', @col_name )
PREPARE stmt FROM @s;
EXECUTE stmt;