Está en la página 1de 7

Universidad Autnoma Gabriel Ren Moreno

Facultad de Ciencias de la Computacin. Carrera de Ingeniera Informtica

TRABAJO PRACTICO Materia BASE DE DATOS II TEMA 5. TRIGGER (Disparadores)

Docente: Ing. Ubaldo Perez Ferreira

Santa Cruz de la Sierra, Junio 2013

1. Responda a las siguientes preguntas:


a. b. c. d. e. Qu es un Trigger y para qu sirve? Cules son los beneficios de usar Trigger? Donde se almacenan los Trigger? Cmo crear y ejecutar un Trigger? Cmo borrar y editar un Trigger?

1. Para hacer en Laboratorio:


Una empresa almacena los datos de sus empleados en una tabla denominada "empleados". 1.1. Crear la tabla, con la siguiente estructura: create table empleados( documento char(8) not null, nombre varchar(30) not null, domicilio varchar(30), seccion varchar(20), constraint PK_empleados primary key(documento), ); 1.2. Ingresar algunos registros: insert into empleados values('222222','Ana Acosta','Charcass 56','Secretaria'); insert into empleados values('233333','Bernardo Bustos','Buenos Aires 188','Contabilidad'); insert into empleados values('244444','Carlos Caseres','Casilla 364','Sistemas'); insert into empleados values('255555','Diana Duarte','Colon 1234','Sistemas'); insert into empleados values('266666','Jazzhiel Obed Perez,'Colon 897','Sistemas'); insert into empleados values('277777',Evo Morales','Colon 542','Gerencia'); 1.3. Crear un Trigger para que no permita eliminar ms de un registro a la vez de la tabla empleados: create trigger dis_empleados_borrar on empleados for delete as if (select count(*) from deleted)>1 begin raiserror('No puede eliminar ms de un 1 empleado', 16, 1) rollback transaction end; 1.4. Crear un Trigger para que no permita actualizar el campo "documento" de la tabla "empleados": create trigger dis_empleados_actualizar on empleados for update

as if update(documento) begin raiserror('No puede modificar el documento de los empleados', 16, 1) rollback transaction end; 1.5. Crear un Trigger para que no permita ingresar empleados en la seccin "Gerencia": create trigger dis_empleados_insertar on empleados for insert as if (select seccion from inserted)='Gerencia' begin raiserror('No puede ingresar empleados en la seccin "Gerencia".', 16, 1) rollback transaction end; 1.6. Intentar borrar varios empleados: delete from empleados where domicilio like 'Bulnes%';
El trigger se dispara, muestra el mensaje y deshace la transaccin.

1.7. Deshabilitar el trigger para el evento de eliminacin: alter table empleados disable trigger dis_empleados_borrar; 1.8. Borrar varios empleados: delete from empleados where domicilio like 'Bulnes%';
El trigger no se dispar porque est deshabilitado. Podemos verificar que los registros de eliminaron recuperando los datos de la tabla:

select *from empleados; 1.9. Intentar modificar un documento: update empleados set documento='23030303' where documento='23333333';
El trigger se dispara, muestra el mensaje y deshace la transaccin.

1.10. Intentar ingresar un nuevo empleado en "Gerencia": insert into empleados values('28888888','Juan Juarez','Jamaica 123','Gerencia');
El trigger se dispara, muestra el mensaje y deshace la transaccin.

1.11. Deshabilitar los Trigger s de insercin y actualizacin definidos sobre "empleados": alter table empleados disable trigger dis_empleados_actualizar, dis_empleados_insertar; 1.12. Ejecutamos la sentencia de actualizacin del documento: update empleados set documento='200004'

where documento='244444';
El trigger no se dispara porque est deshabilitado, el documento se actualiz. verifiqumoslo:

select *from empleados; 1.13. Ingresar un nuevo empleado en "Gerencia": insert into empleados values('28888888','Juan Juarez','Jamaica 123','Gerencia');
El trigger "dis_empleados_insertar" no se dispara porque est deshabilitado, el registro se agreg a la tabla. verifiqumoslo:

select *from empleados; 1.14. Habilitar todos los triggers de la tabla "empleados": alter table empleados enable trigger all; Ya no podemos eliminar ms de un registro, actualizar un documento ni ingresar un empleado en la seccin "Gerencia"; lo intentamos: update empleados set documento='30000000' where documento='288888'; El trigger se dispara (est habilitado), muestra el mensaje y deshace la transaccin.

2. Crear las siguientes tablas en la Base de Datos "practico"


create database practico create table materia ( code int primary key, sigla char(6) not null, grupo char(2) not null, sem int not null, anio int not null, ht int not null, hp int not null, cupo int not null, insc int not null

----------

Codigo de la materia ofertada Sigla de la materia ofertada Grupo Semestre Anio Horas Teoricas a la Semana Horas Practicas a la Semana Cupo ofertado Total Inscrito, se actualiza cuando se -- inserta/elimina una fila en notas

) create unique index idx_materia on materia(sigla,grupo,sem,anio) create table horarios ( code int not null, -- Codigo de la Materia Ofertada dia int not null, -- Dia de la semana (1=Lun,2=Mar,...7=Dom) horai decimal(12,2), -- Hora de inicio de la clase horaf decimal(12,2), -- Hora de final de la clase aula char(10), -- Aula donde se pasara la clase (214-24, 21425,...) foreign key (code) references materia ) create table notas ( registro int not null, -- Numero de registro del Estudiante code int not null, -- Codigo de la materia ofertada inscrita nota int , -- Nota de la materia estado int not null, -- 0=Inscrita, 1=Con Nota primary key (registro,code), foreign key (code) references materia )

3. Crear Trigger y ejecutarlos en SQL.


3.1. Hacer un trigger (ti_horarios) que al momento de insertar una fila en la tabla horarios, valide las siguientes condiciones: a. Que la hora de inicio y fin sean validas, b. Que el rago de cada hora de clase tenga 60 mintutos o multiplos y c. Que los dias de clase de la semana sean Validos. Si no se cumplen las condiciones citadas anteriormente se debe abortar la insersion a la tabla horarios NOTA. Se deben usar los Procedemientos Almacenados PA_ValidaHora, PA_DiaValidos y PA_Hora60min. -- DROP TRIGGER ti_horarios CREATE TRIGGER ti_horarios ON horarios AFTER INSERT AS DECLARE @horai DECIMAL(12,2), @horaf DECIMAL(12,2) DECLARE @minuto DECIMAL(12,2),@dia INT,@valido INT SELECT @horai=horai,@horaf=horaf,@dia=dia FROM INSERTED EXEC PA_ValidaHora @horai, @valido OUTPUT IF @valido=0 BEGIN RAISERROR('La hora de inicio no es valida!!!! ...', 16, 1) ROLLBACK RETURN END EXEC PA_ValidaHora @horaf, @valido OUTPUT IF @valido=0 BEGIN RAISERROR('La hora final no es valida!!!! ...', 16, 1)

END

ROLLBACK RETURN

16, 1)

EXEC PA_Hora60min @horai,@horaf,@valido OUTPUT IF @valido=0 BEGIN RAISERROR('La hora no tiene 60 minutos o multiplos!!!!...', ROLLBACK RETURN END EXEC PA_DiaValidos @dia,@valido OUTPUT IF @valido=0 BEGIN RAISERROR('El dia no es valido!!! ...', 16, 1) ROLLBACK RETURN END

Ejecutar las siguiente isntrucciones para verificar la funcionalidad de los TRIGGER's y PA's creados. insert into materia values(1,'INF120','X',2,2012,3,3,4,0) insert into materia values(2,'INF220','A',2,2012,3,3,4,0) insert into horarios values(1,1,07.00,09.00,'214-16') insert into horarios values(1,3,07.00,09.00,'214-16') insert into horarios values(1,5,07.00,09.00,'214-16') insert into horarios values(2,2,07.15,09.00,'214-22') insert into horarios values(2,4,22.00,24.67,'214-22') insert into horarios values(2,9,07.00,09.00,'214-22') -- debe dar error -- debe dar error -- debe dar error

3.2. Hacer un trigger que al momento de insertar una fila en la tabla notas, valide si existe cupo disponible en la tabla materia, si no existe cupo disponible que muestre un mensaje 'No hay cupos' y cancele la insersion en la tabla notas. Si existe cupo disponible que incremente en 1 el campo insc de la tabla materia. NOTA: Cupo Disponible = (Cupo - Insc) y debe ser mayor a cero. -- DROP TRIGGER ti_notas CREATE TRIGGER ti_notas ON notas FOR INSERT AS DECLARE @code INT, @cupo_disp INT SELECT @code=code FROM INSERTED SELECT @cupo_disp=cupo-insc FROM materia WHERE @code=code IF @cupo_disp<=0 BEGIN RAISERROR('No existe cupo disponible ...', 16, 1) ROLLBACK RETURN END UPDATE materia SET insc = insc + 1 WHERE @code=code Ejecutar las siguiente isntrucciones para verificar la funcionalidad de los TRIGGER's y PA's creados insert insert insert insert insert into into into into into notas notas notas notas notas values(4046501,1,null,0) values(4046501,2,null,0) values(4046503,2,null,0) values(4046504,2,null,0) values(4046505,2,null,0)

select * from materia insert into notas values(4046508,2,null,0) -- debe dar error

3.4. Hacer un trigger que al momento de eliminar una fila en la tabla notas, que decremente en 1 el campo insc de la tabla materia. -- DROP TRIGGER td_notas

CREATE TRIGGER td_notas ON notas AFTER DELETE AS UPDATE materia SET insc = insc - (select count(*) FROM DELETED WHERE materia.code=DELETED.code) Ejecutar las siguiente isntrucciones para verificar la funcionalidad de los TRIGGER's y PA's creados select * from materia delete from notas where code=2 select * from materia select * from notas

También podría gustarte