112 - Disparador (old y new)


Primer problema:

Un comercio almacena los datos de sus artículos para la venta en una tabla denominada "articulos" y controla las operaciones que se realizan en ella guardando ciertos datos en otra tabla denominada "control".

1- Elimine las tablas:

 drop table control;
 drop table articulos;

2- Cree las tablas con las siguientes estructuras:

 create table articulos(
  codigo number(6),
  descripcion varchar2(40),
  precio number (6,2),
  stock number(4)
 );

 create table control(
  usuario varchar2(30),
  fecha date,
  codigo number(6)
 );

3- Ingrese algunos registros en "articulos":

 insert into articulos values(100,'regla 20 cm.',5.4,100);
 insert into articulos values(102,'regla 40 cm.',15,80);
 insert into articulos values(109,'lapices color x12',6,150);
 insert into articulos values(130,'lapices color x6',4.5,100);
 insert into articulos values(200,'compas metal',21.8,50);

4- Cree un trigger a nivel de fila que se dispara "antes" que se ejecute un "insert" sobre la tabla "articulos". En el cuerpo del disparador se debe ingresar en la tabla "control", el nombre del usuario que realizó la inserción, la fecha y el código del articulo que se ha ingresado

5- Ingrese un nuevo registro en "articulos"

6- Vea qué se almacenó en "control"

7- Cree un disparador que calcule el código cada vez que se inserte un nuevo registro

8- Ingrese un nuevo registro en "articulos"

9- Vea qué se almacenó en "articulos".
Note que ignora el valor de código ingresado y calcula el siguiente valor a partir del máximo existente.

10- Vea qué se almacenó en "control"

11- Ingrese un nuevo artículo sin especificar código

12- Vea qué se almacenó en "articulos"

13- Vea qué se almacenó en "control"

Ver solución

 drop table control;
 drop table articulos;

 create table articulos(
  codigo number(6),
  descripcion varchar2(40),
  precio number (6,2),
  stock number(4)
 );

 create table control(
  usuario varchar2(30),
  fecha date,
  codigo number(6)
 );

 insert into articulos values(100,'regla 20 cm.',5.4,100);
 insert into articulos values(102,'regla 40 cm.',15,80);
 insert into articulos values(109,'lapices color x12',6,150);
 insert into articulos values(130,'lapices color x6',4.5,100);
 insert into articulos values(200,'compas metal',21.8,50);

 create or replace trigger tr_ingresar_art
  before insert
  on articulos
  for each row
  begin
   insert into control values(user,sysdate,:new.codigo);
  end tr_ingresar_art;

 insert into articulos values(200,'compas plastico',18.3,50);

 select *from control;

 create or replace trigger tr_codigo
 before insert
 on articulos
 for each row
 begin
   select max(codigo)+1 into :new.codigo from articulos;
   if :new.codigo is null then
    :new.codigo:=1;
   end if;
 end tr_codigo;

 insert into articulos values(200,'cuaderno rayado x12',6,200);

 select *from articulos;

 select *from control;

 insert into articulos (descripcion,precio,stock) values('cuaderno liso x12',5.5,200);

 select *from articulos;

 select *from control;

 

Segundo 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),
  precio number(6,2)
 );

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 dispare al ingresar un registro en "libros"; si alguno de los libros ingresados tiene un precio menor o igual a $30 debe ingresarlo en "ofertas"

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 no se ingresó ningún registro en "ofertas"

9- Cree un trigger a nivel de fila que se dispare al modificar el precio de un libro. Si tal libro existe en "ofertas" y su nuevo precio ahora es superior a $30, debe eliminarse de "ofertas"; si tal libro no existe en "ofertas" y su nuevo precio ahora es inferior a $30, debe agregarse a "ofertas"

10- Aumente a más de $30 el precio de un libro que se encuentra en "ofertas"

11- Verifique que el trigger se disparó consultando "libros" y "ofertas"

12- Disminuya a menos de $31 el precio de un libro que no se encuentra en "ofertas"

13- Verifique que el trigger se disparó consultando "libros" y "ofertas"

14- Aumente el precio de un libro que no se encuentra en "ofertas"

15- Verifique que el trigger se disparó pero no se modificó "ofertas"

16- Cree un trigger a nivel de fila que se dispare al borrar un registro en "libros"; si alguno de los libros eliminados está en "ofertas", también debe eliminarse de dicha tabla.

17- Elimine un libro en "libros" que esté en "ofertas"

18- Verifique que el trigger se disparó consultando "libros" y "ofertas"

19- Elimine un libro en "libros" que No esté en "ofertas"

20- Verifique que el trigger se disparó consultando "libros" y "ofertas"

21- Cree una tabla llamada "control" que almacene el código, la fecha y el precio de un libro, antes elimínela por si existe

22- Cree un disparador que se dispare cada vez que se actualice el precio de un libro; el trigger debe ingresar en la tabla "control", el código del libro cuyo precio se actualizó, la fecha y el precio anterior.

23- Actualice el precio de un libro

24- Controle que el precio se ha modificado en "libros" y que se agregó un registro en "control"

25- Modifique nuevamente el precio del libro cambiado en el punto 11

26- Controle que el precio se ha modificado en "libros" y que se agregó un nuevo registro en "control"

27- Modifique el precio de varios libros en una sola sentencia que incluya al modificado anteriormente

28- Controle que el precio se ha modificado en "libros" y que se agregó un nuevo registro en "control"

29- Vea qué informa el diccionario "user_triggers" respecto del trigger anteriormente creado


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),
  precio number(6,2)
 );

 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
 begin
  if (:new.precio<=30) then
   insert into ofertas values(:new.codigo,:new.precio);
  end if;
 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_modificar_libros_precio
 before update of precio
 on libros
 for each row
 begin
  if (:old.precio<=30) and (:new.precio>30) then
   delete from ofertas where codigo=:old.codigo;
  end if;
  if (:old.precio>30) and (:new.precio<=30) then
   insert into ofertas values(:new.codigo,:new.precio);
  end if;
 end tr_modificar_libros_precio;

 update libros set precio=50 where codigo=150;

  select *from libros;
  select *from ofertas;

 update libros set precio=30 where codigo=155;

  select *from libros;
  select *from ofertas;

 update libros set precio=precio+2 where codigo=150;

  select *from libros;
  select *from ofertas;

 create or replace trigger tr_eliminar_libros_ofertas
 before delete
 on libros
 for each row
 begin
   delete from ofertas where codigo=:old.codigo;
 end tr_eliminar_libros_ofertas;

 delete from libros where codigo=155;

  select *from libros;
  select *from ofertas;

 delete from libros where codigo=150;

  select *from libros;
  select *from ofertas;

 create table control(
  codigo number(6),
  fecha date,
  precio number(6,2)
 );

 create or replace trigger tr_actualizar_precio
  before update of precio
  on libros
  for each row
 begin
  insert into control values(:old.codigo,sysdate,:old.precio);
 end tr_actualizar_precio;

 update libros set precio=40 where codigo=120;

 select *from libros where codigo=120;
 select *from control;

 update libros set precio=45 where codigo=120;

 select *from libros where codigo=120;
 select *from control;

 update libros set precio=precio+(precio*0.5) where codigo>=120;

 select *from libros where codigo>120;
 select *from control;

 select *from user_triggers where trigger_name ='TR_ACTUALIZAR_PRECIO';

Retornar