7

是否可以将 NEW 和 OLD 表从触发器传递到 MySQL 中的过程?我怀疑不是,因为没有像表这样的数据类型可以被过程接受。任何可能的解决方法?

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

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

2 回答 2

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读取的临时文件中。

于 2012-06-04T17:12:54.877 回答
1

这是不可能的,因为没有 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;
于 2012-06-04T17:08:44.503 回答