114 - Disparador de actualizacion - campos (updating)


Primer problema:

Una librería almacena los datos de sus libros en una tabla denominada "libros".

1- Elimine la tabla:

 drop table libros;
 

2- Cree la tabla con la siguiente estructura:

 create table libros(
  codigo number(6),
  titulo varchar2(40),
  autor varchar2(30),
  editorial varchar2(20),
  precio number(6,2),
  stock number(4)
 );

3-Ingrese algunos registros en "libros":

 insert into libros values(100,'Uno','Richard Bach','Planeta',25,100);
 insert into libros values(103,'El aleph','Borges','Emece',28,0);
 insert into libros values(105,'Matematica estas ahi','Paenza','Nuevo siglo',12,50);
 insert into libros values(120,'Aprenda PHP','Molina Mario','Nuevo siglo',55,200);
 insert into libros values(145,'Alicia en el pais de las maravillas','Carroll','Planeta',35,10);

4- Cree un trigger a nivel de fila que se dispare "antes" que se ejecute un "update" sobre la tabla "libros". En el cuerpo del trigger se debe averiguar el campo que ha sido modificado. En caso de modificarse:

- el código, debe rechazarse la modificación con un mensaje de error.

- el "precio", se controla si es mayor o igual a cero, si lo es, debe dejarse el precio anterior y mostrar un mensaje de error.

- el stock, debe controlarse que no se ingrese un número negativo ni superior a 1000, en tal caso, debe rechazarse con un mensaje de error.

5- Intente modificar el precio de un libro con un valor negativo
Mensaje de error 20001;

6- Verifique que el trigger se ha disparado consultando la tabla "libros"
El cambio de precio no se realizó.

7- Actualice un precio a un valor aceptado

8- Verifique que el trigger se ha disparado consultando la tabla "libros"
El cambio de precio se realizó.

9- Intente cambiar el código de un libro
Mensaje de error 20000.

10- Verifique que el cambio no se ha realizado

11- Intente cambiar el stock de un libro a un valor negativo
Mensaje de error 20002.

12- Verifique que el cambio no se ha realizado

13- Intente cambiar el stock de un libro a un valor que supere los 1000
Mensaje de error 20002.

14- Cambie el stock de un libro a un valor permitido

15- Verifique que el cambio se ha realizado

Ver solución

 drop table libros;
 
 create table libros(
  codigo number(6),
  titulo varchar2(40),
  autor varchar2(30),
  editorial varchar2(20),
  precio number(6,2),
  stock number(4)
 );

 insert into libros values(100,'Uno','Richard Bach','Planeta',25,100);
 insert into libros values(103,'El aleph','Borges','Emece',28,0);
 insert into libros values(105,'Matematica estas ahi','Paenza','Nuevo siglo',12,50);
 insert into libros values(120,'Aprenda PHP','Molina Mario','Nuevo siglo',55,200);
 insert into libros values(145,'Alicia en el pais de las maravillas','Carroll','Planeta',35,10);

 create or replace trigger tr_actualizar_libros
 before update
 on libros
 for each row
 begin
  if updating ('codigo') then
    raise_application_error(-20000,'No puede modificar el codigo');     
  end if;
  if updating ('precio') then
   if (:new.precio<0) then
    raise_application_error(-20001,'No puede colocar precios negativos');     
   end if;
  end if;
  if updating ('stock') then
   if (:new.stock<0) or (:new.stock>1000)then
    raise_application_error(-20002,'El valor de stock debe estar entre 0 y 1000');     
   end if;
  end if;
 end tr_actualizar_libros;
 /

 update libros set precio=-50 where codigo=100;

 select *from libros;

 update libros set precio=1 where codigo=100;

 select *from libros;

 update libros set codigo=1 where codigo=100;

 select *from libros;

 update libros set stock=-1 where codigo=100;

 select *from libros;

 update libros set stock=2000 where codigo=100;

 update libros set stock=200 where codigo=100;

 select *from libros;

 

Segundo problema:

Un comercio almacena los datos de los artículos que tiene para la venta en una tabla denominada "articulos". En otra tabla denominada "pedidos" almacena el código de cada artículo y la cantidad que necesita solicitar a los mayoristas. En una tabla llamada "controlPrecios" almacena la fecha, el código del artículo y ambos precios (antiguo y nuevo).

1- Elimine las tablas:

 drop table articulos;
 drop table pedidos;
 drop table controlPrecios;

2- Cree las tablas con las siguientes estructuras:

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

 create table pedidos(
  codigo number(4),
  cantidad number(4)
 );

 create table controlPrecios(
  fecha date,
  codigo number(4),
  anterior number(6,2),
  nuevo number(6,2)
 );

3- Ingrese algunos registros en "articulos":

 insert into articulos values(100,'cuaderno rayado 24h',4.5,100);
 insert into articulos values(102,'cuaderno liso 12h',3.5,150);
 insert into articulos values(104,'lapices color x6',8.4,60);
 insert into articulos values(160,'regla 20cm.',6.5,40);
 insert into articulos values(173,'compas xxx',14,35);
 insert into articulos values(234,'goma lapiz',0.95,200);

4- Ingrese en "pedidos" todos los códigos de "articulos", con "cantidad" cero

5- Active el paquete "dbms_output":

 set serveroutput on;
 execute dbms_output.enable(20000);

6- Cada vez que se disminuye el stock de un artículo de la tabla "articulos", se debe incrementar la misma cantidad de ese artículo en "pedidos" y cuando se incrementa en "articulos", se debe disminuir la misma cantidad en "pedidos". Si se ingresa un nuevo artículo en "articulos", debe agregarse un registro en "pedidos" con "cantidad" cero. Si se elimina un registro en "articulos", debe eliminarse tal artículo de "pedidos". Cree un trigger para los tres eventos (inserción, borrado y actualización), a nivel de fila, sobre "articulos", para los campos "stock" y "precio", que realice las tareas descriptas anteriormente, si el campo modificado es "stock". Si el campo modificado es "precio", almacene en la tabla "controlPrecios", la fecha, el código del artículo, el precio anterior y el nuevo.
El trigger muestra el mensaje "Trigger activado" cada vez que se dispara; en cada "if" muestra un segundo mensaje que indica cuál condición se ha cumplido.

7- Disminuya el stock del artículo "100" a 30
Un mensaje muestra que el trigger se ha disparado actualizando el "stock".

8- Verifique que el trigger se disparó consultando la tabla "pedidos" (debe aparecer "70" en "cantidad" en el registro correspondiente al artículo "100")

9- Ingrese un nuevo artículo en "articulos"
Un mensaje muestra que el trigger se ha disparado por una inserción.

10- Verifique que se ha agregado un registro en "pedidos" con código "280" y cantidad igual a 0

11- Elimine un artículo de "articulos"
Un mensaje muestra que el trigger se ha disparado por un borrado.

12- Verifique que se ha borrado el registro correspondiente al artículo con código "234" en "pedidos"

13- Modifique el precio de un artículo
Un mensaje muestra que el trigger se ha disparado por una actualización de precio.

14- Verifique que se ha agregado un registro en "controlPrecios"

15- Modifique la descripción de un artículo
El trigger no se ha disparado, no aparece mensaje.

16- Modifique el precio, stock y descripcion de un artículo
Un mensaje muestra que el trigger se ha disparado por una actualización de stock y otra de precio. La actualización de "descripcion" no disparó el trigger.

17- Verifique que se ha agregado un registro en "controlPrecios" y se ha modificado el campo "cantidad" con el valor "5"

18- Modifique el stock de varios artículos en una sola sentencia
Cuatro mensajes muestran que el trigger se ha disparado 4 veces, por actualizaciones de stock.

19- Verifique que se han modificado 4 registros en "pedidos"

20- Modifique el precio de varios artículos en una sola sentencia
Cuatro mensajes muestran que el trigger se ha disparado 4 veces, por actualizaciones de precio.

21- Verifique que se han agregado 4 nuevos registros en "controlPrecios"

22- Elimine varios artículos en una sola sentencia
Cuatro mensajes muestran que el trigger se ha disparado 4 veces, por borrado de registros.

23- Verifique que se han eliminado 4 registros en "pedidos"


Ver solución
 drop table articulos;
 drop table pedidos;
 drop table controlPrecios;

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

 create table pedidos(
  codigo number(4),
  cantidad number(4)
 );

 create table controlPrecios(
  fecha date,
  codigo number(4),
  anterior number(6,2),
  nuevo number(6,2)
 );

 insert into articulos values(100,'cuaderno rayado 24h',4.5,100);
 insert into articulos values(102,'cuaderno liso 12h',3.5,150);
 insert into articulos values(104,'lapices color x6',8.4,60);
 insert into articulos values(160,'regla 20cm.',6.5,40);
 insert into articulos values(173,'compas xxx',14,35);
 insert into articulos values(234,'goma lapiz',0.95,200);

 insert into pedidos (codigo)
   select (codigo) from articulos;
 update pedidos set cantidad=0;

 set serveroutput on;
 execute dbms_output.enable(20000);

create or replace trigger tr_articulos
 before insert or delete or update of stock, precio
 on articulos
 for each row
 begin
  dbms_output.put_line('Trigger disparado');
  if (inserting) then
    insert into pedidos values(:new.codigo,0);
    dbms_output.put_line(' insercion');
  end if; 
  if (deleting) then
    delete from pedidos where codigo = :old.codigo;    
    dbms_output.put_line(' borrado');
  end if; 
  if updating ('STOCK') then
    update pedidos set cantidad=cantidad+(:old.stock - :new.stock) where codigo = :old.codigo;
    dbms_output.put_line(' actualizacion de stock');
  end if;
  if updating('PRECIO') then
    insert into controlPrecios values(sysdate,:old.codigo,:old.precio,:new.precio);
    dbms_output.put_line(' actualizacion de precio');
  end if;
 end tr_articulos;
 /

 update articulos set stock=30 where codigo=100;

 select *from pedidos;

 insert into articulos values(280,'carpeta oficio',15,50);

 select *from pedidos;

 delete articulos where codigo=234;

 select *from pedidos;

 update articulos set precio=4.8 where codigo=102;

 select *from controlPrecios;

 update articulos set descripcion='compas metal xxx' where codigo=173;

 update articulos set precio=10, stock=55, descripcion='lapices colorx6 Faber' where codigo=104;

 select *from controlPrecios;
 select *from pedidos;

 update articulos set stock=10 where codigo>=104;

 select *from pedidos;

 update articulos set precio=precio+precio*0.1 where codigo>=104;

 select *from controlPrecios;

 delete from articulos where codigo>=104;

 select *from pedidos;

Retornar