Creación de disparadores(triggers) en MYSQL
Diciembre 14th, 2008 | por jjeb™ |Mysql es por el gestor de base de datos más utilizado cuando se programa con php, a partir de la versión 5.0.2 se han implementado el soporte para disparadores (triggers), estes es un pequeño ejemplo de la utilización de los disparadores y pues bueno iniciamos:
¿Qué son los disparadores (triggers)?
Un disparador es un objeto con nombre dentro de una base de datos el cual se asocia con una tabla y se activa cuando ocurre en ésta un evento en particular. Actualmente, el soporte para disparadores es básico, por lo tanto hay ciertas limitaciones en lo que puede hacerse con ellos.
Estructura de los disparadores:
CREATE TRIGGER nombre_disp momento_disp evento_disp
ON nombre_tabla FOR EACH ROW sentencia_a_realizar
Ejemplo:
Creamos 3 disparadores sobre la tabla de usuarios, estos nos dirán las acciones que se realicen sobre esta (inserción, modificación o borrado).
La estructura de las tablas serán las siguientes:
/* Creamos la tabla de acciones*/ CREATE TABLE acciones( fecha DATE, hora TIME, accion VARCHAR(50), idusuario int ); /*Creamos la tabla de usuarios*/ CREATE TABLE usuarios( idusuario integer PRIMARY KEY, nombre VARCHAR(50), apellido VARCHAR(50) );
Las sentencias para los disparadores son:
/*Disparador para el registro de inserciones*/ DELIMITER | CREATE TRIGGER inser_usuarios BEFORE INSERT ON usuarios FOR EACH ROW BEGIN INSERT INTO acciones VALUES(CURDATE(),CURTIME(),'Registro insertado',new.idusuario); END; | DELIMITER ; /*Disparador para el registro modificado*/ DELIMITER | CREATE TRIGGER update_usuarios BEFORE UPDATE ON usuarios FOR EACH ROW BEGIN INSERT INTO acciones VALUES(CURDATE(),CURTIME(),'Registro Modificado',old.idusuario); END; | DELIMITER ; /*Disparador para el registro eliminado*/ DELIMITER | CREATE TRIGGER delete_usuarios BEFORE DELETE ON usuarios FOR EACH ROW BEGIN INSERT INTO acciones VALUES(CURDATE(),CURTIME(),'Registro eliminado',old.idusuario); END; | DELIMITER ;
Una pequeña explicación de las sentencias utilizadas es:-
- DELIMITER: los disparadores (Triggers), están formados por varias instrucciones, por lo tanto, antes de comenzar su definición, debes especificar qué carácter delimita (o separa) siguiente.
- CREATE TRIGGER: Es la sentencia de creación del disparador.
- BEFORE: Indica el momento de acción del disparador
- DELETE: Indica el evento que activará al disparador
- FOR EACH ROW: Define lo que se ejecutará cada vez que el disparador se active, lo cual ocurre una vez por cada fila afectada por la sentencia activadora.
Las palabras clave OLD y NEW permiten acceder a columnas en los registros afectados por un disparador. (OLD y NEW no son sensibles a mayúsculas). En un disparador para INSERT, solamente puede utilizarse NEW.; ya que no hay una versión anterior del registro. En un disparador para nom_colDELETE sólo puede emplearse OLD., porque no hay un nuevo registro. En un disparador para nom_colUPDATE se puede emplear OLD. para referirse a las columnas de un registro antes de que sea actualizado, y nom_colNEW. para referirse a las columnas del registro luego de actualizarlo.nom_col
Una columna precedida por OLD es de sólo lectura. Es posible hacer referencia a ella pero no modificarla. Una columna precedida por NEW puede ser referenciada si se tiene el privilegio SELECT sobre ella. En un disparador BEFORE, también es posible cambiar su valor con SET NEW. si se tiene el privilegio de nombre_col = valorUPDATE sobre ella. Esto significa que un disparador puede usarse para modificar los valores antes que se inserten en un nuevo registro o se empleen para actualizar uno existente.
En un disparador BEFORE, el valor de NEW para una columna AUTO_INCREMENT es 0, no el número secuencial que se generará en forma automática cuando el registro sea realmente insertado.
Podemos revisar que todo este correcto con las siguientes sentencias:
INSERT INTO usuarios VALUES (1,'Sofia','Hernández Maya'); INSERT INTO usuarios VALUES (2,'Emilio','Díaz Esparza'); INSERT INTO usuarios VALUES (3,'Juan','Esparza'); /*Verificamos las inserciones*/ select * from usuarios; /*Revisamos la tabla de acciones */ select * from acciones; /*Modificamos 1 regitro*/ update usuarios set apellido = 'Hernández' where idusuario=1; /*Revisamos la tabla de acciones */ select * from acciones; /*Eliminamos 1 regitro*/ delete from usuarios where idusuario=3; /*Revisamos la tabla de acciones */ select * from acciones;
Etiquetas: base de datos, mysql