是否可以将触发器中的NEW和OLD表传递给MySQL中的过程?

时间:2012-06-04 17:03:24

标签: mysql triggers

是否可以将触发器中的NEW和OLD表传递给MySQL中的过程? 我怀疑没有,因为没有像程序所接受的那样的数据类型。 有没有可行的解决方法?

理想情况下,它看起来像这样:

CREATE TRIGGER Product_log AFTER UPDATE ON Product
  FOR EACH ROW BEGIN
    call logChanges(OLD, NEW);
  END;

2 个答案:

答案 0 :(得分:1)

这是不可能的,因为没有NEW或OLD 。整个触发器与 表相关 - “new”和“old”指的是之前的之后的所包含的行和值被触发的事件。换句话说,你的例子是:

call logChanges(OLD.customername, NEW.customername)

您还可以将所有OLD数据保存在历史记录表中(我希望无论如何都会进行日志更改),基本上是生产表的克隆,如下所示:

BEGIN
    IF OLD.customer_name != NEW.customer_name
    THEN
            INSERT INTO myTable_chagne_history
                (
                    customer_id    ,
                    customer_name  ,
                    another_field  ,
                    edit_time
                )
                VALUES
                (
                    OLD.customer_id,
                    OLD.customer_name,
                    OLD.another_field  ,
                    NEW.time_edit_was_made
                );
    END IF;
END;

答案 1 :(得分:1)

您可以明确传递每个字段:

CALL logChanges(OLD.colA, OLD.colB, NEW.colA, NEW.colB);

或者如果logChanges必须足够通用以便它可以处理来自不同表的调用,则可以使用合适的分隔符(例如unit separator)将字段值连接成单个字符串:

CALL logChanges(CONCAT_WS(CHAR(31), OLD.colA, old.colB),
                CONCAT_WS(CHAR(31), NEW.colA, NEW.colB));

或者,如果必须保留数据类型,可以将记录插入到logChanges读取的临时数据中。