是否有可能从一个触发器传递新与旧表到MySQL中的程序?(Is it possible to pas

2019-09-17 18:31发布

是否有可能从一个触发器传递新与旧表到MySQL中的程序? 我怀疑没有,因为没有这样的数据类型作为一个过程接受表。 任何变通办法可能吗?

理想情况下,应该是这样的:

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

Answer 1:

你可以明确地传递每个字段:

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

或者,如果logChanges必须足够通用的,它可以处理由不同的表,例如电话,一个可以串连的字段值到使用合适的分隔符(例如,一个字符串单元分隔符 ):

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

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



Answer 2:

由于没有新的或旧这是不可能的。 整个触发相关表- “新”,“老”指的是行,他们之前所包含的值, 之后被触发事件。 换句话说,你的例子是:

call logChanges(OLD.customername, NEW.customername)

你也可以保存所有旧的数据在历史表(我希望logchanges做反正),基本上是生产的表像这样的克隆:

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;


文章来源: Is it possible to pass the NEW and the OLD tables from a trigger into a procedure in MySQL?