是否可以将 NEW 和 OLD 表从触发器传递到 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
读取的临时文件中。
这是不可能的,因为没有 NEW 或 OLD表。整个触发器与表相关——“新”和“旧”指的是在触发事件之前和之后它们包含的行和值。换句话说,您的示例将是:
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;