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.

<strong>de</strong> Borrado y en <strong>la</strong> <strong>de</strong> Actualización (ver mása<strong>de</strong><strong>la</strong>nte) por los triggers.Otra observación interesante es que v<strong>de</strong>l comotab<strong>la</strong>, ya tiene su propio OID, por ello es necesarioque su único campo, que contiene los OIDs <strong>de</strong> <strong>la</strong>sfi<strong>la</strong>s borradas/modificadas, tenga un nombredistinto <strong>de</strong> OID. En nuestro cado hemos elegidocomo nombre DOID, que también se utiliza en <strong>la</strong>sReg<strong>la</strong>s <strong>de</strong> Borrado y Actualización.Reg<strong>la</strong> <strong>de</strong> actualización:Implementa los Casos 3 y 5 <strong>de</strong>l apartadoanterior.CREATE RULE versionClientes_upd ASON UPDATE TO versionClientesDO INSTEAD(//Caso 3INSERT INTO vadd_CLIENTES(CIF, nombre, telefono)select NEW.CIF, NEW.nombre, etc…FROM ClientesWHERE old._OID = Clientes.OID;INSERT INTO v<strong>de</strong>l_Clientes(DOID)SELECT oid FROM ClientesWHERE old._oid = Clientes.oid;//Caso 5UPDATE vadd_ClientesSET CIF=NEW.CIF, nombre=NEW.nombre,telefono=NEW.telefonoWHERE vadd_Clientes.oid=OLD._oid;);Ilustración 4. Reg<strong>la</strong> <strong>de</strong> ActualizaciónLa implementación mostrada sólo concierne auna <strong>de</strong> <strong>la</strong>s tab<strong>la</strong>s y a uno <strong>de</strong> los usuarios. Para queel entorno sea eficaz, <strong>de</strong>berá <strong>de</strong> crearautomáticamente <strong>la</strong>s vistas y triggerscorrespondientes para cada alumno y versión <strong>de</strong>tab<strong>la</strong> <strong>de</strong>l profesor. Este proceso se pue<strong>de</strong>automatizar a través <strong>de</strong> scripts <strong>de</strong>l sistemaoperativo que consulten el catálogo <strong>de</strong> <strong>la</strong> base <strong>de</strong>datos <strong>de</strong>l profesor. Estos scripts se ejecutarían aldar <strong>de</strong> alta a cada usuario alumno, al principio <strong>de</strong>lcurso.Así, para una tab<strong>la</strong> Clientes <strong>de</strong>l profesor, estescript crearía automáticamente <strong>la</strong> versiónClientes_1 al dar <strong>de</strong> alta al alumno 1, Clientes_2 aldar <strong>de</strong> alta el alumno 2, etc… De esta forma e<strong>la</strong>lumno n pue<strong>de</strong> disponer <strong>de</strong> <strong>la</strong> versión <strong>de</strong>lprofesor –Clientes- y <strong>de</strong> <strong>la</strong> suya propia –Clientes_n.Un problema que hemos pasado por alto es el<strong>de</strong> <strong>la</strong>s restricciones. En principio, parece que paraque <strong>la</strong>s versiones tengan <strong>la</strong>s mismas restriccionesque sus tab<strong>la</strong>s base, basta con volver a <strong>de</strong>c<strong>la</strong>rardichas restricciones en vadd. Sin embargo, esto noes así para <strong>la</strong>s restricciones SQL <strong>de</strong> PRIMARYKEY, UNIQUE y FOREIGN KEY. Las c<strong>la</strong>vesprimarias y candidatas han <strong>de</strong> mantener suunicidad no sólo en <strong>la</strong> tab<strong>la</strong> base y en vadd porseparado, sino que <strong>de</strong>ben tener valores únicos para<strong>la</strong> unión <strong>de</strong> <strong>la</strong>s extensiones <strong>de</strong> ambas tab<strong>la</strong>s. Con<strong>la</strong>s c<strong>la</strong>ves foráneas ocurre lo mismo. Si porejemplo una fi<strong>la</strong> <strong>de</strong> <strong>la</strong> tab<strong>la</strong> Pedidos referencia a <strong>la</strong>tab<strong>la</strong> Clientes, no basta con <strong>de</strong>c<strong>la</strong>rar quevadd_Pedidos referencie a vadd_Clientes, pues<strong>de</strong>be po<strong>de</strong>r referenciar a<strong>de</strong>más a un cliente <strong>de</strong> <strong>la</strong>tab<strong>la</strong> base Cientes.La solución a estos problemas es contro<strong>la</strong>r <strong>la</strong>svio<strong>la</strong>ciones <strong>de</strong> estas restricciones, nuevamente através <strong>de</strong> triggers <strong>de</strong>c<strong>la</strong>rados, en esta ocasión,sobre eventos en vadd. En el caso <strong>de</strong> <strong>la</strong>s c<strong>la</strong>vesforáneas los triggers contro<strong>la</strong>ran que <strong>la</strong>sinserciones y modificaciones <strong>de</strong> Pedidos y <strong>la</strong>seliminaciones <strong>de</strong> Clientes no <strong>de</strong>jan a los pedidossin cliente asociado. Esta implementaciónmediante triggers es muy flexible, permitiendoimplementar distintas semánticas (rechazos,acciones en cascada etc.). En el caso <strong>de</strong> <strong>la</strong>s c<strong>la</strong>vesprimarias y candidatas, los triggers contro<strong>la</strong>ránque <strong>la</strong>s inserciones y modificaciones <strong>de</strong> <strong>la</strong> c<strong>la</strong>ve envadd no generen duplicados.Todos estos triggers también pue<strong>de</strong>n sercreados directamente en el script <strong>de</strong> creación <strong>de</strong>usuario. Aunque <strong>la</strong>s ma<strong>la</strong>s noticias son que todosestos controles por trigger acaban por <strong>de</strong>gradar elrendimiento <strong>de</strong>l sistema, <strong>la</strong>s buenas noticias sonque con el escaso número <strong>de</strong> fi<strong>la</strong>s que suelen tener<strong>la</strong>s bases <strong>de</strong> datos <strong>de</strong> docencia, este efecto no esapreciable.Parte <strong>de</strong> <strong>la</strong> materia <strong>de</strong> SQL interactivo, es eltrabajo con vistas actualizables. Un problema <strong>de</strong> <strong>la</strong>versión actual <strong>de</strong> PostgreSQL es que <strong>la</strong>s vistas que<strong>de</strong>finan los alumnos no son actualizables, a no serque se especifiquen vía triggers, <strong>la</strong>s accionesasociadas a <strong>la</strong> propagación <strong>de</strong> <strong>la</strong>s modificacionessobre <strong>la</strong> vista a <strong>la</strong>s tab<strong>la</strong>s base. Sin embargo, este

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

Saved successfully!

Ooh no, something went wrong!