INSTITUTO DE EDUCACION TECNICA PROFESIONAL INTEP Triggers y procedimientos almacenados Triggers Un Triggers o disparador es una rutina autónoma asociada con una tabla o vista que automáticamente realiza una acción cuando una fila en la tabla o la vista se inserta (INSERT), se actualiza (UPDATE), o borra (DELETE). Un Trigger nunca se llama directamente. En cambio, cuando una aplicación o usuario intenta insertar, actualizar, o anular una fila en una tabla, la acción definida en el disparador se ejecuta automáticamente (se dispara). Las ventajas de usar los Triggers son: La entrada en vigor automática de restricciones de los datos, hace que los usuarios entren sólo valores válidos. El mantenimiento de la aplicación se reduce, los cambios a un triggers se refleja automáticamente en todas las aplicaciones que tienen que ver con la tabla sin la necesidad de recompilar o relinquear. Logs automáticos de cambios a las tablas. Una aplicación puede guardar un registro corriente de cambios, creando un trigger que se dispare siempre que una tabla se modifique. La notificación automática de cambios a la Base de Datos con alertas de evento en los triggers. Procedimientos Almacenados Un Procedimiento Almacenado es un programa autocontrolado escrito en lenguaje del DBMS, son almacenados como parte de la Base de Datos y sus metadatos. Las ventajas de usar los procedimientos almacenados incluyen: Diseño modular. Aplicaciones que acceden la misma Base de Datos pueden compartir los procedimientos almacenados, eliminando el código doble y reduciendo el tamaño de las aplicaciones. Una vez creado un procedimiento almacenado, se puede invocar directamente desde una aplicación, o sustituir el nombre de una tabla o vista, por el nombre de procedimiento en cláusulas SELECT. Los procedimientos almacenados pueden recibir parámetros de entrada y retornar valores a la aplicación. El fácil mantenimiento. Cuando un procedimiento se actualiza, los cambios se reflejan automáticamente en todas las aplicaciones, sin la necesidad de recompilar y relinkear. Las aplicaciones son compiladas sólo una vez para cada cliente. Los procedimientos almacenados son ejecutados por el servidor, no por el cliente lo que reduce el tráfico en la red y mejora el performance o desempeño, especialmente para el acceso del cliente remoto. Están almacenados en los servidores y asegurados por las medidas tomadas en la instalación, lo que impide que los usuarios normales puedan modificarlos e incluso desconocen su existencia. Este es un elemento de gran valor en lo que a seguridad respecta. Docente: Ing. Ana Milena Bueno Henao. Bases de Datos II INSTITUTO DE EDUCACION TECNICA PROFESIONAL INTEP Triggers y procedimientos almacenados Como se puede apreciar los Sistemas de Bases de Datos ofrecen a desarrolladores, administradores y usuarios una gama muy completa de herramientas que permiten garantizar la integridad, consistencia, confidencialidad y en general seguridad de la información almacenada y con un elemento muy importante a favor: Las líneas de código que se requieren por parte del implementador son muy pocas, en ocasiones solo basta con una sencilla sentencia para obligar al DBMS a controlar y mantener las restricciones necesarias. ¿Que son los Triggers y como usarlos en MySQL 5.0? Desde la salida de la versión 5 de MySql se pueden usar triggers en nuestras bases de datos. Pero, ¿qué son los triggers?, son objetos relacionados con tablas y almacenados en la base de datos que se ejecutan o se muestran cuando sucede algún evento sobre sus tablas asociadas. Los eventos pueden ser las sentencias INSERT, DELETE, UPDATE que modifican los datos de una tabla. Los triggeres se pueden ejecutar antes (BEFORE) y/o después (AFTER) de que sean modificados los datos. Los triggers tienen dos palabras clave, OLD y NEW que se refieren a los valores que tienen las columnas antes y después de la modificación. Los INSERT permiten NEW, los DELETE sólo OLD y los UPDATE ambas. Un ejemplo de trigger seria uno asociado a la sentencia DELETE en una tabla de clientes, para impedir que se elimine uno que tenga un saldo distinto de cero. Otro trigger seria guardar los datos que se modifican de un cliente en otra base de datos que serviría de auditoria. Crearemos la tabla de clientes y le ponemos algunos registros: CREATE TABLE clientes(id int not null auto_increment, nombre varchar(100), seccion varchar(10),PRIMARY KEY(id), KEY(nombre)) ENGINE = InnoDB; INSERT INTO clientes (nombre, seccion) VALUES ('Miguel','informatica'), ('Rosa','comida'), ('Maria','ropa'), ('Albert','informatica'), ('Jordi','comida'); Y una tabla que será la que guardará los datos de la "auditoria" CREATE TABLE auditoria_clientes (id int not null auto_increment, nombre varchar(100), anterior_seccion varchar(10), usuario varchar(40), modificado datetime, primary key(id)) ENGINE = InnoDB; y finalmente un trigger que se disparará cada vez que alguien modifique un dato de la tabla clientes y lo guardará en una tabla junto al nombre del usuario y la Docente: Ing. Ana Milena Bueno Henao. Bases de Datos II INSTITUTO DE EDUCACION TECNICA PROFESIONAL INTEP Triggers y procedimientos almacenados fecha. CREATE TRIGGER trigger_auditoria_clientes AFTER UPDATE ON clientes FOR EACH ROW INSERT INTO auditoria_clientes(nombre, anterior_seccion, usuario, modificado) VALUES (OLD.nombre, OLD.seccion, CURRENT_USER(), NOW()); Otro ejemplo de trigger: Limitaciones de los triggers. - Solo se pueden aplicar a una tabla especifica, es decir, un trigger no sirve para dos o más tablas - El trigger se crea en la base de datos que de trabajo pero desde un trigger puedes hacer referencia a otras bases de datos. - Un Trigger devuelve resultados al programa que lo desencadena de la misma forma que un Stored Procedure aunque no es lo más idóneo, para impedir que una instrucción de asignación devuelva un resultado se puede utilizar la sentencia SET NOCOUNT al principio del Trigger. - Las siguientes instrucciones no se pueden utilizar en los triggers: ALTER DATABASE CREATE DATABASE DISK INIT DISK RESIZE DROP DATABASE LOAD DATABASE LOAD LOG RECONFIGURE RESTORE DATABASE RESTORE LOG Ejemplo. Como ejemplo crearemos un Trigger que avise al webmaster con un mail cuando un usuario se da de alta en nuestro web, para crear el trigger solo se han de seguir los pasos arriba indicados, como muestran las imágenes y el código es el siguiente, haciendo Copy & Paste funciona. El funcionamiento del trigger es muy sencillo, declaramos dos variables, una para el mensaje que se enviará en el mail y otra para obtener el ID del registro recién insertado y luego este ID lo concatenamos al mensaje para enviárselo al webmaster. Docente: Ing. Ana Milena Bueno Henao. Bases de Datos II INSTITUTO DE EDUCACION TECNICA PROFESIONAL INTEP Triggers y procedimientos almacenados Alter Trigger Trigger_Aviso_al_Webmaster On dbo.pr_usuarios For Insert As -- Declaramos las variables del mensaje y del ID del nuevo usuario Declare @Mensaje varchar(200) Declare @ID numeric -- Obtenemos el id del usuario recien insertado Select @ID = (Select IDUsuario From Inserted ) Select @Mensaje = 'Nuevo Usuarios en el web : ' + Convert(varchar(10), @ID) Exec master.dbo.xp_sendmail @recipients = 'webmaster@dominio.com', @subject = 'Nuevo usuario', @message = @Mensaje Docente: Ing. Ana Milena Bueno Henao. Bases de Datos II