Introducción.
Si deseas que la logica del negocio recida en tu base de datos , es porque sabes que de esta manera:
- El desarrollo/mantenimiento es mas rapido, ademas de que se reducen costos
- Permites facilmente la futura migración del lenguaje y el motor.
Seguramente te has topado con la necesidad de hacer algunas validaciones antes de insertar,modificar o eliminar contenido de tu db, Mysql y muchas otros motores integran los llamados Triggers (disparadores), que no son mas que acciones programables que se ejecutan antes o despues de que un evento ocurra.El objetivo de este post es brindarte un real-life ejemplo de cuando y como podrias usar estos triggers.
Sql porfavor.
Supongamos el siguiente ejemplo, nuestra generica tabla Users.
CREATE TABLE `Users` (
`userID` int(15) NOT NULL default ‘0′,
`companyID` int(15) NOT NULL,
`username` varchar(12) NOT NULL,
`password` tinytext NOT NULL,
`email` varchar(50) NOT NULL,
`name` varchar(80) NOT NULL,
`lastName` varchar(80) NOT NULL,
`insertDate` datetime NOT NULL,
`updateDate` datetime NOT NULL,
`deleteDate` datetime NOT NULL,
PRIMARY KEY USING BTREE (`userID`,`companyID`),
UNIQUE KEY `username` (`username`),
KEY `companyID` (`companyID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC
Un buen ejemplo para mostrar la utilidad de los triggers podria ser la necesidad de encriptar automaticamente nuestro password al hacer update, esto se resuelve facilmente con el siguiente trigger.
DROP TRIGGER tr_users_onBUpdate;
/*Antes de que modifiquemos el row.*/
CREATE TRIGGER `tr_users_onBUpdate` Before UPDATE on `Users`
FOR EACH ROW — para cada row al que se le hara update.
BEGIN
/*pasa aquí, encriptamos automaticamente.*/
SET new.password = md5(new.password);
END
Probemos.
insert into Users values(”,’1′,’insane’,'insane’,'mine@mines.com’,'Oscar’,'nevarez’,NOW(),NOW(),”);
update Users set password=’newpassword’ where email=’mine@mines.com’ and username=’insane’;
Ahora, si hicieras un select a tu tabla te encontrarias que el password ha sido encriptado.Pero, pero pero insane, que pasa si quiero que el password se encripte al insert tambien ? bueno, pues no se ….. jeje, no si lo se y se hace de la siguiente manera:
DROP TRIGGER tr_users_onBInsert;
CREATE TRIGGER `tr_users_onBInsert` Before INSERT on `Users`
FOR EACH ROW
BEGIN
IF(new.insertDate!=”") THEN
SET new.insertDate = NOW();
END IF;
SET new.password = md5(new.password);
END
Tags: db, md5 password, Mysql, trigger insert, trigger update
