113 - Disparador condiciones (when) |
Una librería almacena los datos de sus libros en una tabla denominada "libros" y en otra denominada "ofertas", almacena los códigos y precios de los libros cuyo precio es inferior a $50.
1- Elimine las tablas:
drop table libros; drop table ofertas;
2- Cree las tablas con las siguientes estructuras:
create table libros( codigo number(6), titulo varchar2(40), autor varchar2(30), editorial varchar(20), precio number(6,2) ); create table ofertas( codigo number(6), titulo varchar2(40) );
3- Ingrese algunos registros en "libros":
insert into libros values(100,'Uno','Richard Bach','Planeta',25); insert into libros values(103,'El aleph','Borges','Emece',28); insert into libros values(105,'Matematica estas ahi','Paenza','Nuevo siglo',12); insert into libros values(120,'Aprenda PHP','Molina Mario','Nuevo siglo',55); insert into libros values(145,'Alicia en el pais de las maravillas','Carroll','Planeta',35);
4- Cree un trigger a nivel de fila que se dispara "antes" que se ejecute un "insert" sobre "libros". Se activa solamente si el precio que se ingresa es inferior a $30, en caso de serlo, se ingresa en "ofertas" el código y precio del libro
5- Ingrese un libro en "libros" cuyo precio sea inferior a $30
6- Verifique que el trigger se disparó consultando "ofertas"
7- Ingrese un libro en "libros" cuyo precio supere los $30
8- Verifique que el trigger no se disparó consultando "ofertas"
9- Cree un trigger a nivel de fila que se dispare al borrar un libro de "libros", únicamente si el precio del libro que se elimina es inferior a $30, es decir, si existe en "ofertas"
10- Elimine un registro de "libros" cuyo precio sea inferior a $30
11- Verifique que el trigger se disparó consultando "ofertas" y "libros"
12- Elimine un registro de "libros" cuyo precio supere los $30
13- Verifique que el trigger no se disparó consultando "ofertas" y que si se ha eliminado el registro en "libros"
Ver solucióndrop table libros; drop table ofertas; create table libros( codigo number(6), titulo varchar2(40), autor varchar2(30), editorial varchar(20), precio number(6,2) ); create table ofertas( codigo number(6), titulo varchar2(40) ); insert into libros values(100,'Uno','Richard Bach','Planeta',25); insert into libros values(103,'El aleph','Borges','Emece',28); insert into libros values(105,'Matematica estas ahi','Paenza','Nuevo siglo',12); insert into libros values(120,'Aprenda PHP','Molina Mario','Nuevo siglo',55); insert into libros values(145,'Alicia en el pais de las maravillas','Carroll','Planeta',35); create or replace trigger tr_ingresar_libros_ofertas before insert on libros for each row when(new.precio<30) begin insert into ofertas values(:new.codigo,:new.titulo); end tr_ingresar_libros_ofertas; / insert into libros values(150,'El experto en laberintos','Gaskin','Planeta',28); select *from ofertas; insert into libros values(155,'El gato con botas',null,'Planeta',38); select *from ofertas; create or replace trigger tr_borrar_libros_ofertas before delete on libros for each row when(old.precio<30) begin delete from ofertas where codigo=:old.codigo; end tr_borrar_libros_ofertas; / delete from libros where codigo=150; select *from ofertas; select *from libros; delete from libros where codigo=155; select *from ofertas; select *from libros;
Una empresa almacena los datos de sus empleados en una tabla denominada "empleados".
1- Elimine la tabla:
drop table empleados;
2- Cree la tabla con la siguiente estructura:
create table empleados( documento char(8), apellido varchar2(20), nombre varchar2(20), seccion varchar2(30), sueldo number(8,2) );
3- Ingrese algunos registros:
insert into empleados values('22333444','ACOSTA','Ana','Secretaria',500); insert into empleados values('22555666','CASEROS','Carlos','Contaduria',900); insert into empleados values('22777888','DOMINGUEZ','Daniel','Secretaria',560); insert into empleados values('22999000','FUENTES','Federico','Sistemas',680); insert into empleados values('23444555','GOMEZ','Gabriela','Sistemas',1200); insert into empleados values('23666777','JUAREZ','Juan','Contaduria',1000);
4- La empresa necesita controlar cuando se le aumenta el sueldo a los empleados, guardando en una tabla denominada "control", el nombre del usuario, la fecha, el documento de quien se ha modificado el sueldo, el antiguo sueldo y el nuevo sueldo. Para ello cree la tabla control (antes elimínela por si existe):
drop table control; create table control( usuario varchar2(30), fecha date, documento char(8), antiguosueldo number(8,2), nuevosueldo number(8,2) );
5- Cree un disparador que almacene el nombre del usuario, la fecha, documento, el antiguo y el nuevo sueldo en "control" cada vez que se actualice un sueldo de la tabla "empleados" a un valor mayor. Si el sueldo se disminuye, el trigger no debe activarse. Si se modifica otro campo diferente de "sueldo", no debe activarse.
6- Actualice el sueldo de todos los empleados de la sección "Sistemas" a "1000"
7- Consulte la tabla "control" para ver cuántas veces se ha disparado el trigger
Se ha disparado una sola vez; se actualizaron 2 registros, pero en solo uno de ellos se aumentó el sueldo.
8- Al empleado con documento "22333444" se lo ha cambiado a la sección "contaduria". Realice el cambio en la tabla "empleados"
9- Verifique que el trigger no se ha activado porque no se ha modificado el campo "sueldo". Consulte "control"
10- Cree un disparador a nivel de fila que se dispare cada vez que se ingrese un nuevo empleado y coloque en mayúsculas el apellido ingresado. Además, si no se ingresa sueldo, debe ingresar '0'
11- Ingrese un nuevo empleado empleando minúsculas en el apellido
12- Verifique que el trigger "tr_ingresar_empleados" se disparó
13- Ingrese dos nuevos empleados, uno sin sueldo y otro con sueldo "null"
14- Verifique que el trigger "tr_ingresar_empleados" se ha disparado
Los dos registros deben tener el apellido en mayúsculas y deben tener el valor '0' en sueldo.
15- Cree un disparador a nivel de fila que se dispare cada vez que se ingresa un nuevo empleado y coloque "null" en "sueldo" si el sueldo ingresado supera los $1000 o es inferior a $500
16- Ingrese un nuevo empleado con un sueldo que dispare el trigger creado anteriormente
17- Verifique que el trigger "tr_ingresar_empleados" se disparó
drop table empleados; create table empleados( documento char(8), apellido varchar2(20), nombre varchar2(20), seccion varchar2(30), sueldo number(8,2) ); insert into empleados values('22333444','ACOSTA','Ana','Secretaria',500); insert into empleados values('22555666','CASEROS','Carlos','Contaduria',900); insert into empleados values('22777888','DOMINGUEZ','Daniel','Secretaria',560); insert into empleados values('22999000','FUENTES','Federico','Sistemas',680); insert into empleados values('23444555','GOMEZ','Gabriela','Sistemas',1200); insert into empleados values('23666777','JUAREZ','Juan','Contaduria',1000); drop table control; create table control( usuario varchar2(30), fecha date, documento char(8), antiguosueldo number(8,2), nuevosueldo number(8,2) ); / create or replace trigger tr_aumentar_sueldo_empleados before update of sueldo on empleados for each row when(new.sueldo>old.sueldo) begin insert into control values(user,sysdate,:old.documento,:old.sueldo,:new.sueldo); end; / update empleados set sueldo=1000 where seccion='Sistemas'; select *from control; update empleados set seccion='Contaduria' where documento='22333444'; select *from control; create or replace trigger tr_ingresar_empleados before insert on empleados for each row begin :new.apellido := upper(:new.apellido); if (:new.sueldo is null) then :new.sueldo := 0; end if; end; / insert into empleados values('25666777','Lopez','Luisa','Secretaria',650); select *from empleados where documento='25666777'; insert into empleados (documento,apellido,nombre, seccion) values('26777888','Morales','Marta','Secretaria'); insert into empleados values('26999000','Perez','Patricia','Contaduria',null); select *from empleados; create or replace trigger tr_ingresar_empleados before insert on empleados for each row when (new.sueldo>1000 or new.sueldo<500) begin :new.sueldo := null; end tr_ingresar_empleados; / select *from empleados where documento='31313131';