Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

materias:3er_taller_pl_pgsql [2012/04/30 08:39]
caolarte creado
materias:3er_taller_pl_pgsql [2012/04/30 08:44] (actual)
caolarte
Línea 55: Línea 55:
 Sería deseable validar algunas reglas para la biblioteca. Por ejemplo, no se puede prestar un libro si no hay ejemplares disponibles: Sería deseable validar algunas reglas para la biblioteca. Por ejemplo, no se puede prestar un libro si no hay ejemplares disponibles:
  
-    -- Esta función valida que del libro que se va a prestar hay ejemplares disponibles.  
    CREATE OR REPLACE FUNCTION check_libros_disponibles() RETURNS TRIGGER AS $$    CREATE OR REPLACE FUNCTION check_libros_disponibles() RETURNS TRIGGER AS $$
      DECLARE      DECLARE
        NUMDISP INT; -- NUMERO DE EJEMPLARES DISPONIBLES        NUMDISP INT; -- NUMERO DE EJEMPLARES DISPONIBLES
      BEGIN         BEGIN   
-      -- LOS PRESTAMOS QUE SE INSERTAN COMO ANULADOS NO SE VALIDAN +          IF NEW.ANULADA=TRUE THEN  -- LOS PRESTAMOS QUE SE INSERTAN COMO ANULADOS NO SE VALIDAN
-          IF NEW.ANULADA=TRUE THEN +
   RETURN NEW;   RETURN NEW;
    ELSE    ELSE
-      SELECT EJEMPLARES-PRESTADOS INTO NUMDISP FROM LIBROS WHERE ID = NEW.LIB_ID FOR UPDATE;+               SELECT EJEMPLARES-PRESTADOS INTO NUMDISP FROM LIBROS WHERE ID = NEW.LIB_ID FOR UPDATE;
  IF NUMDISP >0 THEN  IF NUMDISP >0 THEN
  UPDATE LIBROS SET PRESTADOS = PRESTADOS+1 WHERE ID = NEW.LIB_ID;  UPDATE LIBROS SET PRESTADOS = PRESTADOS+1 WHERE ID = NEW.LIB_ID;
Línea 76: Línea 74:
    $$ LANGUAGE plpgsql;    $$ LANGUAGE plpgsql;
  
-CREATE TRIGGER PRESTAMOS_NUM_EJEMPLARES_TRG +   CREATE TRIGGER PRESTAMOS_NUM_EJEMPLARES_TRG 
-  BEFORE INSERT ON PRESTAMOS +      BEFORE INSERT ON PRESTAMOS 
-      FOR EACH ROW EXECUTE PROCEDURE check_libros_disponibles();+         FOR EACH ROW EXECUTE PROCEDURE check_libros_disponibles();
  
 Ahora cada que se presta un libro se disminuye el número de ejemplares disponibles: Ahora cada que se presta un libro se disminuye el número de ejemplares disponibles:
-bd1214=> select * from libros; +   bd1214=> select * from libros; 
- id | titulo  | ejemplares | prestados  +    id | titulo  | ejemplares | prestados  
-----+---------+------------+----------- +   ----+---------+------------+----------- 
-  1 | LIBRO 1 |          3 |         0 +     1 | LIBRO 1 |          3 |         0 
-  2 | LIBRO 2 |          4 |         0 +     2 | LIBRO 2 |          4 |         0 
-  3 | LIBRO 3 |          1 |         0 +     3 | LIBRO 3 |          1 |         0 
-  4 | LIBRO 4 |          1 |         0 +     4 | LIBRO 4 |          1 |         0 
-(4 filas)+   (4 filas)
  
-INSERT INTO PRESTAMOS (LIB_ID,USR_ID) VALUES (2,3); +   INSERT INTO PRESTAMOS (LIB_ID,USR_ID) VALUES (2,3); 
-INSERT INTO PRESTAMOS (LIB_ID,USR_ID) VALUES (3,1); +   INSERT INTO PRESTAMOS (LIB_ID,USR_ID) VALUES (3,1); 
-bd1214=> SELECT * FROM LIBROS; +    
- id | titulo  | ejemplares | prestados  +   bd1214=> SELECT * FROM LIBROS; 
-----+---------+------------+----------- +    id | titulo  | ejemplares | prestados  
-  1 | LIBRO 1 |          3 |         0 +   ----+---------+------------+----------- 
-  4 | LIBRO 4 |          1 |         0 +     1 | LIBRO 1 |          3 |         0 
-  2 | LIBRO 2 |          4 |         1 +     4 | LIBRO 4 |          1 |         0 
-  3 | LIBRO 3 |          1 |         1+     2 | LIBRO 2 |          4 |         1 
 +     3 | LIBRO 3 |          1 |         1
  
 Además, no se puede prestar más ejemplares del LIBRO 3: Además, no se puede prestar más ejemplares del LIBRO 3:
-bd1214=> INSERT INTO PRESTAMOS (LIB_ID,USR_ID) VALUES (3,1); + 
-ERROR:  LIBROS NO DISPONIBLES+   bd1214=> INSERT INTO PRESTAMOS (LIB_ID,USR_ID) VALUES (3,1); 
 +   ERROR:  LIBROS NO DISPONIBLES
  
 Para evitar fraudes, podríamos también validar que no se pueden borrar registros de la tabla prestamos: Para evitar fraudes, podríamos también validar que no se pueden borrar registros de la tabla prestamos:
  
-CREATE OR REPLACE FUNCTION PRES_DELETE_ERROR() RETURNS TRIGGER AS $$ +   CREATE OR REPLACE FUNCTION PRES_DELETE_ERROR() RETURNS TRIGGER AS $$ 
-  BEGIN +     BEGIN 
- RAISE EXCEPTION 'NO SE PUEDEN BORRAR REGISTROS DE ESTA TABLA. INTENTE ANULAR EL PRESTAMO'; +   RAISE EXCEPTION 'NO SE PUEDEN BORRAR REGISTROS DE ESTA TABLA. INTENTE ANULAR EL PRESTAMO'; 
-  END; +     END; 
-$$ LANGUAGE plpgsql;+   $$ LANGUAGE plpgsql;
  
  
  
-CREATE TRIGGER PRES_DELETE_ERROR_TRG +   CREATE TRIGGER PRES_DELETE_ERROR_TRG 
-  BEFORE DELETE ON PRESTAMOS +     BEFORE DELETE ON PRESTAMOS 
-      FOR EACH ROW EXECUTE PROCEDURE PRES_DELETE_ERROR();+         FOR EACH ROW EXECUTE PROCEDURE PRES_DELETE_ERROR();
  
  
 Por ejemplo: Por ejemplo:
-bd1214=> DELETE FROM PRESTAMOS WHERE ID = 1; +   bd1214=> DELETE FROM PRESTAMOS WHERE ID = 1; 
-ERROR:  NO SE PUEDEN BORRAR REGISTROS DE ESTA TABLA. INTENTE ANULAR EL PRESTAMO+   ERROR:  NO SE PUEDEN BORRAR REGISTROS DE ESTA TABLA. INTENTE ANULAR EL PRESTAMO
  
 Cuando se anula un préstamo, debemos devolver el libro: Cuando se anula un préstamo, debemos devolver el libro:
  
-CREATE OR REPLACE FUNCTION ANULAR_PRESTAMO() RETURNS TRIGGER AS $$ +   CREATE OR REPLACE FUNCTION ANULAR_PRESTAMO() RETURNS TRIGGER AS $$ 
-  BEGIN +     BEGIN 
-   -- SE ESTA ANULANDO UN PRESTAMO +          IF (NEW.ANULADA=TRUE AND OLD.ANULADA=FALSE) THEN   -- SE ESTA ANULANDO UN PRESTAMO 
-          IF (NEW.ANULADA=TRUE AND OLD.ANULADA=FALSE) THEN  +     UPDATE LIBROS SET PRESTADOS = PRESTADOS -1 WHERE ID = NEW.LIB_ID; 
-   UPDATE LIBROS SET PRESTADOS = PRESTADOS -1 WHERE ID = NEW.LIB_ID; +   RETURN NEW; 
- RETURN NEW; +     ELSE 
-   ELSE +   IF (NEW.ANULADA=FALSE AND OLD.ANULADA=TRUE)  THEN 
- IF (NEW.ANULADA=FALSE AND OLD.ANULADA=TRUE)  THEN +   RAISE EXCEPTION 'NO ES POSIBLE CAMBIAR EL ESTADO DEL PRESTAMO'; 
- RAISE EXCEPTION 'NO ES POSIBLE CAMBIAR EL ESTADO DEL PRESTAMO'; +   END IF; 
- END IF; +             END IF; 
-          END IF; +      RETURN NEW; 
-   RETURN NEW; +     END; 
-  END; +   $$ LANGUAGE plpgsql;
-$$ LANGUAGE plpgsql;+
  
  
 +=== Ejercicios ===
  
-Ejercicios: +   * Adicione un trigger que cuando se devuelva el libro (i.e., se actualiza la fecha de devolución), se disminuya el número de libros prestados.  
- 1) Adicione un trigger que cuando se devuelva el libro (se actualice la fecha de devolución), se disminuya el número de libros prestados.  +   * Cree una tabla MULTAS(id, usr_id, numdias, pago) donde PAGO es un booleano que determina si ya se pagó la multa o no.  
- 2) Cree una tabla MULTAS(id, usr_id, numdias, pago) donde PAGO es un booleano que determina si ya se pagó la multa o no.  +   * Modifique el trigger del primer ejercicio para que adicione un registro a la tabla MULTAS si el usuario devolvió el libro después de los días a los que tiene derecho según su TIPO. 
- 3) Modifique el trigger del primer ejercicio para que adicione un registro a la tabla MULTAS si el usuario devolvió el libro después de los días a los que tiene derecho según su TIPO. +
  
 
materias/3er_taller_pl_pgsql.txt · Última modificación: 2012/04/30 08:44 por caolarte
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki