是否有可能从一个触发器传递新与旧表到MySQL中的程序? 我怀疑没有,因为没有这样的数据类型作为一个过程接受表。 任何变通办法可能吗?
理想情况下,应该是这样的:
CREATE TRIGGER Product_log AFTER UPDATE ON Product
FOR EACH ROW BEGIN
call logChanges(OLD, NEW);
END;
是否有可能从一个触发器传递新与旧表到MySQL中的程序? 我怀疑没有,因为没有这样的数据类型作为一个过程接受表。 任何变通办法可能吗?
理想情况下,应该是这样的:
CREATE TRIGGER Product_log AFTER UPDATE ON Product
FOR EACH ROW BEGIN
call logChanges(OLD, NEW);
END;
你可以明确地传递每个字段:
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
读取。
由于没有新的或旧表这是不可能的。 整个触发相关的表- “新”,“老”指的是行,他们之前所包含的值, 之后被触发事件。 换句话说,你的例子是:
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;