MySQL UPDATE触发器:INSERTing实际更改的列的值

时间:2011-08-03 13:48:52

标签: mysql triggers

我正在研究一个相当简单的票务管理系统。我想记录添加,删除和更改的内容。

我创建了三个触发器,AFTER INSERTAFTER DELETEAFTER UPDATEINSERT / DELETE触发器很简单,它是我遇到问题的UPDATE触发器。

我想在表格中添加哪些列已经更改了旧的&新值,即colname changed from X to Y

我现在已经“工作”的触发器,当然除了它没有插入我想要的实际值。

如何使用OLD变量获取NEWcol_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

2 个答案:

答案 0 :(得分:1)

  1. 由于这里不可能使用预处理语句,我建议你调用一些INSERT语句,例如: -

    IF NEW.column1<> OLD.column1然后   插入... 万一; 如果NEW.column2<> OLD.column2然后   插入... 万一; ...

  2. 或尝试将您需要的所有字段复制到另一个表格中。

  3. 在这些情况下,您将避免使用光标。

答案 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;