MySQL - 可以调用函数来执行触发器操作吗?

时间:2012-06-06 07:59:28

标签: mysql function triggers

在我的架构中,我有许多表,我需要填写常用字段。这是基本控制字段,如下所示:

id_db_user
date_creation
date_last_update

我已经完成了两个触发器来填充这些字段:

-- Trigger DDL Statements
delimiter |
CREATE TRIGGER control_insert BEFORE INSERT ON EZT_SOCIETIES

  FOR EACH ROW BEGIN

    SET NEW.id_db_user    = current_user;

    SET NEW.date_creation = current_timestamp;

  END;
| delimiter ;


delimiter |
CREATE TRIGGER control_update BEFORE UPDATE ON EZT_SOCIETIES

  FOR EACH ROW BEGIN

    SET NEW.date_last_update = current_timestamp;

  END;
| delimiter ;

我的问题是:我可以编写一些函数来调用触发器内的操作吗?像这样:

function fn_control_insert
    SET NEW.id_db_user    = current_user;
    SET NEW.date_creation = current_timestamp;

然后在触发器中调用此函数,如:

delimiter |
CREATE TRIGGER control_insert BEFORE INSERT ON EZT_SOCIETIES

  FOR EACH ROW BEGIN

    call fn_control_insert;

  END;
| delimiter ;

这可以在MySQL中做到吗?

最诚挚的问候,

2 个答案:

答案 0 :(得分:3)

不,不幸的是,不可能将NEW和OLD作为参数传递,也不能将函数参数设置为OUT或INOUT(即可写),所以简短的答案是否定的。

您可以从触发器调用函数(假设该函数不违反任何MySQL触发器限制,例如修改附加触发器的表),但是您必须将每个函数传递给函数或者您需要读取的旧字段,并且该函数将无法写入它们 - 您只能通过函数返回一个值。

答案 1 :(得分:0)

  • 使用'ON UPDATE CURRENT_TIMESTAMP'子句将date_creation字段声明为TIMESTAMP。该字段将在INSERT或UPDATE语句上使用CURRENT_TIMESTAMP值自动更新。更多信息 - Automatic Initialization and Updating for TIMESTAMP

  • control_insert触发器中设置NEW.id_db_user值 - SET NEW.id_db_user = current_user;

  • 删除control_update触发器。