是否可以将触发器中的NEW和OLD表传递给MySQL中的过程? 我怀疑没有,因为没有像程序所接受的那样的数据类型。 有没有可行的解决方法?
理想情况下,它看起来像这样:
CREATE TRIGGER Product_log AFTER UPDATE ON Product
FOR EACH ROW BEGIN
call logChanges(OLD, NEW);
END;
答案 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
读取的临时数据中。