2011-04-08 27 views
0

目前,我有许多触发器可以做同样的事情。这是复制粘贴每个需要此功能的表。自动填充存储过程中的列值,通过触发器调用

delimiter $$ 

create trigger user_before_insert before insert on user for each row 
begin 
    set NEW.create_time = CURRENT_TIMESTAMP; 
    set NEW.create_user_id = @user_id; 
    set NEW.modify_time = CURRENT_TIMESTAMP; 
    set NEW.modify_user_id = @user_id; 
end$$ 

create trigger user_before_update before update on user for each row 
begin 
    set NEW.modify_time = CURRENT_TIMESTAMP; 
    set NEW.modify_user_id = @user_id; 
end$$ 

是否有可能换行修改OLD和/或NEW成通过触发器调用存储过程的线路?事情是这样的:

delimiter $$ 

create procedure autofill_on_insert(inout NEW data_type) -- what would be the data_type? 
begin 
    set NEW.create_time = CURRENT_TIMESTAMP; 
    set NEW.create_user_id = @user_id; 
    set NEW.modify_time = CURRENT_TIMESTAMP; 
    set NEW.modify_user_id = @user_id; 
end$$ 

create procedure autofill_on_update(inout NEW data_type) -- what would be the data_type? 
begin 
    set NEW.modify_time = CURRENT_TIMESTAMP; 
    set NEW.modify_user_id = @user_id; 
end$$ 

delimiter ; 

create trigger user_before_insert before insert on user 
    for each row call autofill_on_insert(NEW); 
create trigger user_before_update before update on user 
    for each row call autofill_on_update(NEW); 

其他问题:如果这是可能的,有没有什么办法来检查是否NEW包含特定的列?有些表格没有modify_timemodify_user_id

回答

0

我可以说NEW不能被传入到程序中,因为NEW是表示一行的别名。过程的参数必须是标量值,如INT,VARCHAR等。

关于'SET NEW.create_time = CURRENT_TIMESTAMP;';如果字段create_time是TIMESTAMP,则可以将CURRENT_TIMESTAMP设置为默认值。

+0

我可以将'current_timestamp'设置为'create_time'的默认值,但这还不够 - 问题是如果我将它用于'create_time',我不能将它设置为'on update' modify_time'。我也不能将'@ user_id'设置为'create_user_id'和'modify_user_id'的'default'或'update'值。 – binaryLV 2011-04-08 09:25:47

+0

是的,只有一个TIMESTAMP ON UPDATE字段必须是。但是你可以用ON UPDATE子句添加特殊的TIMESTAMP字段(这将是第一个TIMESTAMP字段);为modify_time和create_time字段设置DEFAULT NULL;那么(当选择modify_time或create_time数据时)如果值为null,则引用该TIMESTAMP ON UPDATE字段。 – Devart 2011-04-08 09:42:41