1.264 Tema 8 SQL (cont.) ODBC Subconsultas • Las subconsultas de SQL nos permiten utilizar los resultados de una consulta como parte de otra. Subconsultas: – A menudo, constituyen un modo natural de escribir una instrucción. – Permiten dividir una consulta en partes y reconstruirla. – Permite realizar algunas consultas que de otro modo no se podrían llevar a cabo. Subconsultas • Obtener un listado de las oficinas cuyo cupo de ventas excede la suma de los cupos individuales de los vendedores: – SELECT Ciudad FROM Oficinas WHERE Objetivo > ??? – ??? es “la suma de los cupos de los vendedores" o: • SELECT SUM(Cupo) FROM RepVentas WHERE OfiRep = NumOfi • Al combnarlas se obtiene lo siguiente: – SELECT Ciudad FROM Oficinas WHERE Objetivo > (SELECT SUM(Cupo) FROM RepVentas WHERE OfiRep = NumOfi); Subconsultas • Las subconsultas siempre figuran como parte de las cláusulas WHERE (o HAVING). • Una subconsulta sólo puede dar lugar a una columna de datos como resultado: – En la subconsulta SELECT sólo puede haber un campo. • No permite ORDER BY; no tendría sentido. • Tampoco admite UNION; sólo se permite un SELECT. • A menudo, hace referencia al nombre de una columna de una tabla principal de la subconsulta: – Esto determina la fila de la tabla principal para la que se está ejecutando la subconsulta. Se conoce como referencia exterior. – En nuestro ejemplo, es OfiRep= NumOfi de la tabla Oficinas. Vistas • Tablas virtuales que muestran los datos a los usuarios de forma no normalizada. • NO hay distintas copias de los datos; hacen referencia a los datos de las tablas subyacentes. • La base de datos almacena la definición de las vistas. Los datos se actualizan cuando se actualizan las tablas subyacentes. • Ventajas: – Diseñadas para cubrir necesidades específicas de los usuarios. – Las consultas son mucho más simples para los usuarios en vistas diseñadas para ellos. – Seguridad: sólo permite acceder a los datos de las vistas. – Independencia: evita que el usuario o el programa modifiquen las tablas subyacentes. Vistas • CREATE VIEW PedidosClientes AS SELECT NumClien, Empresa, Nombre, NumPedido, Prod, Cant, Im porte FROM Clientes, RepVentas, Pedidos WHERE RepClien = NumRep AND NumClien = Clien (SQL estándar) Pedidos NumPedido 88 99 Clien Prod 211 ABAC 522 CDE Cant Importe 7 31.000$ 2 4.000$ Clientes NumClien Empresa RepClien LimitCredit 211 QGG Co 89 50.000$ 322 DBO Co 89 40.000$ PedidosClientes NumClien Empresa RepVentas NumRep Nombre OfiRep Cupo Ventas 22 100.000$ 0$ 53 Bill Smith 89 Jen Smith 44 50.000$ 130.000$ 211 QGC Co 322 DBO Co Nombre Jen Smith Jen Smith NumPedido Prod Cant Importe 88 ABAC 99 CDE 7 31.000$ 2 4.000$ Detalles de las vistas • Posibilidad de modificar las vistas e invalidarlas: – P. ej.: vista de libros de menos de 5 dólares. – ¿Qué sucede si actualizamos el precio de un libro a 5,99 dólares a través de la vista? ¡Desaparece! – Esto se evita añadiendo: WITH CHECK OPTION • No se pueden actualizar todas las vistas. Una vista es de sólo lectura si: – – – – – DISTINCT forma parte de la instrucción SELECT. Contiene expresiones (medias, totales, etc.). Hace referencia a vistas que no son actualizables. Contiene claúsulas GROUP BY o HAVING. En ocasiones: hace referencia a más de una tabla (fracaso del objetivo). Vistas en MS Access • Las vistas se construyen y almacenan como consultas: – Construir la instrucción SELECT, incluyendo las relaciones (JOINS) entre las tablas en caso necesario. – Guardar la consulta, dándole un nombre. – A continuación, se puede realizar una consulta sobre la consulta anterior (vista), así como utilizarla como fuente de datos de páginas Web, a modo de tabla. – Utilizaremos las vistas (consultas) en FrontPage, dado que presenta algunos errores con respecto a las relaciones (JOINS). Ejercicios de repaso • Mostrar todos los clientes con pedidos o límites de crédito > 50.000 dólares. – ¿Es posible listar al cliente una sola vez? • Eliminar a los representantes de las oficinas de ventas de Nueva York (NY) con cupos de más de 40.000 dólares. – Consejo: recuerde que debe eliminarlos a partir de (FROM) una sola tabla. Utilice una subconsulta. Soluciones • Mostrar todos los clientes con pedidos o límites de crédito > 50.000 dólares: – ¿Es posible listar al cliente una sola vez, con los límites de crédito y los importes de los pedidos? Sí, pero no es fácil. – SELECT DISTINCT NumClien FROM Clientes, Pedidos WHERE NumClien = Clien AND (LimitCredit>50000 OR Importe>50000); • Eliminar a los representantes de las oficinas de ventas de Nueva York (NY) con cupos de más de 40.000$: – Consejo: recuerde que debe eliminarlos a partir de (FROM) una sola tabla. Utilice una subconsulta. – DELETE * FROM RepVentas WHERE NumRep IN (SELECT NumRep FROM RepVentas, Oficinas WHERE NumOfi = OfiRep AND Cupo>40000 AND Estado="NY“); Índices • Un índice es un objeto de datos independiente presente en la base de datos que ordena las filas de la tabla para facilitar una vista rápida: – Cada índice de cada tabla es un objeto independiente. – Las claves primarias y secundarias se indexan automáticamente. • Acceso rápido a columnas indexadas: – Cada vez que se actualiza una fila, se actualiza el índice, por lo que el uso de índices ralentiza las operaciones de modificación, inserción y eliminación. – En la práctica, se deben utilizar un máximo de 3 ó 4 índices por tabla. En caso de necesitar más, se deben añadir y eliminar según sea necesario. – Si la base de datos se usa, en su mayoría, para consulta (lectura), es recomendable utilizar muchos índices, pues se agiliza el rendimiento. – Si la base de datos se actualiza con frecuencia, conviene añadir el menor número de índices posible. • Índices agrupados (clustered): – Ordenan las filas físicamente según un solo índice con el fin de maximizar la velocidad de acceso al disco. Ejemplo de índices • Base de datos de clientes: – El ID de cliente es clave primaria. – También queremos realizar búsquedas por: • • • • Nombre del cliente (último, primero). Ciudad/Estado. Código postal. Dirección. – Indexar los campos nombre, ciudad/estado, CP y dirección: • Cuatro índices: ralentiza la inserción, actualización y eliminación de datos, pero agiliza la consulta de la base de datos. • Si la base de datos de clientes es bastante estable, está bien. – Seguir la misma lógica para el catálogo de piezas, la facturación de materiales, etc. • Los motores de búsqueda de Internet utilizan "motores de recuperación de texto": – Indexan todas las palabras de la base de datos; cuentan las coincidencias y filas iguales. Los últimos avances (frecuencia de los enlaces, uso…) posibilitan esto. Seguridad • Opciones de seguridad: – Utilizar el login/contraseña del sistema operativo para identificar al usuario (menor seguridad): • El usuario puede acceder a todas las bases de datos y a todas las tablas. – Utilizar un login/contraseña para la base de datos (mayor seguridad): • Se restringe el acceso a otras bases de datos y tablas, pero permite utilizar todas las aplicaciones. – Seguridad a nivel de aplicación (aún más seguro, pero difícil de administrar): • Las aplicaciones deben consultar una base de datos común para ver si el usuario está o no autorizado; es más centralizado que de BD a BD. – Seguridad a nivel de red (lo más seguro, apenas viable hoy en día): • Utiliza una infraestructura de clave pública (PKI) y de directorios, que consiste en la encriptación. • Es un elemento de vanguardia: caro y complicado. • Clases de usuarios: superusuario (DBA), propietario y usuario. • Asignación de privilegios sobre la base de datos (permisos): – GRANT y REVOKE. P. ej.: • GRANT ALL ON NombreTabla TO PUBLIC WITH GRANT OPTION • En las instrucciones GRANT y REVOKE es importante el orden. El último es el que domina. – MS Access no soporta esto. Transacciones • Un grupo de operaciones se debe tratar a menudo como una unidad atómica: – Iniciar la transacción: • Insertar CabeceraPedido. • Mientras hay otros DetallesPedido (elementos de la línea): – Seleccionar la pieza. – Actualizar el inventario de las piezas. – Insertar la fila DetallesPedido. – Completar la transacción. • Propiedades de la transacción (ACID): – A – atómica- todo o nada (recuperación). – C – coherencia – de un estado de coherencia a otro (integridad). – I – aislamiento – no permite que otra transacción visualice los cambios no realizados (concurrencia). – D – perdurable – una vez realizados, los cambios son permanentes. Transacciones • Las bases de datos multiusuario tienen otros problemas relacionados con las transacciones. • Dos acciones de la base de datos entran en conflicto si una o ambas son operaciones escritas. – Actualizaciones perdidas: • Hay 7 piezas en el inventario. • Las transacciones 1 y 2 leen simultáneamente 7 como la cantidad actual. • La transacción 1 acaba primero, añade 3 piezas y escribe 10 en la cantidad. • La transacción 2 acaba después, elimina 5 piezas y escribe 2 en la cantidad. – Cambios no realizados: • La transacción 1 añade 3 piezas y escribe 10 en la cantidad. • La transacción 2 lee 10 como cantidad. • La transacción 1 se cancela (vuelve atrás) y deja a la transacción 2 con datos erróneos. Transacciones • Las bases de datos utilizan protecciones para las concurrencias. Un esquema sencillo es el siguiente: – Las escrituras obtienen protección exclusiva sobre un registro, evitando otras lecturas o escrituras. – Las lecturas obtienen protecciones no exclusivas, que permiten otras lecturas, pero evitan que una escritura obtenga protección exclusiva. • Las bases de datos utilizan archivos log para la recuperación: – Además de realizarse todos los cambios en la base de datos, éstos se escriben en un archivo log (esto es un cuello de botella clave en su arquitectura). – Los cambios no se realizan hasta que se ha escrito el log para lograr un almacenamiento estable: • Por lo general, los cambios se realizan antes de que las tablas se actualicen realmente en el disco. – Si se cancela una modificación, se lee el log para deshacer las transacciones. – Si falla el sistema o el disco, se ejecuta el log desde el último punto de comprobación para restaurar la base de datos. – Desactivar los log durante la carga y la recuperación de datos. Rendimiento • Programas para analizar el rendimiento (desde TPC-A hasta H): – www.tpc.org • Cachés: ¡los discos son lentos! – Almacenar páginas (a menudo 8KB de datos) en la memoria de acceso rápido. • Optimizadores de consultas: – Hay muchas formas de establecer relaciones; depende del tamaño de las tablas, las características de las claves (longitud, "unicidad"), etc. • Estadísticas de los índices: – UPDATE STATISTICS (actualizar estadísticas). API de la conectividad abierta de bases de datos (ODBC) • Etapa inicial: SQL incrustado (ESQL) en cada servidor de bases de datos (a principios de la década de los 90). – Compilado en aplicaciones de servidor, no puede ser modificado por el usuario final. – No funciona bien con múltiples bases de datos. • Segunda etapa: aparecen las aplicaciones cliente-servidor (a finales de los 90): – Cada distribuidor de bases de datos ofrecía una interfaz de programación de aplicaciones (API) que permitía que los programas cliente realizaran consultas a las bases de datos. – La API de cada distribuidor era diferente, por supuesto. • Etapa actual: ODBC (desde finales de los 90 hasta ahora): – La API común de Windows es capaz de acceder a la mayoría de las bases de datos: • Oracle, SQL Server, Sybase, DB2 o Informix. – JDBC es el equivalente para el entorno Java. API ODBC • • • • • • • La librería de las llamadas a la función ODBC para conectar una aplicación (Web, Windows u otra) a un SGBD, ejecuta sentencias SQL y recupera los resultados. Sintaxis SQL basada en el estándar SQL-92. Conjunto de códigos de errores estándar. Modo estándar de conectar y acceder a un SGBD. Representación estándar de los tipos de datos. Métodos estándar para la conversión de tipos de datos. ODBC tiene una funcionalidad de núcleo, de capa 1 y de capa 2 para entenderse con interfaces sencillas y sofisticadas. Estas características ayudan a superar muchos de los problemas del SQL no estándar mencionados en el tema anterior. Arquitectura ODBC Arquitectura ODBC • Aplicación (Windows o Web): – Lleva a cabo el procesamiento. – Llama a las funciones ODBC para transmitir las sentencias SQL y recupera los resultados. • Administrador de controladores: – Carga y descarga los controladores solicitados por la aplicación. – Procesa algunas llamadas a las funciones ODBC (supervisor). • Controlador ODBC: – Procesa la mayoría de las llamadas a las funciones ODBC. – Envía las peticiones SQL a fuentes de datos específicas: • Modifica la petición de la aplicación para adecuarla a la sintaxis SQL de la fuente de datos. – Devuelve los resultados a la aplicación. • Fuente de datos. Aplicación • Solicita la conexión o establecimiento de sesión con la fuente de datos. • Envía la petición SQL a la fuente de datos. • Ubica las zonas de almacenamiento y define los formatos de los resultados de las peticiones SQL. • Solicita los resultados. • Procesa los datos y los errores. • Si la aplicación requiere un proceso de transacción, solicita una confirmación o cancelación para aceptar o rechazar los resultados de la transacción. • Una vez completado, finaliza la conexión a la fuente de datos. Administrador de controladores • El administrador de controladores es una librería de enlaces dinámicos (DLL) ofrecida por Microsoft. • Carga y descarga los controladores ODBC. • Cuando la aplicación solicita una lista con los nombres de las fuentes de datos instaladas, el administrador de controladores recupera la información del registro y devuelve la lista. • Procesa las llamadas de inicialización y las validaciones de parámetros y secuencia para las llamadas a la función ODBC. Controlador • El controlador es una DLL (librería), escrita por Microsoft • • • • o por el distribuidor de la base de datos, que implementa las llamadas a la función ODBC. Conversión de datos a los estándares ODBC. Conversión del código de errores a los estándares ODBC. Manejo de la transacción. Acceso a archivos externos al SGBD como son los archivos de Excel o los de texto: – Soporte limitado para SQL: sólo SELECT, INSERT, CREATE y DROP. • Amplia gama de funcionalidad en diferentes controladores: – Compueban los niveles de conformidad: ODBC y SQL (¡no es igual!). – La API de ODBC proporciona funciones para determinar las capacidades.