在我的架构中,我有许多表,我需要填写常用字段。这是基本控制字段,如下所示:
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中做到吗?
最诚挚的问候,
答案 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
触发器。