Escolar Documentos
Profissional Documentos
Cultura Documentos
Crdoba
PRCTICA 3. USO
DE DISPARADORES
Alberto Cruz Crdoba, Emilio Lpez Pia
Contenido
1. Objetivo.............................................................................................................................. 3
2. Disparador Auditora.......................................................................................................... 3
2.1 Particularidades.............................................................................................................4
2.2 Ejemplo de Uso.............................................................................................................4
2. Disparador de seguridad.....................................................................................................5
2.1 Cdigo........................................................................................................................... 5
3. Disipador de Seguridad II...................................................................................................6
3.1 Cdigo........................................................................................................................... 6
4. Disparador de Sustitucin...................................................................................................7
4.1 Cdigo........................................................................................................................... 7
5. Disipador de Sustitucin II................................................................................................8
5.1 Cdigo........................................................................................................................... 8
6. Disipador............................................................................................................................ 9
6.1 Cdigo........................................................................................................................... 9
Bibliografa........................................................................................................................... 10
1. Objetivo
El objetivo de esta prctica es que los alumnos se familiaricen con el uso de los disparadores
(triggers) en el desarrollo de procedimientos de control de la integridad de la base de
datos, alertas y construccin de bases de datos activas. El alumno deber incluir en el
esquema de la base de datos la definicin de una serie de disparadores y desarrollar los
procedimientos para que: a) se activen y b) no se activen.
2. Disparador Auditora
Mediante el presente trigger pretendemos guardar en una tabla auxiliar todas las
modificaciones que se van realizando en todos los campos de la tabla 'Persona' de la base de
datos. Adems, podemos saber qu modificaciones se han realizado, con qu usuario, en qu
fecha y hora y qu valores haba antes de la modificacin y despus de la modificacin.
En primer lugar modificamos la base de datos de la prctica anterior para alojar la tabla de
Auditora (Auditoria_persona):
Como se aprecia en la tabla se incluyen los mismos atributos para guardar el valor anterior
(nombre ms sufijo _old) y el nuevo valor (nombre ms sufijo _new).
Posteriormente, creamos el trigger "trigger_auditoria_persona" el cual realiza la labor
indicada antes:
CREATE TABLE Auditoria_Persona
(id INT NOT NULL AUTO_INCREMENT,
usuario VARCHAR(100) NOT NULL,
fecha DATETIME NOT NULL,
nombre_old VARCHAR(30) NOT NULL,
apellidos_old VARCHAR(50) NOT NULL,
fotografia_old LONGBLOB,
email_old VARCHAR(30),
tipo_persona_old ENUM('Alumno','Profesor'),
nombre_new VARCHAR(30) NOT NULL,
apellidos_new VARCHAR(50) NOT NULL,
fotografia_new LONGBLOB,
email_new VARCHAR(30),
tipo_persona_new ENUM('Alumno','Profesor'),
CONSTRAINT pk_per
PRIMARY KEY (dni));
2.1 Particularidades
1. Usamos AFTER UPDATE para indicar que el trigger se ejecute cada vez que un
usuario realice alguna modificacin en la tabla 'Persona'.
2. El trigger insertar un registro en la tabla auxiliar Auditoria_persona, en dicho
registro, el trigger guardar para cada campo el valor anterior y el nuevo valor. Para
ello se usan las clusulas especiales "OLD.nombre_campo" (el trigger obtendr el
valor anterior al cambio del campo) y "NEW.nombre_campo" (el trigger obtendr el
valor nuevo).
3. La funcin CURRENT_USER() obtiene y almacena en la taba el usuario actual
del sistema.
4. La funcin NOW() obtiene la fecha y hora en que el usuario realiza el cambio en la
tabla.
2. Disparador de seguridad.
Consiste en un disipador que impida realizar actualizaciones de la base de datos en base a
algn criterio relacionado con la fecha, usuario, etc Para resolver este problema hemos creado
un disparador que no permita modificar la tabla Persona el domingo.
2.1 Cdigo
/*Trigger 2*/
/*DELIMITER $$*/
CREATE TRIGGER ASIGNATURA_BEF_DEL
BEFORE UPDATE ON Persona FOR EACH ROW
BEGIN
if
(SELECT
CONVERT(DAYNAME(CURDATE()),
CHAR(50)))
'Sunday'
THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT='Borrado no permitido';
END IF;
END;
/*$$*/
En primer lugar hemos indicado que el trigger se active antes de realizar la modificacin
(BEFORE UPDATE ON). A continuacin hemos comprobado la fecha actual del sistema
mediante una consulta que devuelva el da actual (CURDATE()). Si el resultado de la
funcin es igual a 'Sunday' se muestra el mensaje indicado en la implementacin.
3. Disipador de Seguridad II
Este disipador consite en impedir realizar modificaciones en el esquema de la base de datos
en base a algn criterio relacionado con la fecha, usuario, etc.
En este caso, hemos creado un disparador "PREVENT_DROP" que se ejecuta cuando se
desea borrar una tabla:
3.1 Cdigo
CREATE or REPLACE trigger PREVENT_DROP
before drop on i12lopie.schema
BEGIN
IF ora_dict_obj_owner='ROOT'
and ora_dict_obj_type='TABLE'
THEN
RAISE_APPLICATION_ERROR(
-20002,'Operacin no permitida');
end if;
end;
/
En primer lugar indicamos que el trigger se active antes de borrar la tabla, e indicamos el
esquema de la base de datos (facultad.schema) a modificar. A continuacin comprobamos
que el propietario del objeto es root y que el tipo de objeto es 'TABLE' (esto lo realizamos
gracias a la estructura "ora_dict_obj"), en tal caso, el sistema muestra por pantalla un error,
indicando que la operacin no est permitida. Hemos de destacar que este trigger ha sido
implementado en pl/sql, ya que la sintaxis de mysql no permite implementar triggers sobre
una sola tabla. Para ello se hace uso del esquema de la base de datos implementado con el
sgbd Oracle facilitado en prcticas anteriores.
4. Disparador de Sustitucin
Consiste en un disipador que sustituye a una restriccin de dominio existente en la base de
datos. Una de las restricciones de dominio en la base de datos "facultad" es que la nota final
de cada alumno debe estar comprendida entre 0 y 10, por lo que creamos un trigger que se
encargue de este cometido.
4.1 Cdigo
/*Trigger 3: Modificacin esquema bd*/
/*DELIMITER $$*/
create trigger PREVENT_DROP
before drop on facultad.schema FOR EACH ROW
begin
if ora_dict_obj_owner = 'root'
and ora_dict_obj_type = 'TABLE'
then
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT='Operacin no permitida';
end if;
end;
/*$$*/
5. Disipador de Sustitucin II
Consiste en un disipador que sustituya a alguna restriccin de integridad de referencia
existente en la base de datos. En este caso, hemos decidido representar la integridad creando
un disparador que asegure el valor del atributo id_asignatura, clave fornea de la relacin
Evaluacin_Item y clave primaria de la tabla Asignatura.
5.1 Cdigo
/*Trigger 5: Integridad base de datos*/
/*DELIMITER $$*/
CREATE TRIGGER EVALUACION_ITEM_BEFORE_UPDATE
BEFORE UPDATE ON Evaluacion_Item FOR EACH ROW
BEGIN
IF ((select id_asignatura from Asignatura where
id_asignatura=NEW.id_asignatura) is null)
THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT='Violacin de integridad';
END IF;
END;
/*$$*/
6. Disipador
Consiste en un disparador sobre alguna tabla cuya condicin se satisfaga en funcin de la
extensin de alguna otra tabla.
Esta situacin es parecida a la anterior, con la salvedad de que el atributo a modificar no es
clave de ninguna de las tablas. Con el presente trigger buscamos que al crear una asignatura
introduzcamos un atributo "titulacin" de la que existan grupos de alumnos.
6.1 Cdigo
/*Trigger 6: Extensin tabla*/
/*DELIMETER $$*/
CREATE TRIGGER ALUMNO_AFTER_INSERT
BEFORE INSERT ON Asignatura FOR EACH ROW
BEGIN
IF ((select titulacion from Grupo where
titulacion=NEW.titulacion) is null)
THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT='No existe la titulacin';
END IF;
END;
/*$$*/
Bibliografa
[1]. Gabillaud, Jrome: Oracle 11g. Coleccin Recursos Informticos. Eni Ediciones 2010