113 - Disparador condiciones (when)


Primer problema:

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ón

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

 

Segundo problema:

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ó


Ver solución
 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';

Retornar