Como saltarse limitaciones de triggers en MYSQL

En mi ultimo trabajo, migrando una base de datos MS SQL a MySQL, me encontré con un pequeño inconveniente, debía aplicar un disparador que en caso que debía actualizar un campo de la tabla que generaba dicho disparador.
Como sabréis un disparador se trata de una secuencia SQL que se ejecutará antes o después de un evento determinado (al estilo de, para los que lo conozcan los famosos events del mIRC Scripting, el principio en el scripting de muchos) El problema es que en MYSQL la incorporación de los disparadores es relativamente reciente, y a día de hoy existe, entre otras, la limitación que no pueden modificar la tabla que los genera
Pues bien, la solución si lo pensáis es bastante sencilla:

Pongámonos en situacion. Necesitamos que cada vez que se haga un UPDATE de una tabla, por ejemplo, se nos actualice la columna lastedit con la fecha actual (por ejemplo).
Si lo intentásemos de una forma «estándar», es decir, codificando el trigger de la siguiente forma:

DELIMITER $
CREATE TRIGGER disparador BEFORE UPDATE ON tabla
FOR EACH ROW 
BEGIN
UPDATE tabla SET lastedit = CURDATE();
END$
DELIMITER;

Recibiríamos un error indicando que un disparador no puede modificar la tabla que lo origina.

MS SQL genera para gestionar los cambios una o varias tablas temporales, inserted y deleted (como es lógico la primera para los datos a introducir, y la segunda para los datos a eliminar, si existiesen)
En MySQL esto se realiza de un modo muy similar, con la diferencia que estas tablas temporales tienen el nombre de NEW y OLD, respectivamente.
Ahora bien, tampoco intentéis, como me ocurrió a mi en primer lugar, el hacer un UPDATE de la tabla temporal:

UPDATE NEW SET lastedit = CURDATE();

La solución es definir la columna dentro de esta tabla temporal como una variable, es decir:

SET NEW.lastedit = CURDATE();

Con esto habréis conseguido que el disparador modifique la columna lastedit de la tabla tabla, ya que cuando finalizado el trigger se aplique el update, recorrer´a la tabla temporal NEW, y esta albergará un valor para la columna lastedit, por lo que lo aplicará, junto con los valores que se hubiesen definido en el update (o la sentencia que generase el disparador) original

Deja un comentario