You are on page 1of 8

Nombre: Lituma Perero Freddy

TALLER SQL 3: TRIGGERS Y STORED


PROCEDURES
1. Crear un disparador para controlar la no insercin de una
fila en la tabla empleado cuando no sea horario laboral.
1.1 Copie el cdigo que utiliz para crear el disparador
delimiter //
create trigger validar_ingreso_empleado
before insert on empleado
for each row
begin
/* Si es sbado o domingo devuelve un error.*/
IF (select dayname(now())) = 'Saturday' or (select dayname(now()))
= 'Sunday' THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'No es dia de
trabajo';
END IF;
/* Si hora es anterior a las 8:00 o posterior a las 16:00 devuelve un
error */
IF (select hour(now())) < 8 or (select hour(now())) > 16 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'No es horario de
trabajo';
END IF;

Intentar ejecutar la siguiente orden y comprobar si ha habido algn


cambio en la tabla:
INSERT INTO empleado VALUES (11, 'Pepe', 30);
1.2 Copie el resultado luego de tratar de ejecutar la orden

anterior:
Nota:
Se supone que el horario laboral es de 8 de la maana a 4 de la tarde
y de lunes a viernes. Cambiar la fecha del ordenador para que sea
sbado o domingo. En el caso que no se pueda cambiar la fecha,
cambie las restricciones dentro del disparador para verificar que no se
ingrese el empleado.
2. Crear el mismo disparador pero utilizando un procedimiento
en el cuerpo del disparador que controle si la hora y el da son
correctos.

2.1 Copie el cdigo que utiliz para crear el procedimiento


delimiter //
create procedure validar_ingreso_emp()
begin
/* Si es sbado o domingo devuelve un error.*/
IF (select dayname(now())) = 'Saturday' or (select dayname(now())) =
'Sunday' THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'No es dia de
trabajo';
END IF;
/* Si hora es anterior a las 8:00 o posterior a las 16:00 devuelve un
error */
IF (select hour(now())) < 8 or (select hour(now())) > 16 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'No es horario de
trabajo';
END IF;

Nota: Desde un disparador se puede llamar a un procedimiento


mediante su nombre en el cuerpo del disparador.
2.2 Copie el cdigo que utiliz para crear el disparador
delimiter //
create trigger validar_ingreso_empl
before insert on empleado
for each row
begin
call validar_ingreso_emp();
end//
Intentar ejecutar la siguiente orden y comprobar si ha habido algn
cambio en la tabla:
INSERT INTO empleado VALUES (11, 'Pepe', 30);

3. Crear un disparador que impida cualquier operacin en la


tabla empleado fuera del horario laboral dando una indicacin
especfica de la operacin que no es realizable y porque no es
realizable.
3.1 Copie el cdigo que utiliz para crear el disparador
4. Aadir a la tabla empleado una nueva columna salario dnde
se almacenar el valor del departamento al que un empleado
pertenezca multiplicado por 100.
Nota: luego de crear el campo, actualice el nuevo valor de salario.
4.1 Copie el cdigo que utiliz para crear el nuevo campo y
actualizar el valor del salario.
alter table empleado
add salario integer;
update empleado
set empleado.salario = (empleado.dep * 100);
5. Crear una tabla (cambios) dnde se almacenarn, mediante
la utilizacin de un disparador, los cambios que se han llevado
a cabo en la tabla empleado de forma que ante cada cambio de
departamento o de salario de un empleado, la nueva tabla
almacenar el identificador del empleado(cedula), el antiguo y
el nuevo salario (v_salario, n_salario), o el antiguo y el nuevo
departamento (v_dep, n_dep) junto con la fecha en que el
cambio tuvo lugar.

5.1 Copie el cdigo que utiliz para crear la tabla Cambios


create table cambios(
cedula integer,
v_salario integer,
n_salario integer,
v_dep integer,
n_dep integer,
fecha date
);

5.2 Copie el cdigo que utiliz para crear el disparador que


permite guardar los cambios de la tabla Empleado
delimiter //
create trigger guardar_cambio_empleado
before update on
empleado
for each row
begin
/*guarda en la tabla cambios si hay algun cambio en el salario
*/
if (new.salario <> old.salario)then
insert into cambios
values(old.cedula,old.salario,new.salario,NULL,NULL,(select
date(now())));
end if;
/*guarda en la tabla cambios si el nuevo departamento es
diferente al anterior */
if (new.dep <> old.dep) then
insert into cambios
values(old.cedula,NULL,NULL,old.dep,new.dep,(select
date(now())));
end if;

Utilizar variables para la construccion del disparador.


Probar las siguientes consultas y mostrar los
obtenidos.

resultados

1. UPDATE empleado SET salario= salario*2 WHERE dep=10;


2. UPDATE empleado SET dep = salario/200 where salario>2000;
5.3 Copie el resultado de la tabla Cambios luego de haber

hecho el update 1.
5.3 Copie el resultado de la tabla Cambios luego de haber

hecho el update 2.
6. Aadir a la tabla empleado una nueva columna denominada
med que contendr la media del salario que el trabajador ha
tenido en la empresa. Esta columna tendr el salario actual del
trabajador hasta que este salario se modifique. Cuando se
modifique, med pasar a valer la suma del salario anterior, el

salario actual y la media de salario del empleado dividido entre


tres. Que ocurre?. Porque?.
Aparece un error porque se est invocando a la funcion UPDATE 2
veces.
6.1 Copie el cdigo que utiliz para crear la nueva columna.
alter table empleado
add med float;
update empleado
set empleado.med = (empleado.salario);
6.2 Modifique el salario del empleado cuyo id es igual a 8. El
nuevo salario del empleado ser igual a 7000. Copie los
resultados obtenidos de la tabla Empleado luego de haber
realizado dicho cambio.

7. Crear una vista (vista_seis) dnde se almacenen el


identificador y la media de los salarios de cada empleado.
7.1 Copie el cdigo que utiliz para crear la vista.
create view vista_seis as
select cedula as id, med as promedio from empleado

7.2 Copie los resultados luego de haber ejecutado la siguiente


instruccin:

SELECT * FROM vista_seis

8. Realizar lo necesario para conseguir ejecutar la siguiente


instruccin:
DELETE FROM vista_seis WHERE idep=20;
8.1 Copie el cdigo que utiliz para poder ejecutar
insert into empleado values (20,'miriam',207,3079,3917);
delete from vista_seis where id=20;
instruccin anterior.

la

You might also like