12.07.2015 Views

VIII Jornadas de Enseñanza Universitaria de la Informática Cáceres ...

VIII Jornadas de Enseñanza Universitaria de la Informática Cáceres ...

VIII Jornadas de Enseñanza Universitaria de la Informática Cáceres ...

SHOW MORE
SHOW LESS
  • No tags were found...

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

CREATE VIEW VersionClientes AS(SELECT OID as _OID, CIF, Nombre,etc…FROM ClientesWHERE NOT EXISTS(SELECT * FROM v<strong>de</strong>lWHERE oid=Clientes.oid)UNION(SELECT OID as _OID, CIF, Nombre,etc…FROM Clientes);Ilustración 1. Vista que implementa una versión <strong>de</strong> <strong>la</strong>tab<strong>la</strong> Clientes.Mediante triggers se contro<strong>la</strong> <strong>la</strong>actualización <strong>de</strong> esta vista haciendo:Caso 1. Que cuando el alumno realice unainserción sobre <strong>la</strong> versión, el sistemarealmente lo que hace es insertar <strong>la</strong> fi<strong>la</strong> sobrevadd. Ver Ilustración 2.Caso 2. Cuando se realiza una eliminación <strong>de</strong>una fi<strong>la</strong> <strong>de</strong> <strong>la</strong> tab<strong>la</strong> base, lo que se hacerealmente es apuntar esa fi<strong>la</strong> como borrada env<strong>de</strong>l. Ver Ilustración 3.Caso 3. Si se modifica una fi<strong>la</strong> <strong>de</strong> <strong>la</strong> tab<strong>la</strong> basepor un alumno, por primera vez, se tratacomo una baja <strong>de</strong> <strong>la</strong> fi<strong>la</strong> con los valores viejos(<strong>la</strong> fi<strong>la</strong> antes <strong>de</strong> <strong>la</strong> modificación es registradaen v<strong>de</strong>l), más un alta <strong>de</strong> <strong>la</strong> misma con losvalores nuevos (<strong>la</strong> fi<strong>la</strong> que se obtiene <strong>de</strong>spués<strong>de</strong> <strong>la</strong> modificación es apuntada en vadd). VerIlustración 4.Caso 4. Si se elimina una fi<strong>la</strong> que se hayainsertado o modificado <strong>de</strong>s<strong>de</strong> <strong>la</strong> versión (estáen vadd), se elimina directamente <strong>de</strong> vadd.Ver Ilustración 3.Caso 5. Si se modifica una fi<strong>la</strong> insertada por e<strong>la</strong>lumno en <strong>la</strong> versión, o una fi<strong>la</strong> <strong>de</strong> <strong>la</strong> tab<strong>la</strong>base ya modificada por el alumno en <strong>la</strong>versión (está en vadd),simplemente se hace elcambio directamente sobre <strong>la</strong> fi<strong>la</strong> en vadd.Ver Ilustración 4.El tipo <strong>de</strong> triggers que se necesitan para haceresta implementación necesitan el modo <strong>de</strong> disparoinstead, que permite hacer que <strong>la</strong> acción <strong>de</strong>ltrigger se ejecute sustituyendo al evento que lodispara. Es <strong>de</strong>cir, si el evento es una operación <strong>de</strong>modificación (p.e. una inserción) sobre <strong>la</strong> vista,esta operación no se ejecuta, y en su lugar seejecuta <strong>la</strong> acción especificada en el trigger (p.e. <strong>la</strong>inserción sobre vadd). Los triggers instead noestán disponibles en <strong>la</strong> mayoría <strong>de</strong> los sistemasactuales, lo que limita el número <strong>de</strong> gestores en elque se pue<strong>de</strong> aplicar <strong>la</strong> aproximación <strong>de</strong> versiones<strong>de</strong> tab<strong>la</strong>s.2. Implementación <strong>de</strong> <strong>la</strong> Aproximación<strong>de</strong> Versiones en PostgreSQLEn el presente apartado se muestra <strong>la</strong>implementación en PostgreSQL.Reg<strong>la</strong> <strong>de</strong> inserción:Implementa el Caso 1 <strong>de</strong>l apartado anterior.CREATE RULE versionClientes_ins ASON INSERT TO versionClientesDO INSTEAD//Caso 1INSERT INTO vadd_ClientesCIF, nombre, etc…) VALUES(NEW.CIF, NEW.nombre, etc…);Ilustración 2. Reg<strong>la</strong> <strong>de</strong> InserciónReg<strong>la</strong> <strong>de</strong> borrado:Implementa los Casos 2 y 4 <strong>de</strong>l apartadoanterior.CREATE RULE versionClientes_<strong>de</strong>l ASON DELETE TO versionClientesDO INSTEAD (//Caso 2INSERT INTO v<strong>de</strong>l_Clientes(DOID)SELECT Clientes.OID FROM ClientesWHERE OLD._OID = Clientes.OIDAND OLD._OID NOT IN(SELECT DOID FROM v<strong>de</strong>l_Clientes);//Caso 4DELETE FROM vadd_ClientesWHERE vadd_Clientes.oid = OLD._oid;);Ilustración 3. Reg<strong>la</strong> <strong>de</strong> BorradoUn inconveniente <strong>de</strong> <strong>la</strong> implementaciónPostgreSQL es que <strong>la</strong>s vistas no tienen OID. Nisiquiera tienen el OID <strong>de</strong> <strong>la</strong> tab<strong>la</strong> <strong>de</strong> <strong>la</strong> que se<strong>de</strong>rivan, por lo que es necesario <strong>de</strong>finir un campoen <strong>la</strong> vista que <strong>de</strong>liberadamente contenga el valor<strong>de</strong>l OID <strong>de</strong> <strong>la</strong>s fi<strong>la</strong>s que <strong>la</strong> componen (el campo_OID en Ilustración 1). Este campo lo l<strong>la</strong>maremos_OID y como se pue<strong>de</strong> ver es utilizado en <strong>la</strong> Reg<strong>la</strong>

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!