Você está na página 1de 10

Universidad de

Crdoba

PRCTICA 3. USO
DE DISPARADORES
Alberto Cruz Crdoba, Emilio Lpez Pia

Base de Datos Avanzada

Prctica 3. Uso de Disipadores

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

Base de Datos Avanzada

Prctica 3. Uso de Disipadores

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));

Base de Datos Avanzada

Prctica 3. Uso de Disipadores

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.2 Ejemplo de Uso


Para probar el trigger he ejecutado la siguiente consulta que modifica el atributo email de la
tabla Persona:
UPDATE
`facultad`.`Persona`
SET
`email`
=
'alberto.cruz.cordoba@gmail.com' WHERE `Persona`.`dni` =43968324;

Como resultado de la consulta se ha aadido una fila a la tabla "auditoria_persona"

Ilustracin 1. Tabla Auditora

Base de Datos Avanzada

Prctica 3. Uso de Disipadores

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.

Base de Datos Avanzada

Prctica 3. Uso de Disipadores

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.

Base de Datos Avanzada

Prctica 3. Uso de Disipadores

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;
/*$$*/

En primer lugar se indica que el trigger NOTA_BEFORE_INSERT se active antes de la


insercin del elemento. A continuacin, se comprueba que el valor del atributo nota_final
que se desea guardar en la base de datos no est entre 0 y 10, para as mostrar un error con
los detalles del conflicto.

Base de Datos Avanzada

Prctica 3. Uso de Disipadores

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;
/*$$*/

El primer paso es indicar que el trigger EVALUACION_ITEM_BEFORE_UPDATE se


active antes de la modificacin que se quiere realizar. A continuacin comprobamos mediante
una consulta si el nuevo valor de id_asignatura se encuentra dentro de la tabla Asignatura,
si el resultado de la consulta es NULL, quiere decir que no se encuentra la asignatura
indicada, por lo que se mostrar un mensaje de error.

Base de Datos Avanzada

Prctica 3. Uso de Disipadores

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;
/*$$*/

En primer lugar en el trigger ALUMNO_AFTER_UPDATE indicamos que el disparador se


active antes de realizar la insercin. A continuacin, comprobamos que el atributo titulacin
de la tabla Asignatura que acabamos de introducir se encuentra en la tabla Grupo, si no es
as, se muestra un mensaje de error indicando que la titulacin no se encuentra en el sistema.

Base de Datos Avanzada

Prctica 3. Uso de Disipadores

Bibliografa
[1]. Gabillaud, Jrome: Oracle 11g. Coleccin Recursos Informticos. Eni Ediciones 2010

Você também pode gostar