martes, octubre 30, 2007

Trigger en MySQL

Tengo el caso de que cada vez que agrego un usuario a una tabla debo de codificar su password a MD5 y agregar el login a una tabla con sus ROLES.


DELIMITER |
CREATE TRIGGER auth_users BEFORE INSERT ON usuarios
FOR EACH ROW BEGIN
SET NEW.passwdmd5 = md5(NEW.passwd);
INSERT INTO authorities (username, privilege) values (NEW.login, "ROLE_USER");
END;
|
DELIMITER ;


Cambio primero el delimitador cuando tengo varias instrucciones, esto para no confundir a CREATE TRIGGER. Inicio el loop poniendo el nuevo valor de passwdmd5 con la instrucción md5(NEW.passwd). NEW es el registro que estoy insertando, por ello lo modifico primero (BEFORE INSERT).

Agrego el nuevo ROLE en la tabla de authorities creando como default "ROLE_USER".

Cabe mencionar que para poder crear un Trigger en MySQL tienes que tener privilegios de super user sobre la base de datos.

Quizás para terminar habría que agregar otro trigger para cuando borro un usuario, pero para este caso es dificil pues el usuario tiene muchas otras relaciones históricas como lo son pedidos y productos favoritos, información que me es valiosa para análisis, así que no aplica lo de borrar usuarios.

*MySQL Reference

2 comentarios:

Saúl dijo...

es más fácil usando un procedimiento almacenado, algo mas o menos así:

CREATE PROCEDURE agregar(... , password VARCHAR(15), ...)
INSERT INTO tabla VALUES (..., MD5(password), ...);

como lo estas haciendo de una sola patada te evitas cambiar el delimitador, o usar un BEGIN-END.

Cristhian dijo...

me pueden ayudar con un ejemplo claro implementando un tigger de como encriptar al momento de insertar o actualizar??