1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
/* Ejercicio 26: Realizar tres triggers "ejercicio26a", "ejercicio26b", y "ejercicio26c" que realicen una auditoria similar a la que realiza el trigger2 del apartado 9.3 de los materiales, pero para la tabla centros: El trigger ejercicio26a auditará las operaciones de inserción. El trigger ejercicio26b auditará las operaciones de modificación. El trigger ejercicio26c auditará las operaciones de borrado. Antes de realizar el ejercicio necesitarás tener creada la tabla: create table audita ( mensaje varchar(200) ) engine = innodb; */ -- Trigger A: Audita las operaciones de inserción. delimiter $$ create trigger t_aud_insercion after insert on centros for each row begin insert into audita values ( concat ( 'Inserccion realizada por ', user(), ' el dia ', now(), '. Valores insertados: "', new.numce, '", "', new.nomce, '" y "', new.seas, '"' ) ); end $$ delimiter ; -- Trigger B: Audita las operaciones de modificación. delimiter $$ create trigger t_aud_modificacion after update on centros for each row begin insert into audita values ( concat ( 'Actualizacion realizada por ', user(), ' el dia ', now(), '. Anteriores valores: "', old.numce, '", "', old.nomce, '" y "', old.seas, '"', '. Nuevos valores: "', new.numce, '", "', new.nomce, '" y "', new.seas, '"' ) ); end $$ delimiter ; -- Trigger C: Audita las operaciones de borrado. delimiter $$ create trigger t_aud_borrado after delete on centros for each row begin insert into audita values ( concat ( 'Fila borrada por ', user(), ' el dia ', now(), '. Valores borrados: "', old.numce, '", "', old.nomce, '" y "', old.seas, '"' ) ); end $$ delimiter ; |
Día: 3 de mayo de 2012
1×25: Uso de Triggers con insert, update y delete
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
/* Ejercicio 25: Realizar dos triggers que completen la funcionalidad del trigger1 del apartado 9.3 de los materiales, mantener sincronizada la tabla alumnos_replica, pero para las operaciones de modificación (trigger ejercicio25a) y borrado (trigger ejercicio25b). */ /* Un trigger es un programa almacenado que no se ejecuta por voluntad del usuario, si no que se ejecuta solo de forma automática cuando se realizan modificaciones con las sentencias: insert, update y delete. Podemos elegir cuando se ha de ejecutar el trigger, si antes (before) de realizar la acción o después (after). El trigger solo funciona bajo la tabla que especifiquemos y cada tabla como máximo podrá tener 6 trigger, 2 por cada sentencia. Notas de interes: Muestra los triggers: show triggers; Borra un trigger: drop trigger t_copia; */ -- Primero se copia una tabla para hacer las pruebas: create table alumnos_replica (select * from alumnos); -- Triger 1: Se encarga de sincronizar las nuevas filas insertadas: delimiter $$ create trigger t_copia before insert on alumnos for each row begin -- Disponemos de "new" para obtener el nuevo valor en insert y update -- y de "old" para obtener el valor anterior en update y delete. insert into alumnos_replica values (new.id, new.alumno); end $$ delimiter; -- Triger A: Mantiene las filas actualizadas: delimiter $$ create trigger t_modifica before update on alumnos for each row begin update alumnos_replica set id = new.id, alumno = new.alumno where id = old.id; end $$ delimiter ; -- Triger B: Borra las filas delimiter $$ create trigger t_borra before delete on alumnos for each row begin delete from alumnos_replica where id = old.id; end $$ delimiter ; |
1×23-24: Funciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
/* Ejercicio 23: Desarrollar una función que devuelva un 1 si el número de departamento que se le pasa como argumento existe y devuelva 0 en caso contrario. */ delimiter $$ drop function if exists 1x23 $$ create function 1x23(dep int) returns boolean begin if (select numde from departamentos where numde = dep) = dep then return true; else return false; end if; end $$ delimiter ; -- select 1x23(112) as 'Resultado'; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/* Ejercicio 24: Desarrollar una función que devuelva la suma total de salarios de los empleados del número de departamento que se le pasa como argumento. Si el Departamento no existe devolverá -1. Utiliza una llamada a la función del ejercicio anterior dentro del código. */ delimiter $$ drop function if exists 1x24 $$ create function 1x24(dep int) returns int begin if (select 1x23(dep)) then return (select sum(salario) from empleados where numde = dep); else return -1; end if; end $$ delimiter ; -- select 1x24(112) as 'Total'; |