arceta grupo editorial
r.
«I! ¡TV1!
Iván López Montalbán M Jesús
Castellano Pérez
John Ospino Rivas
M Ap y
Web
DAW
DAM y
Bases de
Datos
Desa de
Supe en
Técnico arceta
grupoeditorial
Iván López Montalbán M3 Jesús Castellano Pérez John Ospino Rivas ISBN: 978-84-9281-291-2 IBERGARCETA PUBLICACIONES,S.L., Madrid 2011 Edición: 1.° Impresión: 3. N.° de páginas: 328 Formato: 20 x 26 cm
Reservados los derechos para todos los países de lengua española. De conformidad con lo dispuesto en el artículo 270 y siguientes del código penal vigente, podrán ser castigados con penas de multa y privación de libertad quienes reprodujeren o plagiaren, en todo o en parte, una obra literaria, artística o cientíca fijada en cualquier tipo de soporte sin la preceptiva autorización. Ninguna parte de esta publicación, incluido el diseño de la cubierta, puede ser reproducida, almacenada o trasmitida de ninguna forma, ni por ningún medio, sea éste electrónico, químico, mecánico, electro-óptico, grabación, fotocopia o cualquier otro, sin la previa autorización escrita por parte de la editorial.
Diríjase a CEDRO (Centro Español de Derechos Reprográcos), obra.
www.cedro.org, si necesita fotocopiar o escanear algún fragmento de esta
COPYRIGHT © 2011 IBERGARCETA PUBLICACIONES, S.L.
[email protected]
Bases de Datos ©Iván
López Montalbán, Ma Jesús Castellano Pérez, John Ospino Rivas
1.° edición, 3.° impresión OI: 0078/2012 ISBN: 978-84-9281-291-2 Deposito Legal: M-33366-2011 Imagen de cubiertazpisotskii ©fotoIia.com
Impresión: PRINT HOUSE,registrada marcaCopiar, deA. S. IMPRESO EN ESPAÑA -PRINTED IN SPAIN
Nota sobre enlaces a páginas web ajenas: Este libro puede incluir referencias a sitios web gestionados por terceros y ajenos a IBERGARCETA PUBLICACIONES,S.L., que se incluyen sólo con nalidad informativa. IBERGARCETA PUBLICACIONES,S.L., no asume ningún tipo de responsabilidad por los daños y perjuicios derivados del uso de los datos personales que pueda hacer un tercero encargado del mantenimiento de las páginas web ajenas a IBERGARCETA PUBLICACIONES, S.L., y del funcionamiento, accesibilidad y mantenimiento de los sitios web no gestionados por IBERGARCETA PUBLICACIONES,S.L., directamente. Las referencias se proporcionan en el estado en que se encuentran en el momento de publicación sin garantías, expresas o implícitas, sobre la información que se proporcione en ellas.
PRÓLOGO Este libro está concebido para formar estudiantes de los ciclos de grado su-
perior DAM (Desarrollo de Aplicaciones Multiplataforma) yDAW
(Desarrollo de
Aplicaciones Web). Más concrementamente, está pensado para cubrir la unidad de competencia UC0026_3, programar bases de datos relacionales mediante el módulo Base de
datos común
a ambos
ciclos formativos.
Desde nuestra experiencia como administradores de bases de datos en empre-
sas multinacionales,como profesoresde educaciónsecundaria (Informática)y como profesores asociadosde universidad, hemos compuesto esta herramienta complementaria a las clases del módulo de formación profesional e indispensable para lectores independientes que quieran convertirse en programadores de bases de datos. El contenido del libro tiene una orientación puramente práctica, con actividades, consejos y ejercicios resueltos en Access, MySQL, Oracle y DB2, que facilitan al profesor del módulo su completo seguimiento. El objetivo del libro no es ser una guía de referencia de un solo SGBD, sino la formación de programadores de bases de datos actualizados, versátiles y competentes. Existe multitud de material disponible para la realización de las prácticas propuestas en el blog bbdd-garceta.blogspot . com.
Índice general 1. Los
sistemas de
almacenamiento de
la información
1.1. Ficheros 1.1.1. de Tipos cheros y formatos .. . .. . . . . .. . .. . . . . . 1.2.
1.1.2. Ficheros
de texto
1.1.3. Ficheros
binarios
Bases de
Datos
1.2.1. Conceptos
. . . . . . . . . . . ..
1.2.2. Estructura
de una
1.2.3. Usos
de las
1.2.4. Evolución 1.3.
Los Sistemas
base de
bases de
datos
. ..
. . . ..
. . . . ..
..
. . . . . . . . . . ..
. . . . .
datos
y tipos de base de datos
Gestores de
Base de
Datos
1.3.1. Concepto de Sistema Gestor de Base de Datos ..
..
1.3.2. Funciones
. ..
de un
SGBD
. . ..
. ..
1.3.3. El lenguaje SQL 1.3.4. Tipos de SGBD . . . . . . . . ..
1.4. Prácticas Resueltas
. . ..
. . . . . ..
Prácticas Propuestas . . . . . .. Resumen .
..
. . . . . . . ..
. ..
. . . ..
. ..
. ..
. . . . ..
..
1.6.
. .
. . . .
. . . . . . . .. ..
. . . . . ..
. ..
..
. . ..
.
..
..
..
.
. . . ..
. ..
. ..
.
. . . . . ..
Test de repaso . .. .. . .. . .. . . . .. . . . .. . . .. Comprueba tu aprendizaje . .. . . . .. .. . .. . . . ..
1.5.
. ..
. . . . . ..
.. . . . . . .. . . .
Bases de
Datos
2.4.1. Generalización y Especialización . . . . . ..
2.5. Construcción de un diagrama E/ R 2.6. El
modelo relacional 2.6.1. Las
. . . ..
relaciones en
2.6.2. Otros
. . . . . .59
. . .. . .. . .. . . . . . . . ..
. . . ..
el modelo
. . ..
. ..
. ..
relacional
. . . . . . . . ..
. . . . . . . ..
conceptos del modelo relacional . . ..
. ..
.64
. . ..
..
62 .65
. . . ..
65
2.7. Transformación de un diagrama E/ R al modelo relacional . . . . . . .67 2.8. Normalización
2.9. Prácticas
. . ..
Resueltas
. . . ..
. . . ..
2.10. Prácticas Propuestas . .. 2.11. Resumen
. . . . ..
. ..
..
..
. . . . ..
. . . . ..
. . .. . ..
. ..
. . . . . ..
. . . ..
. . ..
. . ..
. . . ..
. . ..
..
..
. . . . . . .73
. . . . ..
. ..
. ..
. ..
. . ..
..
77
. . . .81 . . .88
2.12. Test de repaso . . . . . .. . . . . . . . . . . . . . . . .. . . .. . .. 89 2.13. Comprueba tu aprendizaje .. . . . . . . . . . . . . . . . . . . . . . .90 3. Diseño
físico relacional
91
3.1. Notación para la sintaxis . . . .. . . .. . . . . .. . .. . 3.2. Herramientas grácas proporcionadas por los SGBD . . .. 3.2.1. PhpMyAdmin de MySQL .. . . .. . . . .. . . . 3.2.2. Oracle Enterprise Manager yGrid Control . .. . . 3.2.3. DB2
Data Studio
. ..
. . . . . . . . . . . . . . ..
3.3. Intérpretes de comandos de los SGBD . .. . . . .. . . . 3.3.1. MySQL: El cliente de MySQL-Server .. . . . . . 3.3.2. Ejecución de consultas en MySQL .. . . . . . . . 3.3.3. SQL*Plus: El intérprete de comandos de Oracle . 3.3.4. Ejecución de consultas en SQL*Plus .. .. . .. 3.4. El lenguaje de denición de datos . .. . .. . . . . . . . 3.5. Creación
de bases de datos
. . . . . ..
. ..
..
3.5.1. Creación de bases de datos en MySQL 3.5.2. Creación 3.6. Modicación 3.7. Borrado 3.8. Creación
de bases de datos de una
en Oracle
base de datos .
de bases de datos de tablas
. . ..
. .. . . ..
..
de las tablas de
3.8.6. Consulta 3.9. Modicación 3.10. Borrado 3.11. Renombrado
3.12. Prácticas VIII
de tablas
de tablas
Resueltas
. . . . ..
. . . . . ..
..
..
. . ..
..
. ..
..
107
. . .110 . . . .111
. . ..
. . .111
. .113 .. 116 . .117 . .118
. . . . . . . . . .119 . . . ..
..
. ..
. . . . . . . . . . ..
..
. . ..
. . . . . . . ..
. . . . . . ..
.97 .98 .99 . 102 .103 .104
. . . .105
. . . . ..
.. . ..
. . . . . . . . .. . ..
. . .. ..
.92 .93 .93 .94
. . . . . . .105 . ..
. . . . . . . . . . . . . ..
. . . . . ..
. ..
. . ..
de datos
una tabla ..
. .. . .. . .. .. . . . .. . . . . . . .. .. . . . . .. . . . .
. . . . . .. . . . . . . . . .. . . . . . . . .. . . . . tablas para MySQL . .. tablas para Oracle . .. .
una base
de la estructura de de tablas
. . ..
. . . . . ..
3.8.1. Implementación de restricciones 3.8.2. Tipos de Datos . . . . . .. . . 3.8.3. Características de la creación de 3.8.4. Características de la creación de 3.8.5. Consulta
. ..
. . . .
. . . . . .96
. . . . . . ..
. . . . . ..
. ..
. .. . . . .. .. . . . . ..
. . ..
. ..
..
. ..
.119 120
. . .122
. . . . .122
. ..
.123
Índice general 3.13. Prácticas Propuestas .. 3.14. Resumen
. . . . . ..
. . . ..
. ..
..
. ..
. ..
. . . ..
. . . ..
. ..
. . ..
. . . . . . . . . ..
..
. .128
. ..
.130
3.15. Test de repaso .. . . . . . . . . . . . . . .. . . . .. . . . . . . . . .131 3.16. Comprueba tu aprendizaje . .. . . . . . . . .. . . . . . . . . .. . . 132 . Realización
de Consultas
4.1. El lenguaje DML 4.2. La
133
. ..
. . . . . . ..
sentencia SELECT
4.3. Consultas 4.4. Filtros
básicas
. . . . . .. ..
. ..
. ..
. . . . . . . . . ..
. ..
..
. . ..
. ..
. . . . . ..
. . .. 134
. . ..
. ..
. . . ..
. . . . . ..
. ..
. . . . . . . . .135
. . . . . . . ..
4.4.1. Expresiones para ltros
. ..
4.4.2. Construcción
. . . . . . . ..
de ltros
. . ..
..
. . . ..
. ..
. . . .134
. . ..
. . . ..
. . . .137
. . . ..
. . . . . . ..
. .138
. . . . .140
4.4.3. Filtros 4.4.4. Filtros
con operador de pertenencia a conjuntos . . . . . .. .141 con operador de rango . .. . . . . . . .. . . . .. . .142
4.4.5. Filtros
con test
4.4.6. Filtros 4.4.7. Filtros
con test de patrón . . . .. . . . . . . . . . . . . . . .143 por límite de número de registros . . . . . . .. . . . .144
4.5. Ordenación
. ..
4.6. Consultas
de resumen
4.6.1. Filtros
de valor
. . ..
nulo . ..
. . . . . . ..
. . . . ..
. . . . ..
. . ..
de existencia
..
..
. 143
. . . . . .145
. . ..
..
. . . . . . . ..
. . . . . .147
..
. . ..
. . . . . . .. . . ..
4.7.1. Test de Comparación . . .. . . . .. .. 4.7.2. Test de pertenencia a conjunto .. . .. 4.7.3. Test
. ..
..
. ..
. ..
..
..
..
. ..
. ..
. . ..
..
..
..
de Grupos . . . ..
4.7. Subconsultas
. . . . . ..
..
. . . .151
. . . . ..
. ..
.152
. . . .. . . .. . . .153 . .. . . . .. . . . .154
. . . . . ..
. . . . . . .154
4.7.4. Test cuanticados ALL
y ANY
. . . . . . . . . . . . . . . . .156
4.7.5. Subconsultas
. . . ..
. . . . ..
4.8. Consultas
anidadas
multitabla
. ..
. . . . . . . . ..
..
. . . . . . . . . . .157 . . . . . . . . . . . .158
4.8.1. Consultas multitabla SQL 1 . . . . .. . . . . . .. . . . . . .159 4.8.2. Consultas multitabla SQL 2 . . .. . . . . .. .. . . . . .. .162 4.9. Consultas
reexivas
4.10. Consultas
con tablas
4.11. Prácticas
Resueltas .
. . ..
derivadas .
4.12. Prácticas Propuestas . 4.13. Resumen
. ..
..
. .. ..
. .. ..
. . . . ..
. . . . . . . . . ..
. . . ..
. . . . . . . . ..
..
. . . . ..
. . . . . . . . . . . . ..
. . .. . ..
..
. . . . .. . . . ..
..
..
.169
. ..
170
. . . . .172
. . . . . . . . . . . ..
. .176
. . . . ..
. .182
. . . . . ..
4.14. Test de repaso .. . .. .. . . . . . .. . . . . . . . . . .. .. . .. . 183 4.15. Comprueba tu aprendizaje . . . .. . .. . .. . . . .. . . . .. . . .184 .Tratamiento
de los
datos 185
5.1. Herramientas grácas para la edición de los datos . . . . .. . . . . .186 5.1.1. Edición con phpMyAdmin .. .. . . . .. . . . . .. . .. .. 186 5.1.2. Access como entorno gráco para otros gestores . . . .. . .. 187 IX
Bases de
Datos
5.2. La
sentencia INSERT
. . . . . . . ..
5.3. La
sentencia INSERT
extendida
5.4. INSERT
y SELECT
..
. . . . ..
. . . ..
5.5. La
sentencia UPDATE
. ..
5.6. La
sentencia DELETE
..
. . . ..
..
. ..
. . . ..
. . . . . ..
. . . ..
. . . ..
. . . ..
. ..
. ..
..
. . . . . ..
. ..
..
. ..
..
. . . . .189 ..
. ..
. ..
. ..
..
. ..
. 191
. .191 ..
. . . . . . . ..
.192 ..
193
5.7. La sentencias UPDATE yDELETE con subconsultas . . . .. .. . .193 5.8. Borrado y modicación de registros con relaciones . . .. .. . . .. .194 5.9. Transacciones
5.10. Acceso
. . . . . . . . . . ..
concurrente a
los datos
. . . . . . . . ..
. . . . ..
. ..
. . . . . ..
. . . . ..
. ..
. .197
. . . .198
5.10.1. Ejemplo de problemas en el acceso concurrente . . . . . . . . .200 5.11. El
acceso a
la información
5.12. Las
vistas .
5.13. Los
usuarios .
. . . . . ..
. ..
. . . . ..
. . . . . . . . . . . . . . . . . . .. . . . . ..
..
. . . . . ..
..
..
. . . . . . . .203
. . . . . . . . . . . .203 . . . . . . ..
. . . .205
5.14. Los privilegios . . . . . . .. .. .. . . . . . . .. . . .. . . . 5.14.1. El sistema de privilegios de l\'IySQL .. .. . .. . . . . 5.14.2. El sistema de privilegios de Oracle .. . .. . . . .. . 5.14.3. El sistema de privilegios de DB2 .. . .. . . . . .. .. 5.15. Prácticas
Resueltas
. . . . ..
..
5.16. Prácticas Propuestas .
..
5.17. Resumen
. . . ..
. ..
. ..
..
..
. . ..
. . ..
. . . . ..
. . . . . . . . . . .. ..
..
. ..
..
. . . . . . ..
. .207 . .208 . .212 .. 219
. . . ..
.221
. . . . . . . . . .223
..
. . ..
. . ..
..
228
5.18. Test de repaso . . . . . .. . . . . . . . . . .. . . .. .. . .. . . .. 229 5.19. Comprueba tu aprendizaje . .. .. . . .. . . .. . .. . . . . . .. . 230 6. Programación de bases de datos 6.1. Introducción a la programación de bases de datos 6.2. Los lenguajes de programación de bases de datos 6.3. Tipos de datos, identicadores y variables . . . . 6.4. Operadores y expresiones . .. . . . . . . . . . . . 6.5. Estructuras
de control
. . ..
..
. . . . . . . . . . . ..
6.5.1. IF..THEN-ELSIF..THENELSE-END
IF .
6.5.2. CASE-WHENTHEN-ELSE-END
CASE .
6.5.3. LOOP-EXIT
..
WHEN-END LOOP
6.5.4. WHILE..LOOP-END
LOOP
6.5.5. FOR..IN..LOOP-END 6.6. Gestión
de errores
6.7. Transacciones en scripts 6.8. Las
secuencias
6.9. Prácticas
. ..
. . ..
. . ..
. . ..
. ..
..
. . ..
. .. ..
..
. . . .. . ..
6.11. Resumen
..
. . ..
. . . . . . ..
. . . . ..
..
. . .246
. ..
..
247
. . . . .248
. . . . . . . . .248
. ..
. . . ..
6.12. Test de repaso . . . ..
. ..
. . ..
..
. . . ..
..
..
. . . . . . . . . . . . . . ..
..
..
..
. . . ..
6.10. Prácticas Propuestas . . . . . . . .. ..
. . . . . . . . .245
. . ..
..
..
..
..
..
..
..
. . . . . . .245
. . . . . . ..
. . . . . ..
Resueltas
. . ..
LOOP
. . . . . . ..
231 .. .. . . . .. .. 232 . . . . . .. . .. .235 .. . . .. . . . . .240 . . .. . .. .. . .243
. ..
. . . .253
. . . . . . ..
. ..
. ..
251
. .257
. . . . . . . . .258
. . . . ..
. . . . . . ..
. . . . . . . . . . . . . ..
..
..
. .262 . . 264
. . .265
Índice general 6.13. Comprueba tu aprendizaje .. .BBDD
..
. . . . . ..
. ..
..
. ..
. ..
.. 266
distribuidas 267
7.1. BBDD y SGBD distribuidos . . . . .. . .. . . . . . . . . . . . .. .268 7.1.1. Componentes de una BBDD distribuida .. .. . .. . . . . .268 7.2. Técnicas de fragmentación .. . . . . .. . .. .. . . . . . .. . . . .270 7.3. Consultas
distribuidas
7.3.1. DB
Links .
. .. . . ..
.. ..
. . . . . . .. ..
..
..
. ..
7.3.2. Ejecución de consultas distribuidas . 7.4. Transacciones
distribuidas .
7.4.1. TWO-PHASE
. ..
..
. . ..
..
..
..
..
. . . ..
. . ..
. ..
. ..
. . ..
. . . . ..
COMMIT
..
. . . .. . . . ..
. .271
. . . . ..
. . . . ..
.271
. .273
. . . . .275
. . . . . . ..
276
7.4.2. Ejemplo de transacción distribuida . . . . . . . . . . . . . 7.5. Optimización de consultas sobre bases de datos distribuidas . . . 7.5.1. Optimización mediante consultas derivadas .. . . . . . .. 7.5.2. Optimización mediante hints . . .. .. . . . . . . . . . ..
. .277 .. 280 .. 280 . .281
7.6. Prácticas
. .283
Resueltas .
..
. . . . ..
7.7. Prácticas propuestas .. 7.8. Resumen
. . ..
..
. ..
. . ..
. . . . . . . . . . . . . . ..
. . . ..
. . ..
..
. . ..
. . . . . ..
..
. ..
. . ..
. ..
. . . . . 286
. . . . . . ..289
7.9. Test de repaso . . . . . . .. .. . . . . . . . . . . . . . . . . . . .. .290 7.10. Comprueba tu aprendizaje . . . . . . . .. . .. .. . . . . . . .. .. 291 .BBDD Objeto-Relacionales 293 8.1. Las Bases de datos objetos-relacionales . . .. 8.2. Los
atributos multivaluados
8.2.1. Las
..
colecciones
8.2.2. Tablas
. ..
. ..
8.4. Los
anidadas
métodos .
herencia
. ..
. ..
..
..
. . . . ..
referencias
8.8. Prácticas
..
. . ..
8.6. Operaciones DML .. 8.7. Las
..
. . . ..
Resueltas . . ..
..
..
..
. ..
. . . ..
. . . . . . . ..
. . ..
..
..
..
. . . ..
..
. . . ..
. . ..
. . ..
8.9. Prácticas Propuestas .. 8.10. Resumen
. . . . . ..
. . . 294
. . . . .294
. . . . . . . . . . . . . . . . . . . . . . . . . .295
8.2.3. Tipos de Objeto .. .. . . . . .. 8.3. Los identicadores de objeto .. . . . .. 8.5. La
..
. ..
..
. . ..
. . . . . . ..
..
. . . . ..
8.11. Test de repaso . . . . . . . .. 8.12. Comprueba tu aprendizaje ..
. . .. . ..
. . . . . . ..
. . . . . .. . .. . . .. . ..
. . . .298 . . . .300
. . . . . . . . . . . . .301
. . ..
. ..
. . . .. . . . ..
.296
. . . . . . . . . ..
. . . . . . ..
.304
. . . . .306
. . . . . . . . . . . . . . . .307 . ..
..
. ..
. . ..
. . . ..
. . ..
. . ..
..
. . ..
..
. ..
..
. ..
. . ..
. . 309
.. ..
. 312 ..
314
. . . . . . . . .. . . . . . . .. . . . .315 . . . .. . . .. . . . . . . . . . . .. . 316
XI
CAPÍTULO 1
Los sistemas de la
de almacenamiento
información Objetivos W Analizar
los sistemas lógicos de
almacenamiento V Contenidos
.terísticas
ÑFicheros.Tipos yformatos bases n? Bases de datos.
. Reconocer usos y tipos
Identicar los
distintos tipos de
de datos
Conceptos.
n? Sistemas gestores de bases de datos
sus carac-
la utilidad
de un sis-
tema gestor de base de datos Describir la
función de
los ele-
mentos de un sistema gestor de base de
datos
Clasicar los de bases
sistemas gestores
de datos
Este capítulo introduce conceptos sencillos e intuitivos para establecer una cultura básica de bases de datos, y poder, de este modo, avanzar a objetivos más avanzados. E1 estudiante, a modo introductorio, manejará, de forma muy visual, conceptos tales como tablas yrelaciones. De esta manera, afrontará capítulos próximos con más experiencia, yentenderá yasimilará mejor el diseño lógico ysico de las bases de datos.
Bases de
Datos
1. 1.
Ficheros
Un ordenador almacena muchos tipos de información, desde datos administrativos, contables o bancarios hasta música, películas, partidas de videojuegos, páginas webs, etc. Toda esta información está almacenada en los dispositivos de almacenamiento del ordenador, esto es, discos duros, dvds, pen drives, etc. Para poder organizar la información en estos dispositivos, se utilizan los cheros o archivos. Los cheros son estructuras de información que crean los sistemas operativos de los ordenadores para poder almacenar datos. Suelen tener un nombre y una extensión, que determina el formato de la información que contiene.
1.1.1. Tipos
de cheros
yformatos
El formato y tipo de chero determina la forma de interpretar la información que contiene, ya que, en denitiva, lo único que se almacena en un chero es una
ristra de bits (ceros y unos), de forma que esnecesaria suinterpretación para dar sentido a la información que almacena. Así, por ejemplo, para almacenar una imagen en un ordenador, se puede usar un chero binario bmp, que almacena un vector de datos con los colores que tiene cada pixel que forma la imagen. Además, la imagen posee una paleta de colores y unas dimensiones, información que también hay que almacenar en el chero. Todos estos datos se ordenan según un formato, y el sistema operativo, o la utilidad que trate los grácos, debe conocer este formato para poder extraer los píxeles y mostrarlos por pantalla en la forma y dimensiones correctas. Si se abre el graco con una utilidad como el bloc de notas, que solo sabe interpretar texto, el resultado será ilegible e incomprensible.
Actividad 1.1: Busca en tu ordenador unchero con extensión doc(del procesador detextos Microsoft Word), y ábrelo con el bloc de notas, pulsando con el ratón derecho sobre el y seleccionando la opción Abrir con. Observa que el bloc de notas no conoce el formato del chero tipo doc, y por tanto, no sabe interpretar el contenido del chero, cosa que sí hace la aplicación de Microsoft.
Tradicionalmente, los cheros se han clasicado de muchas formas, según su conte-
nido (texto o binario), según suorganización (secuencial, directa, indexada)o según su utilidad (maestros, históricos,movimientos). El contenido de un chero puede ser tratado como texto, o como datos binarios, es decir, los bits almacenados en un chero pueden ser traducidos por el sistema operativo a caracteres alfabéticos y números que entiende el ser humano, o pueden
Capítulo 1. Los sistemas de almacenamiento de Ia información ser tratados como componentes de estructuras de datos más complejas, como cheros que almacenan sonido, vídeo, imágenes, etc. La organización de un chero dicta la forma en que se han de accedera los datos, así, los datos de un chero con organización secuencial, están dispuestos siguiendo una secuencia ordenada, es decir, unos detrás de otros. Se caracterizan por tener que recorrer todos los datos anteriores para llegar a uno en concreto. Los cheros de organización directa, permiten acceder a un dato en concreto sin necesidad de acceder a todos los anteriores. Finalmente, los de organización indexada acceden a los datos consultando un índice, es decir, una estructura de datos que permite acceder a la información rápidamente, simulando la forma en que el índice de un libro facilita
el acceso
a sus
contenidos. Existen
también variantes
de las
anteriores
que mezclan las mejores características de cada una de ellas. Por otro lado, la utilidad de un chero indica qué uso se va a hacer de él, por ejemplo, puede contener datos fundamentales para una organización, como los datos de los clientes, que se almacenan en un chero principal llamada maestro. Si hay
variaciones (altas, modicaciones o bajas de clientes) en los cheros maestros, se almacenan en los llamados cheros de movimientos que posteriormente se enfrentan con los maestros para incorporar las modicaciones. Finalmente, cuando existen datos que ya no son necesarios para su proceso diario pasan a formar parte de los cheros históricos.
Hoy en día, estas dos últimas clasicaciones han quedado en desuso. Por ejemplo, desde la aparición de las bases de datos modernas, ya no se clasican según su utilidad u organización. Actualmente un sistema opera.tivo trata. un chero desde dos puntos de vista:
1. Segúnsu contenido(texto o datos binarios) 2. Según su tipo (imágenes, ejecutables, clips de videos, etc.)
1.1.2. Ficheros
de texto
Los cheros de texto suelen llamarse también cheros vocablo ascii
es un
acrónimo de
American Standard
planos o cheros ascii.
Code for
El
Information Inter-
change. Es un estándar que asigna un valor numérico a cada carácter, con lo que se pueden representar los documentos llamados de Texto Plano, es decir, los que son directamente legibles por seres humanos.
Bases de
Datos
La asignación de valores numéricos a caracteres viene dada por la famosa tabla de códigos ascii, que es la más extendida, aunque existen otras. Se caracteriza por utilizar 1 byte para la representación de cada carácter. Con x bits se pueden generar
2 combinaciones distintas de caracteres, ycomo 1 byte =8
bits, existen 28 =256
caracteres en la tabla de códigos ascii, numerados del 0 al 255.
Actividad 1.22 Conéctatea Internet,y buscauna tablade códigosascii de8 bits. Observa las siguientes características: - Los 32 primeros caracteres, sellaman caracteres no imprimibles y se utilizaban tradicionalmente para el control de transmisiones. ILa
distancia entre mayúsculas y minúsculas es exactamente 32 caracteres.
n Hay caracteres que son numéricos, y cuyo valor ascii es el resultado de sumarle 48. Por ejemplo, 6+48=54. 54 es el código ascii del carácter 6.
Algunos alfabetos, como el katakana japonés utilizan más de 256 caracteres. En estos casos,se requieren las tablas de caracteres unicode, que reservan dos bytes para cada carácter.
o Actividad
1.32 Conéctatea http://mm.unicode.org/charts/
y descárgate
las tablasde códigosLatin (alfabeto latino) y Katakana (alfabeto japonés).Observa las siguientes curiosidades: n La tabla de códigos Latin ,es exactamente idéntica a la tabla de códigos ascii de 8 bits, solo que los bits del primer byte unicode, están todos a 0. ILa
tablas de códigos Latin
Katakana Phonetic
y Katakana tienen
Extensions o
Latin Extended
múltiples extensiones, como Additional.
Los cheros de texto, aunque no necesitan un formato para. ser interpretado, suelen tener extensiones para conocer qué tipo de texto se halla dentro del chero, por ejemplo: - Ficheros de conguración: Son cheros cuyo contenido es texto sobre conguraciones del sistema operativo o de alguna aplicación. Estos pueden tener extensión .ini, .inf ,.conf
Capítulo 1. Los sistemas de almacenamiento de la información IFicheros de código fuente: Su contenido es texto con programas informáticos. Ejemplos: sql, .c, .java
n Ficherosde páginasweb: Laspáginas websson cheros de texto con hipertexto que interpreta el navegador. html, php,
.css, .xml
n Formatos enriquecidos: Son textos que contienen códigos de control para ofrecer una visión del texto más elegante: .rtf, .ps ,.tex
¿Sabías que .. . 7XML
es un lenguaje estándar para el intercambio de
datos entre aplicaciones informáticas. Se están desarrollando actualmente las llamadas bases de datos nativas XML. cuyo foco principal es el aI1nacenamiento de documentos de texto con código en XML. y no las relaciones entre la información, como sucede conlas basesde datos relacionales que se estudian en el presente libro. Por ejemplo, DB2 incorpora dentro de su motor una nueva característica que potencia el XML: XQuery, esto es, un lenguaje innovador para hacer consultas directamente sobre documentos XML guardados directamente en la
base de
datos.
1.1.3. Ficheros
binarios
Los cheros binarios son todos los que no son de texto, y requieren un formato para ser interpretado. A continuación se muestran algunos tipos de formatos de cheros binarios:
IDe
imagen: jpg, gif, .tiff,
.bmp, .wmf, .png, .pcx; entre muchos otros
n De vídeo: .mpg, .mov, .avi, .qt IComprimidos IEjecutables IProcesadores
o empaquetados: .zip. .Z, .gz, tar, .lhz o compilados: exe. .com, .cgi, .0, .a de textos: .doc, .odt
lEl hipertexto es una forma de escritura no secuencial, conbifurcaciones, quepermite que el lector elija qué secuencia seguir yque navegación.
es presentado en una pantalla interactiva
para facilitar
la
Bases de
Datos
Generalmente los cheros que componen una base de datos son de tipo binario, puesto que la información que hay almacenada en ellos debe tener una estructura lógica y organizada para que las aplicaciones puedan acceder aella de manera universal, esto es, siguiendo un estándar. Esta estructura. lógica y organizada, generalmente es muy difícil de expresar mediante cheros de texto, por tanto, la información de una base de datos se suele guardar en uno o varios cheros: u El software de gestión de base de datos Oracle guarda la información en múltiples tipos de cheros, llamados datales, temples, logles, etc. IUn tipo de tablas del gestor l\iI;vSQL guarda su información en 3 cheros de datos binarios, con extensión frm, myd y myi. n Access guarda toda la información de una base de datos con extensión mdb.
Actividad 1.4: La siguiente imagen es unacaptura deuna carpetaen elsistema operativo Windows 7. Indica qué tipo de chero es cada uno de ellos y qué contiene. HcmL-re Fecha E Battlestar Galactica-lxLavi
de nmzhwïcecicn Úí 3-322v]? "LJ
Tnpc Tamahc lu112i
Íhp de ¿dee 6' -4 11 a Í u r J "n 1 .
__ (omojnstalantxt i- DSCN0776JPG
l
o_.
v.. q
t n1a
1
¡If L
5' eclipseexe __ eclipseini c: t.
a
.-- img_xp_sp3.iso _lícencia_windows.bct
,4 V IJ -
(¡r
Capítulo 1. Los sistemas de almacenamiento de la información
de forma ordenada y coherente (sincontradicciones). Cadauna de estas tablas es una estructura que se parece a las hojas de cálculo, pues está dispuesta mediante las y columnas. De este modo, cada la almacena un registro con tantos campos como columnas tenga la tabla. Por ejemplo, se podría tener una tabla de Empleados, donde cada la o registro es un empleado de la empresa y cada columna o campo representa un trozo discreto de información sobre cada empleado, por ejemplo el nombre o
el número
de teléfono.
jímpliidïvï CodngoEmple v Nombre v
Apellidol v
Apellndoz v
Extension v
Email v
- Y codugoo :
1 Marcos Magaña Perez 3897
[email protected] TAL-ES 4
2Ruben 3Alberto
López Martinez Soria Carrasco
2899
[email protected] 2837 asoria@}ardineria.es
TAL-ES TAL-ES _
4Maria 5 Felipe
Solís Jerez Rosas Marquez
2847
[email protected] 2844
[email protected]
TAL-ES E TAL-ESl
6 JuanCarlos 0m:
7Carlos
Serrano 2845
Soria Jimenez
8 Mariano López Murcia 9 Lucio Campoamor Manín 10 Hilario Rodriguez Huertas 11 Emmanuel Magaña Perez 12 JoséManuel Martinez De laOsa 13 David Dalma Aceituno 14 Oscar Palma Aceituno 15 Francois Fugnon 16 Lionel Narvaez 17 Laurent Serra 18 Michael Bolton 7454 ___ ___19 W_a|_ïe_r_ Santuag Sanchez Lopez Registro: H 446231 P N P -Buscar 4
[email protected] TAL-ES
2444
[email protected]
l
MAD-ES x
2442 mlopezcenardmenaes rvlAD-ES 2442 lcampoamorczïjardineriaes MAD-ES 2444
[email protected] MAD-ES 2518 manu@¡ardinena.es BCN-ES 2519 ¡mmanéïhotmarles BCN-ES 2519 dpalma@jard¡neria.es BCN-ES 7519
[email protected] BCN-ES 9981 ffignonQgardeningxom PAR-FR 9982
[email protected] PAR-FR 9982
[email protected] PAR-FR mboltoncaïgardeningmom SFC-USA 7454
[email protected] SFC-USAv m l I
Figura 1.1: Ejemplo de tabla en Microsoft Access.
1.2.1. Conceptos Uno de los grandes problemas al que seenfrentan los informáticos cuando comienzan su aprendizaje, es el gran número de términos desconocidos que debe asimilar, incluyendo el enorme número de sinónimos y siglas que se utilizan para nombrar la misma cosa. Tratando, a modo de resumen, de aclarar algunos de lo componentes que se pueden encontrar en una base de datos, y que se verán en próximos capítulos, se denen los siguientes conceptos: Dato: El dato es un trozo de información concreta sobre algún concepto o suceso. Por ejemplo, 1996 es un número que representa un año de nacimiento de una persona. Los datos se caracterizan por pertenecer a un tipo. Tipo de Dato: El tipo de dato indica la naturaleza del campo. Así, se puede tener datos numéricos, que son aquellos con los que se pueden realizar cálculos
aritméticos (sumas,restas, multiplicaciones.. .) y los datos alfanuméricos,que 7
Bases de
Datos
son los que contienen caracteres alfabéticos y dígitos numéricos. Estos datos alfanuméricos ynuméricos se pueden combinar para obtener tipos de datos más elaborados. Por ejemplo, el tipo de dato Fecha contiene tres datos numéricos, representando el día, el mes y el año de esa fecha. Campo: Un campo es un identicador para toda una familia de datos. Cada campo pertenece a un tipo de datos. Por ejemplo, el campo F echaNacimiento representa las fechas de nacimiento de las personas que hay en la tabla. Este campo pertenece al tipo de dato Fecha. Al campo también se le llama columna. Registro: Es una recolección de datos referentes a un mismo concepto o suceso. Por ejemplo, los datos de una persona pueden ser su NIF, año de nacimiento, su nombre, su dirección, etc. A los registros también se les llama tuplas o las. Campo Clave: Es un campo especial que identica de forma única a cada registro. Así, el NIF es único para cada persona, por tanto es campo clave. Hay varios tipos de campos clave como se explicará en la. sección 2.6.2. Tabla: Es un conjunto de registros bajo un mismo nombre que representa el conjunto de todos ellos. Por ejemplo, todos los clientes de una base de datos se almacenan en una tabla cuyo nombre es Clientes. Consulta: Es una instrucción para hacer peticiones a una base de datos. Puede ser una búsqueda simple de un registro especico o una solicitud para seleccionar todos los registros que satisfagan un conjunto de criterios. Aunque en castellano, consulta tiene un signicado de extracción de información, en inglés query, una consulta es una petición, por tanto, además de las consultas de búsqueda de información, que devuelven los campos y registros solicitados,
hay consultas (peticiones) deeliminación o inserción deregistros, de actualización de registros, cuya ejecución altera los valores de los mismos.
Índice: Es una estructuraque almacena los camposclave deuna tabla,organizándolos para hacer más fácil encontrar y ordenar los registros de esa tabla. El índice tiene un funcionamiento similar al índice de un libro, guardando parejas de elementos: el elemento que se desea indexar y su posición en la base de datos. Para buscar un elemento que esté indexado, solo hay que buscar en el índice de dicho elemento para, una vez encontrado, devolver el registro que se encuentre en la posición marcada por el índice. Vista: Es una transformación que se hace a una o más tablas para obtener una nueva tabla. Esta nueva tabla es una tabla virtual, es decir, no está almacenada en los dispositivos de almacenamiento del ordenador, aunque sí se almacena su denición.
Capítulo 1. Los
sistemas de almacenamiento de la información
Informe: Es un listado ordenado de los campos y registros seleccionados en un formato fácil de leer. Generalmente se usan como peticiones expresas de un tipo de información por parte de un usuario. Por ejemplo, un informe de las facturas impagadas del mes de enero ordenado por nombre de cliente. Guiones: o scripts. Son un conjunto de instrucciones, que ejecutadas de forma ordenada, realizan operaciones avanzadas de mantenimiento de los datos almacenados en
la base
de datos.
Procedimientos: Son un tipo especial de script que está almacenado en la base de datos y que forma parte de su esquema. 1.2.2. Estructura
de una
base de
datos
Una base de datos almacena los datos a través de un esquema. El esquema es la denición de la estructura donde se almacenan los datos, contiene todo lo necesario para organizar la información mediante tablas, registros (las) y campos
(columnas). Tambiéncontiene otros objetos necesariospara el tratamiento de los datos (procedimientos, vistas, índices, etc.) y que se estudiarán en este libro. Al esquema también se le suele llamar metainformación, es decir, información sobre la información o
metadatos.
mysq1> select -> from
-> where + ------------
table_schema, tab1e_name,
tab1e_rows
information_schema.tables
tab1e_schema=jardineria; --+ --------------
I tab1e_schema
I tab1e_name
--+ ----------
--+
I tab1e_rows
jardineria Clientes jardineria Deta11ePedidos jardineria Empleados jardineria GamasProductos
jardineria Oficinas jardineria Pagos jardineria Pedidos
jardineria Productos 9 rows
in set
(0,01 sec)
Figura 1.2: Consulta de un esquema de una base de datos en MySQL. Los gestores de bases de datos modernos Oracle, MySQL y DB2, entre otros, almacenan el esquema de la base de datos en tablas, de tal manera que el propio 9
Bases de
Datos
esquema de la base de datos se puede tratar como si fueran datos comunes de le. base de datos. Véase gura 1.2. 1.2.3. Usos
de las
bases de
datos
Las bases de datos son ubícuas, están en Cualquier tipo de sistema informático. a continuación se exponen solo algunos ejemplos de sus usos más frecuentes: IBases de datos Administrativas: Cualquier empresa necesita registrar y relacionar sus clientes, pedidos, facturas, productos, etc. IBases de datos Contables: También es necesario gestionar los pagos, balances de pérdidas y ganancias, patrimonio, declaraciones de hacienda. . . IBases de datos para motores de búsquedas: Por ejemplo Google o Altavista. tienen una base de da.tos gigantescadonde almacenan información sobre todos los documentos base de datos de
de Internet.
Posteriormente millones
de usuarios
buscan en
la
estos motores.
- Cientícas: Recolección de datos climáticos y medioambientales, químicos. genómicos, geológicos.. . IConguraciones: Almacenan datos de conguración de un sistema informático. como por ejemplo, el registro de windows. n Bibliotecas: Almacenan información bibliográca, por da virtual
amazon o
la. biblioteca
de un
ejemplo, la famosa tien-
instituto.
ICensos: Guardan información demográca de pueblos, ciudades ypaises. IVirus:
Los antivirus guardan información sobre todos los potenciales software
maliciosos.
IOtros
muchos usos: Militares, videojuegos, deportes, etc.
¿Sabías que . . . 7La 'WDCC (World Data ClimateCenter), centromundial para datos del clima, es la base de datos más grande del mundo. Almacena alrededor de 6 petabytes de información, esto es 6144 Terabytes de información sobre clima, predicciones y simulaciones. La base de datos de Google está situada como la 4a más grande del mundo (Abril-QOIO).
10
Capitulo 1. Los
sistemas de almacenamiento de la información
Actividad 1.5: Buscaen Internetlas 10bases de datos másgrandes del mundo. Anota su nombre y su tamaño, y, en una hoja de cálculo, genera un gráco que muestre la comparativa del tamaño de estas basesde datos.
El consejo del buen administrador. . . Siempre hay que hacer copias de seguridad regularmente ya ser posible, de varios tipos. Cuando una base de datos tiene un tamaño brutalmente grande como las del WDCC o Google, hacer copias de seguridad se convierte en algo prácticamente imposible, puesto que se tardarian semanas en realizarlas, y, además, es complicado encontrar dispositivos capaces de almacenar estas copias, por lo que en lugar de hacer copias de seguridad, se recurre a sistemas tolerantes a fallos, que logran que la probabilidad de perder un solo dato, sea prácticamente nula.
1.2.4. Evolución
ytipos
de base de datos
La clasicación de las bases dedatos en tipos, está. ligada a su evolución histórica. Según ha ido avanzando la tecnología, las bases de datos han mejorado cambiando la forma de representar y extraer la información. De esta manera, se presenta la evolución sufrida por las bases de datos desde las épocas prehistóricas de la informática hasta la actualidad: En la década de 1950 se inventan las cintas magnéticas, que solo podían ser leídas de forma secuencial y ordenadamente. Estas cintas, almacenaban cheros con registros que se procesaban secuencialmente junto con cheros de movimientos para
generar nuevoscheros actualizados. Estos sistemasse conocencomo aplicaciones basadas en sistemas de cheros y constituyen la generación cero de las bases de datos, pues ni siquiera entonces existía el concepto de bases de datos. En la década de 1960 segeneraliza el uso de discos magnéticos, cuya característica principal es que se podía acceder de forma directa a cualquier parte de los cheros, sin tener que acceder a todos los datos anteriores. Con esta tecnología aparecen las bases dedatos jerárquicas y en red, que aprovechan la capacidad de acceso directo a la información de los discos magnéticos para estructurar la información en forma de 11
Bases de
Datos
listas enlazadas y árboles de información. La losofía de las bases dedatos en red es que un concepto principal o padre puede tener numerosas relaciones con conceptos secundarios o hijos. Las bases de datos jerárquicas, evolucionan para admitir varios padres para un concepto hijo.
¿Sabías que
. . . 7En octubre de 1969 seconcibe elprimer modelode
base de datos en red. conocido como CODASYL (Conference on Data Systems Language), que posteriormente IBM rena. y mejora mediante el modelo IMS (Information Management System) para el programa Apollo de la NASA.
Edgar Frank Codd, cientíco informático inglés de IBM, publica en 1970 en un artículo Un modelo relacional de datos para grandes bancos de datos compartidos
(A Relational Model of Data for Large SharedData Banks), donde denió el modelo relacional, basado en la lógica de predicados y la teoría de conjuntos. Nacieron, de esta forma, las bases de datos relacionales, o segunda generación de bases de datos. Larry Ellison, fundador de Oracle. se inspiró en este artículo para desarrollar el famoso motor de basede datos, que comenzó como un proyecto para la CIA (Central Intelligence Agency) americana. La potente base matemática de este modelo, es el gran secreto de su éxito. Hoy en día, el modelo relacional de Codd, pese a tener muchas alternativas, sigue siendo el más utilizado a todos los niveles.
¿Sabías que . . . 7Las leyes deCodd sonun conjuntode 13reglas (dela regla O a la regla 12) cuya nalidad es establecer las características que debe tener una base de datos relacional. Actualmente. todos los gestores de bases de datos implementan estas reglas. Puedes buscar en Internet estas reglas y leerlas con
Actividad
detenimiento.
1.6: Busca en Internetla biografíade lossiguientes personajes, y
comenta su principal contribución J Edgar
Frank Codd
J Larry
Ellison J
J Roger Kent Summit
12
a la evolución de las bases de datos: J Bill
Gates
Michael Monty Widenius
Capítulo 1. Los sistemas de almacenamiento de la información En la década de 1980 IBM lanza su motor de bases de datos DB2, para la pla-
taforma MVS. Unos añosdespués, IBMcrea el SQL (Structured Query Language), un potente lenguage de consultas para manipular información
de bases de datos
relacionales.
A medidados de 1990, IBM lanza una versión de DB2 que es capaz de dividir una base dedatos enorme en varios servidores comunicados por líneas de gran velocidad, creándose de este modo las bases de datos paralelas. Aesta versión se le llamó DB2 Parallel Edition, que ahora, ha evolucionado hasta el DBZ Data Partition Feature, único SGBD de este tipo en sistemas distribuidos. A nales de 1990 IBM y Oracle incorporan a sus bases de datos la capacidad de manipular objetos, creando así, las bases de datos orientadas a objetos. Estas bases de datos orientadas a objetos se basan en la existencia de objetos persistentes que se almacenan para su procesamiento mediante programas orientados a objetos. En lugar de la losofía de almacenar relaciones y tablas, se almacenan colecciones de objetos que, además de información, tienen comportamientos (instrucciones sobre cómo procesar los datos). La aparición de Internet y el comienzo de la era de la información, crean nuevos requirimientos para bases dedatos. La cantidad de información comienza a crecer en proporciones desconocidashasta el momento. De esta forma, se creanlas basesde datos distribuidas, que consisten en multiplicar el número de ordenadoresque controlan una base de datos (llamados nodos), intercambiándose información y actualizaciones a través de la red. Este increible aumento de datos a almacenar, organizados muchas veces en datos estadísticos recopilados con el trascurso de los años, hizo necesaria la aparición de un software llamado Software de ayuda a la decisión. Este software avanzado trata de dar respuestas concretas examinando múltiples datos estadísticos que se han recopilado a lo largo del tiempo en bases de datos multidimensionales, formando lo que se denominan cubos de información. Ventas del 2do 172010 España, Huelva Jamón de Bellota Q4 empo
Provincia
¡z/broducto '
Figura 1.3: Ejemplo de cubo en una base de datos multidimensional.
13
Bases de
Datos
También, a lo largo de la corta historia de la informática, han surgido otros tipos de bases de datos que se enumeran a continuación: - Bases de datos espaciales o geográcas: Son bases de datos que almacenan mapas v que representan supercies geográcas. Google Earth es usímbolos una aplicación que lanza consultas a bases de datos de este tipo. n Bases de datos documentales: Permiten la indexación de texto para poder realizar búsquedas complejas en textos de gran longitud. IBases de datos deductivas: Es un sistema de bases de datos que almacena hechos y que permite, a través de procedimientos de inferencia, extraer nuevos hechos. Sebasan en la lógica, por ello también se suelen llamar bases dedatos lógicas.
Base de Sistemas de
datos Datos cheros Datos
Jerárquicas Estructuras
En red
almacenados en cheros
de datos (listas y árboles) varios
cheros
Estructuras de datos (árbolesy grafos)
Relacionales Teoría de conjuntos y relaciones Orientadas a objetos Objetos complejos con comportamiento Geográcas Puntos, Líneas y Polígonos una Deductivas Hechos y Reglas
o varias BBDD
Documentales Documentos
Distribuidas Múltiples
varias BBDD
en
Multidimensionales Cubos
varios ordenadores
Cuadro 1.1: Resumen de los tipos de bases de datos.
1.3. Los
Sistemas Gestores
1.3.1. Concepto
de Sistema
de Base
Gestor de
de Datos
Base de Datos
Se dene un Sistema Gestor de Base de Datos, en adelante SGBD, como el conjunto de herramientas que facilitan la. consulta, uso y actualización de una base de datos. Un ejemplo de software Gestor de Base de Datos es Oracle 11g, que incorpora un conjunto de herramientas software que son capaces de estructurar en múltiples discos duros los cheros de una base de datos, permitiendo el acceso asus datos tanto a partir de herramientas grácas como a partir de potentes lenguajes de programación (PL-SQL, php, c++. . .). 14
Capítulo 1. Los 1.3.2. Funciones
de un
sistemas de almacenamiento de 1a información SGBD
Los SGBD del mercado cumplen con casi todas funciones que a continuación se enumeran:
1. Permiten a los usuarios almacenar datos, acceder a ellos y actualizarlos de forma sencilla y con un gran rendimiento, ocultando la complejidad y las características físicas de los dispositivos de almacenamiento. 2. Garantizan la integridad de los datos, respetando las reglas y restricciones que dicte el programador de la base de datos. Es decir, no permiten operaciones que dejen cierto conjunto de datos incompletos o incorrectos. 3. Integran, junto con el sistema operativo, un sistema de seguridad que garantiza el acceso a la información exclusivamente a aquellos usuarios que dispongan de autorización.
4. Proporcionan un diccionario de metadatos, que contiene el esquema de la base de datos, es decir, cómo están estructurados los datos en tablas, registros y campos, las relaciones entre los datos, usuarios, permisos, etc. Este diccionario de datos debe ser también accesible de la misma forma sencilla que es posible acceder al
resto de
datos.
5. Permiten el uso de transacciones, garantizan que todas las operaciones de la transacción se realicen correctamente, y en caso dealguna incidencia, deshacen los cambios sin ningún tipo de complicación adicional. 6. Ofrecen, mediante completas herramientas, estadísticas sobre el uso del gestor, registrando operaciones efectuadas, consultas solicitas, operaciones fallidas y cualquier tipo de incidencia. Es posible de este modo, monitorizar el uso de la base de datos, y permiten analizar hipotéticos malfuncionamientos. 7. Permiten la concurrencia, es decir, varios usuarios trabajando sobre un mismo conjunto de datos. Además, proporcionan mecanismos que permiten arbitrar operaciones conflictivas en el acceso omodicación de un dato al mismo tiempo por parte de varios usuarios. 8. Independizan los datos de la aplicación o usuario que esté utilizándolos, haciendo más fácil su migración a otras plataformas. 9. Ofrecen conectividad con el exterior. De esta manera, se puede replicar y distribuir bases de datos. Además, todos los SGBD incorporan herramientas 15
Bases de
Datos
estándar deconectividad. Elprotocolo ODBC4está muyextendido comoforma de comunicación entre bases de datos y aplicaciones externas. 10. Incorporan herramientas para la salvaguarda y restauración de la información en caso de desastre. Algunos gestores, tienen sosticados mecanismos para poder establecer el estado de una base de datos en cualquier punto anterior en el tiempo. Además, deben ofrecer sencillas herramientas para la importación y exporta.ción automática de la información.
Actividad 1.72 Buscaen Internetlas leyesde Coddpara elfuncionamiento de sistemas gestores de bases de datos relaciones y establece una relación entre cada una de las leyes de Codd y las funciones que proporcionan los SGBD actuales.
1.3.3. El
lenguaje SQL
La principal herramienta de un gestor de base de datos es la interfaz de programación con el usuario. Este interfaz consiste en un lenguaje muy sencillo mediante el cuál el usuario realiza preguntas al servidor, contestando este a las demandas del usuario. Este lenguaje comúnmente se denomina SQL, Structured Query Language,
está estandarizadopor la 1805, esdecir, todaslas basesde datosque soportenSQL deben tener la misma sintaxis a la hora de aplicar el lenguaje. Se divide en 4 sublenguajes, el total de todos ellos permite al SGBD cumplir con las funcionalidades requeridas por CODD:
- Lenguaje DML: o lenguaje de manipulación de datos (Data Manipulation Language). Estelenguaje permitecon 4 sentencias sencillas seleccionar determinados datos (SELECT), insertar datos (INSERT), modicarlos (UPDATE)
o incluso borrarlos (DELETE). En capítulos posteriores sedesarrollará lasintaxis de
cada una
ILenguaje
DDL: o
de estas
sentencias.
lenguaje de denición de
datos (Data Denition Langua-
ge). Estelenguaje permitecrear todala estructura de unabase dedatos ( desde tablas hasta usuarios). Sus cláusulas son del tipo DROP (Eliminar
objetos) y
CREATE (Crear objetos). En capítulos posterioresse detallará la sintaxis de cada una
ODBC signica
de estas
sentencias.
Open DatabaseConnectivity, y es un estándar deacceso adatos desarrollado
por Microsoft
5180 esel acrónimo de International Organization for Standardarization 16
Capítulo 1. Los sistemas de almacenamiento de la información
- Lenguaje
DCL: o lenguaje de control de datos (Data Control Language).
Incluye comandos (GRANT y REVOKE) que permiten al administrador gestionar el
acceso a
los datos
contenidos en
la base
de datos.
- Lenguaje TCL: o lenguaje de control de transacciones. El propósito de este lengua.je espermitir ejecutar varios comandos de forma simultánea como si fuera un comando atómico o indivisible. Si es posible ejecutar todos los comandos, se aplica la transacción (COMMIT), y si, en algún paso de la ejecución, sucede
algo inesperado,se puedendeshacer todoslos pasosdados (ROLLBACK).
Actividad 1.82 Buscaen la Wikipedia eltérmino SQLe indicalas revisiones que ha sufrido el lenguaje a lo largo del tiempo. A continuación, busca el signicado del término SQL Injection e indica por qué un administrador debe protegerse frente a él.
1.3.4. Tipos
de SGBD
Se puedenclasicar los SGBD de muchas formas, por ejemplo, según las bases de datos que gestionan, clasicando los SGBD según traten bases dedatos relacionales, bases dedatos orientadas a objetos, etc. Puesto que en la actualidad, la mayoría de los SGBD integran múltiples losóas y tipos de funcionamiento, en este libro se clasican los de gestores de basesde datos según su capacidad y potencia del propio gestor:
Los Gestores de Bases de Datos omáticas son aquellos que manipulan bases de datos pequeñas (omáticas) orientadas a almacenar datos domésticos o de pequeñas empresas.Incluso estos gestores permiten construir pequeñas aplicaciones para ayudar a un usuario inexperto a manipular los datos de una base de datos de forma sencilla e intuitiva. Un ejemplo de un SGBD omático es Microsoft Access, que posee tanto una interfaz de usuario muy sencilla como un potente lenguaje de
programación (VBA=Visual Basic forAplications) paraofrecer ausuarios avanzados otras posibilidades de gestión mucho más especícas. Los Gestores de bases de datos Corporativas son aquellas que tienen la capacidad de gestionar bases de datos enormes, de grandes o medianas empresas con una carga de datos y transacciones que requieren un servidor de grandes dimensiones (generalmente un Servidor Unix, o un Windows 2OOX Server con altas prestaciones). Estos gestores son capaces demanipular grandes cantidades de datos 17
Bases de
Datos
de formamuy rápida y eciente para poder resolver lademanda demuchos (cientos) de usuarios. Un ejemplo típico de servidor de base de datos Corporativas es el antes comentado Oracle, actualmente, junto con DB2, el servidor de base de datos más
potente del mercado (también el más caro). Precisamente,ese costetan alto es el que ha desencadenado que se haya recurrido a una solución intermedia entre gestores de base de datos omáticas y corporativas. Entre estas soluciones intermedias se encuentra MySQL, un gestor de base de datos que, además de ser gratuito y sencillo, es capaz de manipular gran cantidad de datos cumpliendo prácticamente todos los estándares de la arquitectura ANSI SPARC. Aunque implementa SQL, no tiene
un lenguaje de programación propio como SQL Server u Oracle (aunque está en desarrollo), pero a cambio se integra fácilmente en las típicas soluciones XAMPP, que son paquetes que incluyen, además de MySQL, una versión del servidor Web
Apache y varios lenguajesde script (php, perl. . .) que dotan a MySQL de potentes herramientas para acceso y publicación de los datos. Contabilidad Administración
Usuario 1
Figura 1.4: Esquema típico de organización de un SGBD corporativo.
18
Capítulo 1. Los sistemas de almacenamiento de 1ainformación
1.4. Prácticas
Resueltas
Práctica 1.1:
Introducción a
Microsoft Access.
En esta práctica, se aprenderá a manipular de forma básica el gestor de basesde da-
tos Accessde Microsoft.Abre la base dedatos Neptunoaccdb que puedesdescargar de www. garcetaes, y realiza las siguientes acciones. Será necesario modicar algún objeto de la base de datos, por tanto guarda una copia con el nombre practicalaccdb
7y conserva laoriginal para repetir 1apráctica cuantasveces desees.
fí
I
\J'\/_ Organizar vNueva
carpen
lEscritorio «i: ,4 Sitiosrecientes
«A!
d, Biblioteeas 1 Documentos hImagenes ¡v Musica
_
¡Administrar
rw- Fama
es núüiue.
¡a Neptuncuccdb E] Vehiculosaccdb _ s_
" Z LC .5" 3 I JLC .
Tip: Hicrcscft ¿Fi-ze .. ":r;;:v:
B deos
n; Grupoen elhogar 1'- Equipc
- 4
Hombrearchivo: de Neptuncmccdb vi Microsoft Office Access (mccd v] rm
_ Herramientas v
Abre Microsoft Access ypulsa la base de datos neptuno.
el botón de Office. Selecciona la opción abrir,
yen
ICancelar
|
el cuadro de diálogo, busca
1. ¿Qué tipo de información almacena la base de datos?
Neptuno es una basede datosque incorporanlas versionesantiguas deMicrosoft Access(hasta Access 2003) 7accdb es la extensión
de las bases de datos de Access 2007
19
Bases de Datos
Observando las tablas de la base de datos Neptuno, se puede ver que hay tablas de Clientes, Empleados, Pedidos, Productos, Proveedores, etc. Al abrir las tablas haciendo doble clic sobre ellas, se muestra la infonnación que contiene, por ejemplo, la tabla de productos almacena información sobre alimentación y derivados, por tanto, Neptuno es el sistema de información de una empresa que importa y eazportacomestibles especiales de todo el mundo.
2. ¿Qué
objetos tiene la base de datos? ÏrSBíaTM---wl < Id.d 6 Dplazarse l lacategoría De leyar s .
Iipodeobjeto
Todos losObJQÍOS deAccess 13m C°""'*
e
Personalizado
i
formularios m; Catalogo
Si
(( K 7) (4 Iablas yvistas relacionadas Fecha de¡reacion fechademodicacion Desplegando la lista del panel lateral izquierdo de Access, se puede obtener un
Filtrar porgrupo Twin
listadode todoslosobjetos
5°""
de la base de datos clasicados por tipos, es decir, tablas, consultas, formularios, informes, etc.
E°""'-"¡°5 Worms Eaginas Macro; Módulos Todos losobjetos deAccess
Etiquetas decliente nm". Lista alfabética deproductos Productos porcategoría Resumen deventas poraño Resumen deventas portrimestre Subintorme Catalogo Subiriíorme ventas poraño Subiriionrie ventas porcategoria TOÍMQS d!VGHÍIS D0!Cllidld ventas deempleado porpaís ventas poraño
440040
4 4 o
¿EE
3. Explora todos los objetos de la base de datos, poniendo especial énfasis en el diseñode cada objeto, es decir, en la forma en la que están construidos.
Para explorar el contenido de un objeto, basta con hacer un doble clic con el botón izquierdo del ratón y examinar el panel frontal. Para ver el diseño se pulsa con el botón derecho del ratón y se selecciona la opción Diseño. Por ejemplo, la consulta Subtotales por pedido consiste en un listado de los pedidos con su coste total.
los obietos deAccess -Todos --r---Consultas Consuita depedidos
--
rEtE|l¿: A J pu, 7 '°P'°°"° iÏ Precioumdad L_
Facturas Filtro íacturas
léiliíéi Lista ambetica deproducto: Lista deproductos actual Los die:productos mas caros Pedidos trimestrales
Productos por categoria
l
C-mpo: iapeaiao Subtotal: SumaICMonedaIMetE Tabla: ¿Detalles depedidos
Total: ihqrupnr por
Productos sobre elprecio medio
Orden: Mostrar:
Resumen d!VEMM D0! IÑO
cmem: i
Resumen deventas portrimestre
Subtotalesporpedido
Totales deventas porcantidad r
E Zoom
Expresion
T}
' ' y. "
l
mnuwvloo ÍSTototaI: scanamdonedaweooLx-udadlcmhda
Capítulo 1. Los sistemas de almacenamiento de Ia información
4. Añade el
campo Destinatario a
la consulta Subtotales por pedido.
Entra en modo diseño y pulsando con el botón derecho en el panel superior, selecciona la opción Mostrar Tabla. Después, añade la tabla pedido. Verás cómo aparecen las dos tablas relacionadas, en una, los campos
genéricos del pedido (FechaPedido, FechaEntrega, etc.) y en la otra, el detalle de cada uno de los pedidos. A continuación, arrastra el campo Destinatario de la tabla Pedido al panel inferior (en la tercera columna). Deïaïle: de[ELÏIZJC a
ïeaidr: FecnaEntiega
FechaEnvio i Ianeaiao
¡9ldPiodueto FoimaEnvío Cnigo 1 : DestinatarioDirecdonDe stin riunannminn'
PreeioUnidId Cantidad Descuento Subtotal. SumnCMonednIPvecioUmdad]cnntidldlu-[Descueiito]i100r100) Destinatario i; Pedidos ¡impresion Agiupnr por 3.
5. Añade elcampo Email a latabla Clientes, es longitud 75. Examina las distintas propiedades del Access en cada uno de ellos pulsando la tecla F1.
un campo de tipo Texto y de campo y consulta laayuda de
Entra en modo diseño y aparecerá la lista de campos de la tabla. Añade una nueva la y completa el nombre de campo, el tipo y la descripción. A continuación, rellena las propiedades del campo. Puedes, por ejemplo,
poner una regla de
validación para que los emails tengan el formato nombre@dominio, es decir, que tengan
una @ en el terio del email. Para poner la regla de
validación,
pon Como
*@*
en el campo Regla de
validación Nombre de! campo Tipo de datos i Idcliente Nombrecompañía Nombrecontacto Cargocoritacio Dirección Ciudad Región códPostal País Telefono Fax Email Generalaúsqueu Tamaño delcampo 75 Formato Mascara deentrada Título
Texto Texto Texto Texto Texto Texto Texto Texto Texto Texto Texto Texto
Descripción
Códigoúnicobasadoenel nombredel cliente.
Ca|leo apartado de correos. Estadoo provincia. incluyecódigo de paísode área. Incluyecodigo de paísode área. NuevoCampoañadido Propiedaues delcampo
Bases de Datos
6. Examina las relacionesde las tablas que contienela. base de datos Neptuno.
'.,¿¿u¿-¡¿ (¿te 12.1»; re:;1c.=:¿_1¡¡¿
¡l ÏW-Vï
n IaProuucto Í WIWGO u ldPeaido rlombrePvodu l l ÏÚPWÜ-W ¡atinente ldProveedor P''°U"'°3° ldEmpIeIdo ldcategovíu ("5" FechaPedndo CanhdaaPovU °°"° FecmEntrega Preuounuaao FecnaEnvío
UnndadesEnb ,_._¿_4__ unidadesEnPi ' r _' u * ' d Empleada A ua _ a Nombre Ho»aeDFODICUBUQS Cargo Tratamiento . Depenaenuas delObjlïí Fechannrnlent-
" ¿Mm N°mh"c°"p'ñ¡' N°mb"c°m'd° 4 C"°°(°""° D_"""°" (Wa
FonnaEnvio Sa?" Cargo °° al Duhnltlno p. . CIudadDemn. I Íz-ncehxseamic; Rlolonmmn" J ldc°m9"'¡¡""'°5 * ' (ogpoggmpg; . ¡qompucomnñ '¡
p.' o L DvremonDest
53' 5 ""J"
l
FecnacontratnaPmoemrm"
'l"rvr :c."--
Dirección v
1,¡¿¡¿,na I
Las relaciones dictan cómo se puede enlazar la información de diferentes tablas para obtener información más elaborada. Para ver las relaciones de la base de datos, se pulsa en Herramientas de Bases de Datos y a continuación en el botón Relaciones
7. Un formulario va siempreasociadoa las operacionesque se hacen con una tabla, a las que comúnmentese llama mantenimiento de tabla, observael funcionamiento del formulario Clientes y comenta qué operacionesson estas. Realiza al menosuna vez cada una de las operacionesque permite el formulario. Las 4 operaciones que forman el mantenimiento de una tabla son la insertión o alta, eliminación o baja, modicación o actualización y búsqueda o consulta de un registro. Todas estas opemciones se pueden realizar de forma muy sencilla y visual a través del formulario.
8.
Inserta
un nuevo
cliente
en la base de datos.
Y Insertar un cliente es muy sencillo, se puede hace-r a través del forfnularío 'C[ien¿¿3 o abñendo [a tabla (jaen-
lo.declientev Nombre decompañia WANDK Diewandemde Kuh VJÁRTH Wála Herkku WELLI Wellington Importadora
tes! y desplazarseal último mgistm_
WHKTC
whiteCloverrvlarkets
Karllablonsku
En una la vacía, se agregan los valones correspondientes a cada campo.
WRLMK WOLZA ILMSR
wllmanKala wclskaZaiazd LaCantina deSanRoman
MaruKamunen Zbyszek DIestrzenIev_ Antonio Lopez b
Registro. K 492 de 92Do
.
v Nombre delcontactRitaMuller Dnrkxo KOSKIXBÍO PaulaParents
Busur 1Lv
9. Elimina el registro correspondienteal cliente Rancho Grande. ¿Es posible?Si no es posible. ¿Qué habría que hacer para poder eliminarlo? 22
Capítulo 1. Los sistemas de almacenamiento de la información
Para eliminar el cliente, hay que buscar el cliente Rancho Grande . A continuación, se señala. la la con el botón derecho del ratón y se escoge la opción Eliminar Registro. Access mostrará una advertencia indicando que no es posible eliminar el registro puesto que hay pedidos de ese cliente. Para poder eliminar denitivamente el cliente, habría que eliminar previamente todos sus datos asociados. j Clientes -Y Nombrede compañia v Nombredel contactCargodel contacto e ¡ Jensen «re-IMM»L SergioGutiérrez Representante deventas Av.da
Nummgism n Grocery
Paula wilson
Representante agente ventas 2817i
¡"""" "WW CMI! 5gp."
i
¿nodefila...
i
MaurizioMoroni JaneteLimeira MichaelHolz Ale¡andra Camino Rancho Gun I
Asistentedeventas Strad. AsistentedeagentedeventaAv.Cr: Gerentedeventas Greni Gerentedecontabilidad Gran" l D
l
10. Modica el valor del campo Nombre de Contacto del registro correspondiente al cliente Romero y Tomillo. A continuación, modica el campo Id. de Cliente cambiándolo su valor a ROMMY. ¿Es posible modicar el Id. de Cliente? Si es posible, ¿conserva el cliente aún sus pedidos? Pana modicar el cliente, se localiza su la y se sitúa el cursor del ratón en el campo que se desea modicar. Después, cambiar el valor del campo. En este caso, es posible modicar ambos campos, el primero, el Nombre de Contacto no tiene conicto alguno puesto que no está implicado en ninguna relación. Modicar el campo Id. de Cliente podría suponer la. pérdida de pedidos si no se actualizara a su vez todos los pedidos del cliente. Access efectúa esta modicación automáticamente al cambiar el identicador del cliente, por tanto, no hay pérdida de pedidos. 3 [lie-ita Y ld. decliente Nombredecompañia Nombredel contactCargodel contacto Dir A QUEEN QueenCozlnha LúciaCarvalho Asistentede marketing Alamedad( QUlCK QUICK-Stop Horst¡(loss Gerentedecontabilidad Taucnerstre RANCH Rancho grande SergioGutierrez Representante deventas Av.del Libe RATTC Rartlesnake Canyon Grocery PaulaWilson Representante agenteventas2817Miltor REGGC Reggiani Caseifici MaurizioMoroni Asistentedeventas Stradaprev: RICAR Ricardo Adocicados JaneteLimeira Asistentede agentedeventaAv,Copacai: RichterSupermarkt MichaelHolz Gerentedeventas Grenzacher I t Romerov tomillo JoseModificado Gerentede contabilidad GranVía,1 .__*-SANTG__ __janteourmet_,_.__.__-, __._.__.Jonas Beraulisen Drooietario Erlinzskaki' Registro: I< 4 69de92 D N i. eroyTomillo 1 . l D
11. Abre la tabla de proveedores y consulta qué productos provee el proveedor Leka Trading Primero,
se localiza el proveedor en la tabla de Proveedores mediante el cuadro Buscar.
se pulsa el icono +
18AuxJOyEUX ecclesiastiques 19NewEngland SeafoodCannery 20 LekaTrading ld. deproductoNombredeproducto Tallarinesde Singapur 43 Cafede Malasia 44 AzucarnegraMalacca (Nuevo) ,_..__¡_,_
egistro: I< l de3 DH 0
A continuación,
del campo Id de Proveedor para desplegar las relaciones que tiene con Productos.
-
LeknTnding4
GuyleneNodier Gerentedevent RoboMerchant Agentedecuent Chandra Leka Propietario Categoria - CantidadporUnidav Granos/Cereales 32- 1kgpaq. Bebidas 16- latas500g Condimentos 20 - bolsas2 kg ,-.s....
».___.__i- __.
l
23
Bases de
Datos
12. Consulta la ayuda de Access y comenta los diferentes tipos de datos que puede almacenar un campo en Access (Texto, Memo, Numérico). En Access existen 10 tipos de datos básicos: Datos adjuntosComo fotos digitales. En cada registro es posible adjuntar datos no estaba disponible en versiones anteriores de Access. AutonumérícoNúmeros que Moneda Valores
se generan automáticamente para
varios archivos.
Este tipo
de
cada registro.
monetarios.
Fecha/HoraFechas yHoras HípervínculoComo direcciones
de páginas web.
MemoBloques de tezto largos ytezto que emplean formato de sería una descripción de producto detallada.
texto. Una utilidad típica
de un campo Memo
Objeto OLEObjetos OLE (objeto OLE: objeto que admite el protocolo OLE para la vinculación e incrustación de objetos. Un objeto OLE de un servidor OLE (por ejemplo, una imagen de Paint de Windows o una hoja de cálculo de Álicrosoft Excel), se puede vincular o incrustar en un campo, formulario o informe. Texto Valores
alfanuméricos cortos,
Número Valores numéricos, como pendiente para la moneda.
como un apellido o una dirección. distancias. Hay
que tener en cuenta
que existe un tipo
de datos inde-
Sí/No Valores Booleanos o Lógicos. Admiten únicamente el valor Si y el valor No.
13. ¿Qué subtípos de datos tiene el campo numérico en Access? El tipo ja. Asi,
numérico se puede dividir en subtípos dependiendo del los campos numéricos almacenarán un rango de valores
tamaño del tes), entero
campo que se seleccione. Por ejemplo, los tamaños byte (1 lango (4 bytes), simple y doble precisión (coma otante de
GEMFN Búsqueda Tamaño delcampo Entero
lar -
Lugares decimales ¡"NFO Mascara deentrada Eme) ¿'90
Titulo predeterminado Valor Doble
Id. de replica Regla devalidación Decimal i Textode validación Requerido No Indexado No Etiquetas inteligentes Alineación deltexto General
24
tamaño de campo que se elimuy distinto dependiendo del
byte), entero (2 by4y 8bytes), etc.
Capítulo 1. Los sistemasde almacenamientode 1a información 14. ¿Qué valoresadmitiría un campo numéricode 1
byte?
Como 1 byte son 8 bits, se estima que los valores numéricos que se pueden almacenar en un campo de este
tipo son del 0 al 28-1, es decir del 0 al 255. Si se insertan en el campode tipo Byte valorespor encima o por debajo del 0 y del 255, Microsoft Access los rechazará. Nótese que este cálculo se hace sin tener en cuenta el signo del valor, puesto que el valor byte, no admite signo. Para utilizar números con signo ha de escogerse el tipo Entero y pam utilizar númems reales, con. decimales, debe seleccionarse un campo en
formato de comaotante (simpleo doble) o el campodecimal.
15. Crea una tabla llamada Test con un único campo numéricode 1 byte. ¿Qué valores máximo y mínimo se pueden almacenar?Prueba a insertar registrospara vericarlo. -/ La
externos ÍHICIO Crear Datos . '.
l 3 _ TablaPlantnllas Lnstasae DISEÑO
Para crear una tabla! se pulsa en la pestaña Crear y se selec-
0mm Shmpm"! ' d!" v, .3m
. . . czona el icono Tabla. A contz-
_
nuación se pulsa el botón Ver
la línea que
Cree unanuevstablaracxa Puede a...nlos campcs uuenamente enunanueva ¡abla o con! launla envlsxa Duseño. l
_
aPanece conel nombreId y tipo autonuméïico
Tupo dedaios Numem
p' n wc' ae ae ' '
'
5mm _,Bús9us9I__AA__ ___
y se seleccionala opción Diseno Se Pone7mm? a l ta bla, y se modica
Nombre delcampo
para poner los
m: _J
mu Valor predelermmado
'Huevo Aguggr campo;
Ei,
delcampo hayqueseleccionar Byte _
Mnsaradunivldl
L:
datos del campo.En Tamaño
2
T""""° °""°° 5V F°""¡° Luoms netimnles Automnko
3'39
'
4
l
Regll aevaludauon
m ° "°"°'° Requerido
indexado
No
snsm GUDIICIGOS]
Etiquetas inteligentes Ahnenaon deltexto Genem
Para insertar los valores de prueba, se abre la tabla y se insertan varios valores. Cuando se inserta un valor
fuera del rango [0-255], se produceel siguienteerror:
Elvalor quehaespecicado nacoincide (uneltipodedatos Número deesta eolumm. Especique unvalor nuevo. Ayuda conlostipos dedatos yformatos.
25
Bases de
Datos
Práctica 1.2:
Manipulación de información en Access.
Descarga de www. garcetaes 1a basede datos de Vehículos (Vehiculosaccdb) y ábrela. Será necesario modicar algún objeto de la base de datos, por tanto guarda una copia con el nombre practicalaccdb y conserva la original para repetir la práctica cuantas VECES
CÏGSGGS.
1. ¿Cuántos modelos de vehículos hay? xr
Modelo
-censor-nro":
Se abre la tabla en modo Vista de Hoja de Datos , y, se con- 2
1A|a Romeo 147 1.6 rs16V 10s cv 3/5 Alfa Romeo 147 1.o rs 15v12o cv3/5 3,2
sulta el contador de que hay en ¡a parte ¿nm-o,
3 Alfa ROMEO 147 1.9 JTD IZÜ CV 3/5 4Alfa Romeo 1471.9 noM-JET 15o cv 3/5
paneLEn este caso,
¿el
3654 mo_
5 Alfa Romeo 147 2.0TS 16v 3/5
deos. l
. Alfa Romeo _ _ ,,_147 2.0 , TS ,16V ,_Selespeed _ _ 3/5
, , , ,
Mkagmro. @ If
Desde el modo Vista de Hoja la. tabla por el campo Consumo.
s20 Ferran 821 Ferran 1406 Maserati
Nv.
Í
_ V
de Datos, hay que ordenar de Los 5primeros modelos que Mocelo
19 Ferran
8.1
-Ïioosumo
mayor a menor (forma descendente) apanecen son los que más consumen. x -1 yFmamnnac .v._ ,JU, . -
612 agua.
20's Qrdenar de menor amayor
raao/ =43osp
13.2 il Ovenvdc mmrnmenw
F599 GTB Coupé Granspor
17,5 -_¡gopm 17.5 3 ge, L1»Agcno de tolumna, 16,5 Qculuv columnas
' 3° Hummer H2 6,2 VS 13" 17.4 1262 Jeep gnerokee 3.7V 1657 Mercedes-Ben m. 63AMG Autom. (1641 16,5
3. Inserta un nuevo modelo de automóvil completando todos los campos. Se pulsa campo Id, se rellena juanma Id -I
"
el icono insertar registro y, a continuación, se rellenan todos los datos menos el que es autonumérico ypor tanto se rellena automáticamente. El campo ñmagen haciendo doble clic sobre el dato adjunto yse selecciona una imagen de tipo bmp. Marca -
3652 Volvo 3653 volvo 3554 votvo 3655 Ferrari Huevo,-
7
7¡Mooeio
y
N-
Consumo -1 Emnsrones - nt
xcsc vsAWD AUT 7A 13.5 xcsc vsAWD AmEXECUTPJE/SDOR 13.3 xcso vsAWD AUT 133317 Tesïarossa 22.27
322 317
d 7A
J,
Regístra N4365? M3655 '0¡
J. m;
26
Capítulo 1. Los sistemas de almacenamiento de la información 4. Crea y ejecuta una consulta para ver los automóviles de la marca Seat, repite el procedimiento para los automóviles de la marca Toyota y Volkswagen.
¿miente nao
¿QmmrooS"d'mumfmh ¿Desea ma wnsuudeoetaloeoremwm?
(QHSUKBS Nededeádenúsdeuwmuhodia.
1-: llmmaem 4, l Imagenoeïlags flmagmyneumg l gImagenFneTmeSmw 3, es posible que la interpretación del problema sea incorrecta. Incluso si aparecen relaciones de grado 3, intenta descomponerlas en varias de grado 2 para simplicar tu modelo. Eso SÍ, asegúrate de que no es posible descomponerlas en varias de grado 2 sin perder semántica.
2.3.4. Participación La participación de una ocurrencia de una entidad, indica, mediante una pareja de números, el mínimo y máximo número de veces quepuede aparecer en la relación asociada a otra ocurrencia de entidad. Las posibles participaciones son: Participación Signicado Mínimo cero,
Ináximo uno
Mínimo uno.
máximo uno
Mínimo cero, máximo n (Muchos) Mínimo uno, máximo n (l\Iuchos) Las reglas que denen la participación de una ocurrencia en una relación son las reglas de negocio, es decir, se reconocen a través de los requisitos del problema. 45
Bases de
Datos
La notación que se utiliza para expresar las participaciones en el diagrama entidad relación es poner al lado de la entidad correspondiente, la pareja de números máximo y mínimo de participaciones. Por ejemplo, los empleados pueden trabajar para varios
proyectos, opueden estarde vacaciones(sin proyecto).Por otro lado, enun proyecto trabajan de 1 a varios trabajadores. En este caso, la participación de proyecto es
de (O,n), puesto que un empleado puede tener asignados de0 a n proyectos. La participación del empleado esde (1,11)puesto queen un proyecto puedehaber de 1 a n empleados. Deesta manera,se indicaal lado de la entidad proyecto,el par (0,n) y al lado de la entidad empleado el par (Ln).
Figura 2.7: Participaciones de ocurrencias en una relación.
Actividad 2.2: En un supermercado hay productosorganizados en categorías (frutas, ultramarinos, carnes, pescados,etc.). Cada producto pertenece a una única categoría, ypuede haber categorías que todavía no tengan ningún producto asignado, sin embargo, no puede haber productos sin categoría. Calcula las participaciones de cada entidad en la relación Producto Pertenece a Categoría Un producto puede ydebe pertenecer a una única categoría (mínimo 1 ymáximo 1), por tanto la participación de categoría en la relación con el producto es de (1,1). Auna categoría pueden pertenecer muchos productos (máximo n), ypuede no tener productos (mínimo 0), por tanto, los productos participan en las categorías con cardinalidad (0.71).
n--.
46
..-.-¡
Capítulo 2. Diseño lógico relaciona]
Actividad 2.32 Laspáginas web contienen controles de muchostipos (campos de texto, listas desplegables, etc.). Si se quierealmacenar enuna basede datos,cada página web, qué tipos de controles tiene. ¿qué participaciones habría que asignar? Justica tu respuesta respondiendo a preguntas del tipo ¿un control, (por ejemplo, un cuadro de texto), en cuántas páginas puede estar como máximo y mínimo?
Actividad 2.4: Los clientes pueden realizar pedidosa travésde susrepresentantes de ventas. Indica las entidades que hay, relaciones y sus respectivas participaciones.
2.3.5. Cardinalidad La cardinalidad de una relación se calcula a través de las participaciones de sus ocurrencias en ella. Se toman el número máximo de participaciones de cada una de las entidades en la relación. Por ejemplo, la relación organiza de la actividad 2.2, tendría una cardinalidad de 1:N, puesto que por el lado de las categorías, el máximo
de (1,1) es 1,y por el lado de los productos, el máximo de (O,n) esN.
¡y 1:N
¡un
¿Ars 30m5 Figura 2.8: Cálculo de la Cardinalidad de una relación. De esta manera, se clasican las siguientes cardinalidades: a Cardinalidad 1:1 Esta cardinalidad especica que una entidad A puede estar vinculada mediante una relación a una y solo una ocurrencia de otra entidad B. A su vez una ocurrencia de la entidad B solo puede estar vinculada a una ocurrencia de la entidad A. Por ejemplo, se puede limitar el número de directores de departamento mediante una relación 1:1. Así, un empleado solo puede ser jefe de un departamento, y un departamento solo puede tener un jefe. 47
Bases de
Datos
contabilidad
administración informática rrhh
Figura 2.9: Ejemplo de cardinalidad 1-1.
ICardinalidad
1:N (o 1:Muchos) Esta relación especica que una entidad
A puede estar vinculada mediante una relación a varias ocurrencias de otra entidad B. Sin embargo, una de las ocurrencias de la entidad B solo puede estar vinculada a una ocurrencia. de la entidad A. Por ejemplo, un representante gestiona las carreras de varios actores, y un actor solo puede tener un representante .
fernando
Figura 2.10: Ejemplo de cardinalidad 1-N.
ICardinalidad
M:N (o
Muchos:Muchos) O
también NzM, estacardinali-
dad especica que una entidad A puede estar vinculada mediante una relación a varias ocurrencias de la entidad B. ya su vez, una ocurrencia de la entidad B puede estar vinculada a varias de la entidad A. Por ejemplo. un empleado 48
Capítulo 2. Diseño lógico relacional puede trabajar para varios proyectos; al mismo tiempo, en un mismo proyecto, pueden trabajar varios empleados.
Figura 2.11: Ejemplo de cardinalidad N-M. Como puede observarse enlas guras anteriores, la notación para representar el tipo de relación según su cardinalidad, consiste en escribir el tipo de cardinalidad justo encima del rombo. Existen numerosas alternativas a esta nomenclatura, siendo muy típicas las dos siguientes: u Puntas de echa: En esta notación. la línea de la relación que termina en echa, indica la
rama N
de la
cardinalidad de
la relación.
Figura 2.12: Ejemplo de notación puntas
de echa.
n Notación classic de MySQL Workbench: En esta notación, las relaciones se expresan con un pequeño rombo, rellenando en negro la mitad de la gura, en 7 el lado de la entidad cuya cardinalidad es l\ Equlpm
¡asquoo INT Name vuaonnus)
l
Jugador icuuqanor INT Not-mn VARCHARQS) DasalINT Eutincsjcmho INT(FK)
Figura 2.13: Ejemplo de Iiotación classic de MySQL
Workbench. 49
Bases de
Datos
Actividad 2.5: Hay multitud denotaciones distintas para realizarlos diagramas entidad relación. Todas ellas, tratan de expresar los conceptos expuestosen estelibro, pero de diferentes formas y con diferentes elementos grácos. Busca en Internet otros tipos de notaciones para realizar diagramas entidad relación. Puedes buscar, entre otros, las notaciones de Alartin, [DEF 1X o Pies de cuervo (Crows foot).
2.3.6. Cardinalidad Para calcular
de relaciones la Cardinalidad
de una
no binarias
relación ternaria
se tomará
una de
las tres
entidades y se combinan las otras dos. A continuación, se calcula la participación de la entidad en la combinación de las otras dos. Posteriormente, se hará lo mismo con las otras dos entidades. Finalmente, tomando los máximos de las participaciones se generan las cardinalidades.
CardinaIidad=max(0,1):max(1,1):max(0,n) =1:1:N EMÉÉISA
EIÉEÏZENTE
Figura 2.14: Cardinalida.d de una relación ternaria. Por ejemplo, en la gura 2.14 se distinguen tres participaciones, la que se produce entre empresa y auditora-expediente, la que se distingue entre auditora y empresaexpediente, y por último la de expediente con auditora-empresa: - Una empresa ¿Cuántosexpedientes puede tener con una auditora? Puede tener un mínimo de 0 y un máximo de n. Participación de Empresa (Ü,n). IUna. auditora ¿Cuántos expedientes puede tener con una empresa? Puede tener un mínimo de O y un máximo de 1. Participación de Auditora (0,1). u Un expediente ¿A cuántas empresas auditadas por la auditora puede pertenecer? Un expediente solo puede pertenecer a una empresa auditada (1,1), por tanta Participación de Expediente (1.1). 50
Capítulo 2. Diseño
lógicorelaciona]
Actividad 2.5: Calculala cardinalidad dela siguiente relaciónternaria:
Hay que contestar a las siguientes preguntas: ¿Cuántos autores puede tener un determinado libro publicado en una detenninada editorial?
¡Mínimo 1, máximo n, participaciónde Autor ( 1,n). ¿Cuántos libms puede tener un detenninado autor publicados en una determinada editorial? Mínimo 0, máximo n, participación de Libro (0,11). ¿En cuántas editoriales puede un detenninado autor publicar un mismo libm? Múzimo 1, máximo I. Participación de Editorial (1,1). Tomando los máximos de cada participación se obtiene que la cardinalidad de la relación de de 1:N:N
o Actividad 2.72 Calculala cardinalidad delas siguientes relaciones binarias: I Hombre está
casadocon Mujer, en una sociedad1nonogámica.
I Hombre está
casadocon Mujer, en una sociedadmachista poligámica.
- Hombre está
casadocon Mujer, en una sociedad poligámica
liberal.
- PescadorpescaPez. - Arquitecto diseña I
Piezas
forman
I Turista viaja I Jugador juega
Casa. Producto.
Hotel. en Equipo.
u Político gobierna en País.
51
Bases de
Datos
Actividad 2.8: Calcula la Cardinalidad de lassiguientes relaciones ternarias: IMecánico
arregla Vehículo en Taller.
n Alumno cursa
Ciclo en
IVeterinario
Instituto.
administra [bledicación
2.3.7. Cardinalidad
de las
al Animal.
relaciones reexivas
En las relaciones reexivas, la misma entidad juega dos papeles distintos en la relación. Para calcular su Cardinalidad hay que extraer las participaciones según los dos roles existentes. Por ejemplo, en la relación reflexiva Es jefe, la entidad Empleado aparece con dos Roles. El primer rol es el empleado como jefe, y el segundo rol el empleado como subordinado. Así, se puede calcular las participaciones preguntando: I¿Cuántos subordinados puede tener un jefe? Un jefe puede tener un mínimo de 1 y un máximo de n: (Ln) I¿Cuántos jefes puede tener un subordinado? Un mínimo de O (un empleado sin jefes sería el responsable de la empresa) y un máximo de 1 (suponiendo
una estructura, típicamente piramidal): (0,1). Por tanto, la relación sería de Cardinalidad 1:N 1:N
(0,1)
Figura 2.15: Cardinalidad de una relación reflexiva.
52
Capítulo 2. Diseño lógico relacional
Actividad 2.9: Justica cuál seríanlas participaciones y la cardinalidad dela siguiente relación, teniendo en cuenta que:
n Una gura puede contenerse así misma (como enel ca.sode los fractales). IUna
gura puede estar formada por múltiples tipos distintos de guras.
2.3.8. Atributos
yDominios
Los atributos de una entidad son las características o propiedades que la denen como entidad. Se representanmediante elipses conectadas directamente a la entidad. Por ejemplo, para representar la entidad HOTEL. son necesarias suscaracterísticas, esto es, el número de plazas disponibles, su dirección, la ciudad donde se encuentra, etc.
Figura 2.16: Ejemplo de atributos. Atributo Clave
En la gura anterior, aparece el atributo código, subrayado. Este atributo se denomina clave, y designa un campo que no puede repetir ninguna ocurrencia de entidad. Se dice. que este campo identica unívocamente a una entidad, es decir, 53
Bases de
Datos
que con la sola referencia a un campo clave se tiene acceso al resto de atributos de forma directa. Ejemplo: El DNI es el campo clave de una persona, pues ninguna persona tiene el mismo DNI. Por tanto, si se especica el DNI de esa persona se sabe exactamente a qué ocurrencia de persona se reere. Todas las entidades fuertes deberían tener, al menos, un atributo clave. Nótese que una entidad puede formar la clave mediante varios atributos, en este caso, se dice que la clave de la entidad es la suma de esos atributos y que la entidad tiene una clave compuesta. Si la clave está formada por un único atributo se dice que es atómica. Por ejemplo, para identicar de forma única una oferta de trabajo se necesitaría el nombre del puesto y el nombre de la empresa que lo oferta. Atributo de
relación
Un atributo de relación es aquel que es propio de una relación y que no puede ser cedido a las entidades que intervienen en la relación. Por ejemplo, un mecánico repara un vehículo, la reparación se realiza en una determinada fecha.
Figura 2.17: Ejemplo de atributo de relación. Dominios
Cada una de las características que tiene una entidad pertenece a un dominio. El dominio representa la naturaleza del dato, es decir, si es un número entero, una cadena de caracteres o un número real. Incluso naturalezas más complejas, como una fecha o una hora (con minutos y segundos). Por ejemplo, los siguientes atributos de la entidad empleado pertenecen a los siguientes dominios:
Atributo DNI Cadena Nombre Cadena
de Caracteres de longitud 10 de Caracteres de longitud 50
Fecha_Nacin1iento Fecha
Dirección Cadena Sueldo Números
de Caracteres de longitud 100 reales
Número de hijos Números enteros Departamento Departamentos 54
Capítulo 2. Diseño lógico relaciona] Si un dominio se especica mediante el tipo de datos, como en el caso de DNI, Nombre o Fecha_Nacimiento se dice que se dene por zïntensión. Si se especica mediante un conjunto de valores, como en el dominio Departamentos, que puede tener los valores (RRHH, Informática. Administración o Contabilidad), la definición del dominio es por extensión.
2.3.9. Tipos
de atributos
Se pueden clasicar los atributos según las siguientes restricciones: Atributos obligatorios:
Un atributo debe tomar un valor obligatoriamente.
Atributos opcionales: Un atributo puede no tomar un valor porque sea desconocido en un momento determinado. En este caso, el atributo tiene un valor nulo.
Atributos compuestos: Un atributo compuesto es aquel que se puede descomponer en atributos más sencillos, por ejemplo, el atributo hora_de_salida se puede descomponer en dos (hora y minutos). Atributos univaluados:
Un atributo que toma un único valor.
Atributos multivaluados: Estos atributos pueden tomar varios valores, por ejemplo el atributo teléfono puede tomar los valores de un teléfono móvil y un teléfono jo. Atributo derivado: Son aquellos cuyo valor se puede calcular a través de otros atributos. Por ejemplo, el atributo Edad, se puede calcular a partir de la fecha de nacimiento de una persona. Al igual que con la mayoría de las notaciones, no existe unanimidad a la hora de dibujar en un diagrama los tipos de atributos. Una de las más extendidas entre los diseñadores de bases de datos es la siguiente:
Figura 2.18: Notación para los distintos tipos de atributos. 55
Bases de
Datos
2.3.10. Otras
notaciones para
los atributos
Al igual que para las entidades, los atributos tienen multitud de notaciones, y, aunque la original adoptada por Peter Chen es la más usada hasta ahora, por simplicar la construcción de mapas a través de herramientas software, se opta por usar otras notacíones que producen mapas más manejables. Por ejemplo, la herramienta MySQL Workbench utiliza una sintaxis muy similar a la que usa la notación UML para representar las características de un objeto: Nombre de
la
entidad Dominio Eqniposjcqubo INT
(PK)
Nombre del
atributo
Figura 2.19: Otras formas de representar atributos
Actividad 2.1ÜZ Justica qué tipode atributosson lossiguientes atributos de la entidad
Persona:
n Fecha de Nacimiento (p.ej. 24/11/1976) ILugar
de Nacimiento (p.ej. Zaragoza)
- Edad (p.ej. 36 años) IEsMayorDeEdad nDNI
(p.ej. 55582739A)
nTeléfonos - Apellidos
56
(p. ej: Sí)
(p.ej. 925884721, 657662531)
Capítulo 2. Diseño lógico relacional 2.3.11. Las
entidades débiles
Como se ha expuesto anteriormente, las entidades débiles dependen de una entidad fuerte mediante una relación. La relación que une ambas entidades también es débil, puesto que también desaparece si desaparece la entidad fuerte. En estos casos, la relación tiene una dependencia que puede ser de dos tipos: nDependencia de existencia: Este tipo de dependencia.expresa que, las ocurrencias de una entidad débil, no tienen ningún sentido en la base de datos sin la presencia de las ocurrencias de la entidad fuerte con la que están relacionadas. Por ejemplo, las transacciones que se dan en una cuenta bancaria, no tienen sentido si no existe la cuenta bancaria a la que están asociadas. CÏBIIÏA EAN
CAE.
Figura 2.20: Ejemplo de entidad débil con dependencia de existencia. - Dependencia de identicación: Este tipo se produce cuando, además de la dependencia de existencia, la entidad débil necesita a la fuerte para poder crear una clave, de tal manera que pueda completar la identicación de sus ocurrencias. Por ejemplo, una empresa fabricante de software crea aplicaciones:
1. La compañía seidentica por su nombre (por ejemplo, Microsoft). 2. Las aplicaciones se identican por su nombre comercial, por ejemplo (Office). 3. Cada compañía de software pone un nombre a ca.dauna de sus aplicaciones.
c: M; ANIA :E
: ïTwAiífz-Z
Figura 2.21: Ejemplo de entidad débil con dependencia de identicación. De esta forma puede ocurrir que haya dos aplicaciones con el mismo nombre y que
pertenezcan ados compañíasdistintas (Ofce de Microsoft y Office de Sun). En 57
Bases de
Datos
este caso para identicar a cada aplicación de forma única, hace falta el nombre de la aplicación y además, el nombre de la compañía. Así, Aplicación depende en identicación de la Compañía yel nombre de la aplicación es una clave débil. Se expresa de la siguiente forma: Una vez más, para representar las dependencias, cada herramienta usa su propia notación. Por ejemplo, en el caso de MySQL Workbench, no diferencia entre enti-
dades fuerteso débiles (las llama a todas tablas). y crea las relaciones conlíneas discontinuas encaso deno tener dependencia deidenticación (non identifying relationship), y con línea continuas en caso de tener dependenciade identicación (identifying relationship). Rel-ciónn
'°=°"°°"' --Norma vmoweids)
i___-_'
¡cuenta Banca: INT Codigosuursal VARCJ-MRu) 000m Entidad VARCHÁRM) Doüftoi VAÉ-MÑ?) Nuneroctiena VAÉHAHW) DN JldarVARG-IARUO)
Figura 2.22: Ejemplo
"°"°°"°.'°° ¡kmlucmn
Relación con dependencia de identicación
idfrmsaodon INT Cüid DECNAL Debe-IBM VAHZHAHH Cuenta BuuajtnumtaBancaria ¡NT (PK)
de notación. Dependencias en MySQL Workbench.
Actividad 2.11: ¿Qué tipo de relación dedependencia tienen las siguientes entidades?
IUn toro (entidad débil) pertenecea una ganadería (entidadfuerte). Al toro se le identica por el número de toro, y el nombre de su ganadería, puesto que puede haber varios toros con el mismo número, pero pertenecientes a distintas ganaderías.
IEn el accesoal parking de una empresa unempleado (entidadfuerte) tiene un vehículo (entidad débil).
58
Capítulo 2. Diseño lógico relacional
El consejo del buen administrador. .. Muchos diseñadores se abstraen del hecho de tener entidades fuertes y débiles y, tal y como hace A-IySQL Workbencli, no distinguen entre entidades fuertes y débiles. En general, es buena idea simplicar el diseño (losofía KISS - Keep it simple, sir), pero se ha de ser consciente de la pérdida de semántica que implica.
Actividad
2.12: Descargael software DIA
para la creaciónde diagramasde
diversos tipos. Puedes encontrarlo de forma gratuita en la página web http: //sourceforge .net/projects/dia-installer/.
"5DiagramILdiI (causeiswinwigng) -dua
Arthivo Editar1er Lupi: QbjetosSelecciona!
üÜ
iii]
QC
Crea un diagrama nuevo y con los símbolos
°°9'°'"°1-°° " c.-. delosdiagramas entidad relación delanota°
ciónChen(ER)modela la relación Clienteadquiere-Producto con los atributos que se te ocurran. Identica el icono de cada gura con los símbolos Entidad, Entidad Débil, Atribu-
to (con sus múltiples tipos) y Relación.
2.4.
El modelo E
/ R ampliado
La primera concepción del modelo entidad relación tuvo, por las limitaciones tecnológicas de la época, un alcance bastante limitado, que, con los años, se ha ido desarrollando hasta alcanzar un nivel satisfactorio para los diseñadores de bases de datos. El modelo Entidad-Relación Extendido, o Ampliado, incorpora todos los elementos del modelo entidad relación incluyendo los conceptos de subclase, superclase junto a los conceptos de especialización y generalización.
2.4.1.
Generalización
Una entidad E cada
ocurrencia
y Especialización
es una generalización de un grupo de entidades E1, E2, de cada
una
de esas entidades
es también
una
ocurrencia
En, si de E.
59
Bases de
Datos
GENERALIZACIÓN ESPECIALIZACIÓN
Figura 2.23: Generalización y Especialización. Todas las propiedades de la entidad genérica E son heredadas por las subentidades. Además, cada subentidad tendrá sus propios atributos independientes de la generalización. Las subentidades son especializaciones de la entidad general, se puede decir que las subentidades o subclasestienen una relación del tipo ES UN con la entidad padre o superclase. La relación de generalización se representa mediante un triángulo ísósceles pegado por la base a la entidad superclase. En la gura siguiente Empleado es la superclase y los directivos, comerciales y técnicos son subclases. En la relación se adjunta un atributo que indica cómo debe interpretarse la relación de la superclase con la subclase. La generalización Empleado que puede ser un directivo, un técnico o un comercial. Cada subentidad tiene sus propios atributos yrelaciones, pero todas
heredan losatributos nombre y DNI de la entidad padre (Empleado).
IIF JITZTC
Figura 2.24: Ejemplo de generalización. 60
Capítulo 2. Diseño lógico relaciona] Tipos de
especialización
Se puede agregar más semántica al diagrama entidad relación extendido co1nbinando los siguientes tipos de especialización: IEspecialización Exclusiva: En este caso, cada una de las ocurrencias de la superclase solo puede materializarse en una de las especializaciones. Por ejemplo, si un empleado es un directivo, no puede ser un técnico o un comercial. Para representar esta especialización exclusiva, el triángulo de la jerarquía lleva un arco.
Figura 2.25: Especialización exclusiva. IEspecialización Inclusiva: Se produce cuando las ocurrencias de la superclase pueden materializarse a la. vez en varias ocurrencias de las subclases. En este caso, el empleado directivo, podría ser también técnico y comercial. Se representa sin el arco, como en la gura 2.24. IEspecialización Total: Se produce cuando 1a entidad superclase tiene que materializarse obligatoriamente en una de las especializaciones. Se representan añadiendo un pequeño círculo al triángulo de la generalización:
Figura 2.26: Especialización Total. n Especialización Parcial: La entidad superclase no tiene por qué materializarse
en una de las especializaciones (esopcional). Se representa sin el pequeño circulo, como en la gura 2.24. 61
Bases de
Datos
Actividad
2.13: Crea un E/R para almacenar datos delos distintostipos de
ordenadores que puede tener una organización. Clasifícalos en Sobremesa, Portátiles y Servidores, y asigna correctamente los atributos: N°Serie, Procesador, Memoria, CapacidadDisco, TipoBatería, DuraciónBatería, N°Procesadores y TipoProxy.
2.5. Construcción
de un diagrama E/
R
A cont.inuación se presenta una guía metodológica. para crear un entidad relación a partir de un análisis de requisitos: 1. Leer varias veces el problema hasta memorizarlo.
2. Obteneruna listainicial decandidatos aentidades, relaciones y atributos.Se realiza siguiendo los siguientes consejos: n Identicar las entidades. Suelen seraquellos nombres comunes queson importantes para el desarrollo del problema. Por ejemplo, empleado, vehículo, agencia, etc. En principio, todos los conceptos deberían estar perfectamente especicados en el documento de requisitos, pero, de no existir el documento ERS, quizá solo se disponga de extractos de conversaciones con usuarios en las que se hacen referencias vagas a ciertos objetos, teniendo que hacer un importante ejercicio de abstracción para poder distinguir si son entidades, atributos, etc. Por ejemplo, un mecánico que tan solo habla de ciertos modelos de vehículos pertenecientes a determinadas personas, pero que nunca hace referencia a los vehículos Diesel que serán fundamentales identicar para el correcto diseño de la base de datos. - No hay que obsesionarse enlos primeros pasos por distinguir las entidades fuertes de las débiles. Si es trivial, se toma nota de aquellas que parezcan claramente entidades débiles. De lo contrario, se apuntan como entidades sin especicar si son fuertes o débiles. n Extraer los atributos de cada entidad, identicando aquellos que pueden ser clave. Se suelen distinguir por ser adjetivos asociados a un nombre común seleccionadas como entidades. Por ejemplo, color, que es un adjetivo, puede ir asociado a la entidad vehículo. Además, se debe establecer el tipo de atributo, seleccionando sies opcional, obligatorio, multivaluado, compuesto o derivado. Si es compuesto se indica su composición, y si es derivado, cómo se calcula. Es bastante útil apuntar sinónimos utilizados para el atributo para eliminar redundancias. 62
Capítulo 2. Diseño lógico relacional IEs fácil identicar las generalizaciones si se obtiene un atributo que es aplicable a más de una entidad. En ese caso, se puede intentar aplicar
una generalización /especialización,indicando cuáles la superclase ycuál las subclases. Además, se deben especicar los tipos de especialización
(inclusiva, exclusiva,parcial, total). IIdenticar los atributos de cada relación. Se suelen distinguir, al igual que los de entidad, por ser adjetivos, teniendo en cuenta que para que sean de relación, solo deben ser aplicables a la relación y no a ninguna de las
de las
entidades relacionadas.
ITambién es posible que los nombres comunes contengan muy poca información y no sea posible incluirlas como entidades. En este caso, se pueden seleccionar como atributos de otra entidad, por ejemplo, el autor de un libro puede ser una entidad, pero si solo se dispone del nombre del autor, no tiene sentido incluirlo como
una entidad
con un único atributo.
En este caso, se puede incluir como atributo de la entidad Libro. n Extraer los dominios de los atributos. Siempre es buena práctica, ir apuntando, aunque en el diagrama entidad relación no se exprese explícitamente, a qué dominio pertenece cada atributo. Por ejemplo, el Salario pertenece a los números reales (Salario: Reales), o el color de un objeto
puede serverde, amarillo o rojo (Color: Verde,Amarillo, Rojo). - Identicar las relaciones. Se puedenver extrayendo los verbos del texto del problema. Las entidades relacionadas serán el sujeto y el predicado unidos por el verbo que hace de relación. Por ejemplo, agente inmobiliario vende edicio. En este caso el agente inmobiliario representaría una entidad el edicio la otra entidad y vende sería la relación. IUna vez identicada las relaciones, hay que anar cómo afecta la relación a las entidades implicadas. Este es el momento de distinguir las fuertes de las débiles haciendo preguntas del tipo ¿tiene sentido esta ocurrencia de entidad si quito una ocurrencia de la otra entidad? ¿se pueden identicar por sí solas las ocurrencias de cada entidad? Si a la primera pregunta la respuesta es negativa, las dos entidades son fuertes, si no, alguna de ellas es débil. Si la respuesta a la segunda espositiva, dependerán solo en existencia, si es negativa, alguna de las dos depende en identicación de la otra.
3. Averiguar las participaciones y cardinalidades. Generalmente se extraen del propio enunciado del problema. Si no vienen especicadas, se elegirá la que almacene mayor cantidad de información en la base de datos. 63
Bases de
Datos
4. Poner todos los elementos listados en el paso 2en un mapa y volver a considerar la pertenencia de cada uno de los elementos listados a su categoría. Así, se replanteará de nuevo si cierto atributo es una entidad, o si cierta entidad puede ser una relación, etc. 5. Renar el diagrama hasta que se eliminen todas las incoherencias posibles, volviendo a los pasos anteriores en caso de encontrar algún atasco mental o conceptos dudosos que diculten la continuación del análisis. Es bueno, en estas circunstancias discutir con compañeros u otros expertos sobre el diseño realizado.
6. Si hay dudas sobre el enunciado o sobre los requisitos, o se han quedado algunas cosas en el tintero, será necesario acudir al responsable del documento ERS o volver a concertar una entrevista con el usuario para aclarar conceptos. En este caso, se aclararán las dudas y se volverá al punto 2 para reiniciar el análisis.
¿Sabías que . . . 7En muchas ocasiones, cuando nose sabe cómo continuar, o no se encuentra la solución de un problema, basta con explicarle el problema a otra persona, aunque esa persona no tenga ni idea del tema o no sea experta en la materia. Automáticamente, la solución aparece. Se ha iniciado inconscientemente un proceso mental para ordenar las ideas que ha desembocado en la resolución del problema.
2.6. El
modelo relacional
El objetivo principal del modelo relacional es proteger a.l usuario de la obligación de conocer las estructuras de datos físicas con las que se representa la información de una base de datos. Desvincular estas estructuras de datos. que son complejas por naturaleza, del diseño lógico (Modelo Relacional), permite que la base de datos se pueda implementar en cualquier gestor de bases dedatos relacional (Oracle, MySQL, DB2, etc.) A continuación se enumeran las características fundamentales del modelo relacional: n La
relación es
el elemento
fundamental del
modelo. Los
usuarios ven
la base
de datos como una colección de relaciones. Estas relaciones se pueden operar mediante el Algebra Relacional. -El modelo relacional es independiente de la forma en que se almacenan los datos y de la forma de representarlos, por tanto, la base de datos se puede 64
Capítulo 2. Diseño lógico relacional implementar en cualquier SGBD y los datos se pueden gestionar utilizando Cualquier aplicación gráca. Por ejemplo. se pueden manejar las tablas de una base de datos MySQL u Oracle con Microsoft Access. Véase práctica 5.3. IAl estar fundamentado en una fuerte base nlatemática. se puede demostrar la ecacia del modelo a la hora de operar conjuntos de datos. 2.6.1. Las
relaciones en
el modelo
relacional
Se dene una relación como un conjunto de atributos. cada uno de los cuales pertenece a un dominio, y que posee un nombre que identica la relación. Se representa
grácamente por una tabla con columnas(atributos) ylas
(tuplas). El conjunto de
tuplas de una relación representa el cuerpo de la relación y el conjunto de atributos y el nombre representan el esquema.
Relación:lmpue5roVehículos Nombte jrE maní
m Teléfonooueño Seat IbizaTDI 1.9einer-w Volskwaen Polo TDI 1.o
1 918773621 4231mo
Renault ;La unaCoupé m
929883762 741mm
Fiat Punto 1.o 646553421
'
923mm:
Figura 2.27: Denición de
Relación.
¿Sabías que . . . 7Actualmente,los modelos lógicos más extendidos con diferencia son el modelo relacional y los diagramas de clases que utiliza UML para modelar las bases de datos orientadas a objetos. El modelo relacional de Codd se ajusta a la perfección al modelo entidad/relación de Chen creado en la fase de modelización conceptual. No así el modelo de UML, que requiere técnicas más complejas y especícas como los casos de uso o los diagramas de transición de
2.6.2. Otros
estados.
conceptos del
modelo relacional
A continuación se denen los conceptos necesarios para transformar el modelo conceptual (diagrama entidad-relación) en el modelo lógico (modelo relacional). uAtributo:
Características que describen a una entidad o relación.
IDominio:
Conjunto de valores permitidos para un a.tributo. Por ejemplo,
cadenas de caracteres. números
enteros, los valores Sí o No, etc. 65
Bases de
Datos
- Restricciones de semántica: Condiciones que deben cumplir los datos para su correcto almacenamiento. Hay varios tipos: o Restricciones de clave: Es el conjunto de atributos que forma única
identican de
a una entidad.
o Restricciones de valor único (UNIQ UE): Es una restricción que impide que un atributo tenga un valor repetido. Todos los atributos clave cumplen esta restricción. No obstante es posible que algún atributo no sea clave y requiera una restricción de valor único. Por ejemplo, el número
de bastidor de un vehículo noes clave(lo es la matrícula) y sin embargo, no puede haber ningún número de bastidor repetido. o Restricciones de integridad referencial: Se da cuando una tabla tiene una referencia a algún valor de otra tabla. En este caso la restricción exige que exista el valor referenciado en 1a otra tabla. Por ejemplo, no se puede poner una nota a un alumno que no exista. o Restricciones de dominio: Esta restricción exige que el valor que puede tomar un campo esté dentro del dominio denido. Por ejemplo, si se establece que un campo DNI pertenece al dominio de los números de 9 dígitos +1 letra , no es posible insertar un DNI sin letra, puesto que la restricción obliga a poner al menos 1 letra. o Restricciones de vericación (CHECK): Esta restricción permite comprobar si un valor de un atributo es válido conforme a una expresión. o Restricción de valor NULO (NULL o NOT NULL): Un atributo puede ser obligatorio si no admite el valor NULO o NULL, es decir, el valor falta de información o desconocimiento. Si admite como valor el valor NULL, el atributo es opcional. o Disparadores o triggers: Son procedimientos que se ejecutan para hacer una tarea concreta en el momento de insertar, modicar o mación de
eliminar infor-
una tabla.
o Restricciones genéricas adicionales o aserciones (ASSERT). Permite validar cualquiera de los atributos de una o varias tablas. IClave: Una clave es un conjunto de atributos que identican de forma única una ocurrencia de entidad. En este caso, las claves pueden ser simples (atómicas) o compuestas. Además, hay varios tipos de clave:
o Superclave:Identican a una entidad (pueden serno mínimas).Por ejemplo, para un empleado, las superclavesposibles son el DNI, o el DNI+Nombre. o el DNI+Nombre+Numero de la Seguridad Social, etc. 66
Capítulo 2. Diseño lógico relacional o Clave Candidata: Es la mínima Superclave (en el caso anterior el DNI, O el Número de la seguridad social). o Clave Primaria: Es la clave candidata elegida por el diseñador como cla-
ve denitiva (en el ejemplo anterior se elegiría el DNI por ser la. más representativa paraun empleado). o Clave foránea: Es un atributo de una entidad, que es claveen otra entidad. Por ejemplo. la nota en un módulo de una asignatura corresponde a un DNI, que es clavede Otra entidad. En este casoel DNI es una clave foránea en la
tabla notas.
2.7. Transformación
de un diagrama E / R al mo-
delo relacional
MODELO CONCEPTUAL (CHEN) *MODELO
RELACIONAL (CODD)
Figura 2.28: Transformación del modelo E/ R en relacional. Para realizar esta transformación se siguen las siguientes reglas: Transformación de
entidades fuertes
Para cada entidad A, entidad fuerte. con atributos ((11,612, .. .,a,,) se crea una tabla A (con el nombre en plural) con n Columnas correspondientes a los atributos de A, donde cada la de la tabla A corresponde a una ocurrencia de la entidad A. La clave primaria de la tabla A la forman los atributos clave de la entidad A.
Figura 2.29: Paso a tablas de entidades fuertes. En el diagrama E-R de la gura 2.29,
las tablas generadas son:
CATEGORIAS 67
Bases de
Datos
Transformación de
entidades débiles
Para cada entidad débil D, con atributos Cd1,Cd2,. .. ,cd¿,d¿+1,dt+2,.. .,d,,, donde cdl, Cdg,.. .,cd, son los atributos clave de la entidad D, y una entidad fuerte F de la
que dependeD con atributos clave (c f1,c f2,. . .,cfm): se creauna tabla D con m+n columnas Cd1,Cd2,.. . ,cd,,, d¿+1,d¿+2, .. .,d,,,cf1,cf2, .. ., cfm correspondientes a los atributos de D y a los atributos clave de F. Si solo tiene dependencia de existencia, la clave primaria de la tabla Dserá la unión de los atributos clave de la entidad D. Si la entidad débil D, además, tiene una dependencia de identicación, la clave primaria de la tabla D será. launión de los atributos cd¡, Cdg,. . . , cdt, cfl, Cfg, .. .,cf,,,, es decir, la unión de los atributos clave de la entidad débil D y de la entidad fuerte F.
Figura 2.30: Paso a tablas de una entidad débil.
En el diagrama E-Rde la gura 2.30. las tablasgeneradas son3: CUENTAS_BANCARIAS(N°Cuenta, saldo) TRANSACCIONES(Código,Tipo,Cantidad) Transformación de
relaciones
Por cada relación R entre entidades
E1, E2, . . ., EN.
La clave de E,- es C,-=a,-1,a,2, . . .,a,-N. Regla general para las relaciones: se crea una tabla con todos los campos claves de las entidades relacionadas y los atributos de la relación. La clave primaria de la tabla generada es la suma de los atributos claves de las entidades relacionadas, y cada clave incorporada a la tabla. será una clave foránea que referencia a la tabla de la que se importa. Por ejemplo, en la gura 2.31 hay una relación ternaria con dos entidades con clave compuesta, aula y asignatura, y otra, estudiante. que tiene una clave simple. La transformación al modelo relacional exige la creación de una tabla para la relación. La tabla ESTUDIOS, tendrá como columnas los atributos clave del aula, los de asignatura y el atributo clave de estudiante, todos ellos formando la clave primaria y, 3Falta incorporar en la gura el atributo N°Cuenta a la tabla TRANSACCIONES, aquí se ha omitido para centrar la atención en los atributos de excepciones en la transformación de relaciones. 68
las entidades. Consultar la
sección de
Capitulo 2. Diseño lógico relacional al mismo tiempo, actuando como claves foráneas de sus respectivas tablas. Además, se incorpora el atributo de relación hora.
Figura 2.31: Paso a tablas de una relación. AULAS(Numero, Planta. Situación) ESTUDIANTES(N°1\Iatricu1a,NombreDireccion) ASIGNATURAS(Nombre, Ciclobescripcion)
ESTUDIOS(Numero, Planta. N°I\Iatricu1a, Nombre,Ciclo,Hora)
El consejo del buen administrador. .. Aunque en teoría, 1a tabla ESTUDIOS tiene como clave primaria Ia suma de las claves primarias de las tablas que relaciona, tener en una base de datos tablas con claves tan complejas, hace que e] sistema pueda funcionar más lento de 1o esperado debido a 1a multitud de comprobaciones que el gestor debe realizar cuando se inserta o modica un dato. Si es un sistema cuyo funcionamiento se
base en Ia inserción o modicación
constante de datos, más
que en 1a consulta delos mismos, quizá, en estos casos,se pueda saltar la teoría ycrear un campo sencillo adiciona], identicador de Ia la, ysustituirlo por Ia clave primaria compuesta origina]. De esta forma, se simplica enormemente Ia clave primaria en pos de un funcionamiento más eciente. Nótese, que en estos casos,se pierde mucha semántica que, o se ignora o habría que controlar de otros
modos.
No siempre se aplica la regla general para crear una tabla por cada relación. Generalmente, se pueden encontrar las siguientes excepciones a la regla general 69
Bases de
Datos
1. Relaciones con cardinalidad 1:N. En este caso.no se crea una tabla para la relación, sino que se añade a la tabla de la entidad que actúa con participación máxima N la clave de la entidad que actúa con participación máxima 1 (como
clave foránea).Si además,la relacióntuviera atributos se importaríantambién a la entidad que actúa con participación máxima N:
N
REPRE SENTANTE S(N_L¡cenc¡aN°mb¡e) S(Código.NombreAnístico ÁCÏORE
_Licencia_Representan Contrato) O
Figura 2.32: Excepción I. Relaciones l-N.
La transformación quedaría como se ilustra en la Figura 2.32. Se puede observar que en este caso, no se ha creado una tabla para la relación, sino que se ha añadido a la tabla ACTORES la clave foránea N_Licencia_Representante que referencia al campo N_Licencia de la tabla REPRESENTANTES. También se ha añadido el campo Contrato, atributo de la relación, a la tabla ACTORES. ACTORES(Codigo, NombreArtísitico, NombreReal, N_Licencia_Represent ante,Contrato) REPRESENTANTES(N_Licencia.Nombre) 2. Relaciones reexivas con cardinalidad l-N. En este caso, tampoco se crea una tabla para la relación. Hay que crear una tabla con el nombre de la entidad, añadiendo otra vez la clave cambiada de nombre.
Figura 2.33: Excepción II. Relaciones reexivas 1-N. 70
Capítulo 2. Diseño lógico relacional En el ejemplo de la Figura 2.33, el empleado solo puede tener un jefe, por
tanto, se incorpora el DNI del jefe del empleado (DNISupervisor)como clave foránea.
EMPLEADOS(DNLNombre,DNISupervisor) Actividad
2.14: En
las relaciones reexivas con cardinalidad m-n, se
aplica la regla general para la transformación de relaciones. Expresa cómo sería la regla para crear tablas con relaciones reexivas con cardinalidad mn. Después, aplica esa regla para transformar la Figura 2.33 suponiendo que tuviera cardinalidad
m-n.
3. Relaciones 1-1. Este tipo de relaciones tampoco generan tabla. El paso a tablas se realiza de forma muy parecida a las relaciones 1-N.En este caso, tampoco se genera tabla para la relación y se tiene la libertad de poder incorporar la clave de una de las dos entidades a la otra.
Figura 2.34: Excepción III. Relaciones 1-1. En este caso existen las siguientes opciones: IIncorporar la clave de Personajes como clave foránea en la tabla actores: ACTORES(Codigo, Nombre, CodigoPersonaje) PERSONAJES(CodigoNombrePelícula) IIncorporar la clave de Actores como clave foránea en la tabla Personajes: ACTORES(Codigo, Nombre) PERSONAJES(Codigo,Nombre.Película.CodigoActor) - Incorporar la clave de Actores como clave foránea en la tabla Persona-
jes y la. clavede Personajesa la tabla de Actores como clave foránea: ACTORES(Codigo. Nombre,CódigoPersonaje)
PERSONAJES(Codigo.Nombre.PelículaCodigoActor) 4Téngase encuenta, queen estecaso seestá introduciendouna pequeñaredundancia, peroque puede ser de mucha utilidad para simplicar futuras
consultas. 71
Bases de
Datos
Participaciones O,x Normalmente las participaciones son importantes para calcular la cardinalidad de la relación, y transformar conforme a las reglas expuestas hasta ahora. Incluso en muchas ocasiones, las participaciones se omiten en los diagramas entidadrelación. No obstante, es necesario tener en cuenta cuándo la participación tiene un mínimo de O, para adoptar un campo de una tabla como opcional NULL, u obligatorio NOT NULL.
Generalizaciones
yespecializaciones
Para transformar las generalizaciones se puede optar por 4 opciones. Cada opción se adaptará mejor o peor a los diferentes tipos de especialización (Exclusiva,
Inclusiva, Total, Parcial).
Figura 2.35: Paso a tablas de generalizaciones. 1. Se puede crear una tabla. para la superclase y otras tantas para cada subclase, incorporando el campo clave de la superclase a las tablas de las subclases. EMPLEADOS(DNI, NombrePuesto) DIRECTIVOS(DNI,Dpto) TECNICOS(DNI.l\Iáquinas) COMERCIALES(DNLComisión) 2. Se puede crear una tabla para cada subclase incorporando todos los atributos de la clase padre, y no crear una tabla. para la superclase. DIRECTIVOS(DNLNombrePuestoDpto)
TECNICOS(DNI,Nombre,Puest.o,Máquinas) COMERCIALES(DNI,Nombre,Puesto.Comisión) 3. Se puede crear una sola tabla para la superclase, incorporando los atributos de todas las subclases y añadir, para distinguir el tipo de la superclase, un campo 72
Capítulo 2. Diseño lógico relacional llamado tipo, que contendrá el tipo de subclaseal que representa cada tupla. Este tipo de opción se adapta muy bien a las especializaciones exclusivas. EMPLEADOS(DNI, NombrePuesto. Dpto, Máquinas, Comisión, Tipo) 4. Se puede crear una sola tabla para la superclase como en la opción anterior, pero en lugar de añadir un solo campo tipo, se añaden varios campos que indiquen si cumple un perl, de este modo se soportan las especializaciones
inclusivas. EMPLEADOS(DNI, Nombre,Puesto, Máquinas, Dpto, Comisión, EsDirectivo, EsTécnico, EsComercial)
2.8. Normalización Habitualmente, el diseño de una base de datos termina en el paso del modelo entidad-relación al modelo relacional. No obstante, siempre que se diseñaun sistema, no solo una base de datos, sino también cualquier tipo de solución informática, se ha de medir la calidad de la misma, y si no cumple determinados criterios de calidad, hay que realizar, de forma iterativa, sucesivos renamientos en el diseño, para alcanzar la calidad deseada. Uno de los parámetros que mide la calidad de una base de datos es la forma, normal en la que se encuentra su diseño. Esta forma normal puede alcanzarse cumpliendo ciertas restricciones que impone cada forma normal al conjunto de atributos de un diseño. El proceso de obligar a los atributos de un diseño a cumplir ciertas formas normales se llama nomnalización.
r°----/ \---'7
°°¿;:"° cotzzsasl .
LGICO
PROBLEMA/ (Entldad/ v,
A:
(Relacional)
:z
W l
____ sí
BASE ¡ENTEME NT L; DE«MODELO Fisco. ¿SUFIC E NORMALIZADO?
»
g, J ÉÍ al
Figura 2.36: Renamiento de un diseño de base de datos. Las formas normales pretenden alcanzar dos objetivos: 73
Bases de
Datos
1. Almacenar en la base de datos cada hecho solo una vez, es decir, evitar la redundancia de datos. De esta manera se reduce el espacio de almacenamiento. 2. Que los hechos distintos se almacenen en sitios distintos. Esto evita ciertas anomalías a la hora de operar con los datos. En la medida que se alcanza una forma normal más avanzada, en mayor medida se cumplen estos objetivos. Hay denidas 6 formas normales, cada una agrupa a las anteriores, de forma que, por ejemplo, la forma normal 3 cumple la forma normal 2 y la forma normal 1. Antes de abordar las distintas formas normales, es necesario denir los siguientes
conceptos 5: Dependencia funcional: Se dice que un atributo Ydepende funcionalmente de otro atributo X, o que X> Y, si cada valor de X tiene asociado en todo momento un único valor de Y. También se dice que Ximplica Y, y por tanto, que Xes el implicante. Por ejemplo: PRODUCTOS (CódigoProducto, Nombre, Precio, Descripcion) CódigoProducto + Nombre, puesto que un código de producto solo puede tener asociado un único nombre, dicho de otro modo, a través del código de producto se localiza un único nombre.
Dependencia funcional
completa: Dado una combinaciónde atributosX(X 1, X2, ..
se dice que Ytiene dependencia funcional completa de X, o que X=> Y, si depende funcionalmente de X, pero no depende de ningún subconjunto del mismo. Por ejemplo: COMPRAS (CódigoProducto, CódigoProveedor, Cantidad, FechaCompra) CódigoProducto,CódigoProveedor => FechaCompra, puesto que la FechaCompra es única para la combinación de CódigoProducto y CódigoProveedor (se puede hacer un pedido al día de ca.da producto a cada proveedor), y sin embargo, se pueden hacer varios pedidos del mismo producto a diferentes proveedores, es decir, CódigoProductvoweFecha.
Dependencia funcional
de X > Y, Y+ o que, X >
transitiva: Dada
la tabla T, con atributos (X,Y,Z), don-
Ze Y4+ X 6, se diceque X depende transitivamentede Z,
Z.
5No es objetivo del libro entrar en los detalles matemáticos del proceso de normalización, y sí proporcional al lector una idea intuitiva del
GY nodepende deX. 74
mismo.
Capítulo 2. Diseño
lógico relacional
Ejemplo 1:
PRODUCTOS (CódigoProducto,Nombre, Fabricante,País) CódigoProducto > Fabricante >
Fabricante
País
CódigoProducto >
País, es decir, CódigoProducto depende transitivamente
de País.
Ejemplo 2:
PRODUCTOS (CódigoProducto,Nombre, Fabricante,País) CódigoProducto > Nombre Nombre > CódigoProducto CódigoProducto -v» Nombre
A continuación, se describe de forma intuitiva las siguientes formas normales: FN 1:
En esta forma normal se prohíbe que en una tabla haya atributos que puedan tomar más un valor. Esta forma normal es inherente al modelo relacional, puesto que las tablas gestionadas por un SGBD relacional, están construidas de esta forma. Por ejemplo, en la Figura 2.37 se puede ver la diferencia entre una tabla que cumple 1a fnl y otra que no:
La amenaza Fantasma
1999 Ewan McGregor Liam Neeson Natalie Portman
Blade Runner
1982 Harrison Ford
Avatar
2009 Sam
La amenaza Fantasma 1999
Ewan McGregor
Rutger Hauer Worthington Zoe Saldana Sigourney Weaver
Figura 2.37: Primera Forma Normal.
75
Bases de
Datos
FN 2:
Un diseño se encuentra en FN 2 si está en F N1 y además, cada atributo que no forma parte de la clave tiene dependencia completa de la clave principal. Ejemplo: COMPRAS (CódigoProducto, CódigoProveedor, NombreProducto, Cantidad, FechaCompra). CódigoProducto > NombreProducto, por tanto, al no ser dependencia funcional completa, no está en F N2.
FN 3:
Un diseño se encuentra en FN3 si está en F N2 y además, no hay ningún atributo no clave que depende de forma transitiva de la clave. Ejemplo:
PRODUCTOS (CódigoProducto,Nombre, Fabricante,País). CódigoProducto > Fabricante >
Fabricante
País
CódigoProducto +> País País dependetransitivamente de CódigoProducto, por tanto, no está en tercera forma normal.
FNBC: Esta forma normal, llamada Forma Normal de Boyce-Codd, exige que el modelo esté en FN3, y que además, todo implicante de la tabla, sea una clave candidata.
Ejemplo: NOTAS (DNIAlumno, DNIProfesor > NombreProfesor >
DNIProfesor,NombreProfesor, Nota).
NombreProfesor DN IProfesor
DNIProfesonDNIAlumno > Nota En este caso, la tabla está en 3FN porque no hay dependencias funcionales transitivas, y sin embargo no está en FNBC porque NombreProfesor y DNIProfesor son implicantes, y no son claves candidatas. Para obtener la tabla en F NBC habría que quitar de la tabla los atributos DNIProfesor y NombreProfesor.
Otras formas normales: Existen más formas normales (FN4, F N5, FNDK, FN6 cuyo alcance excede el de este libro y cuya aplicación en el mundo real es únicamente teórica). Las formas normales 4 y 5, se ocupan de las dependencias entre atributos multivaluados, la Forma Normal Dominio Clave (FNDK) trata las restricciones y los dominios de los atributos, y nalmente la FN6 trata ciertas consideraciones con las bases de datos temporales.
76
Capítulo 2. Diseño lógico relaciona] 2.9.
Prácticas Resueltas
Práctica 2.1:
Startrekfanscom v.1.0
Un club de fans de la famosa película startrek, ha decidido crear una página web donde se pueda consultar información referente a todas las películas y capítulos de la saga. El dominio startrekfans.com se redirigirá a un servidor web que consulte una base de datos con la siguiente información: Actores: Es necesario conocer el Nombre completo del actor, el personaje que interpreta, la fecha de nacimiento y su nacionalidad. Personajes: De los personajes es necesario saber el nombre, su raza y gradua-
ción militar que desempeña(ca.pítán. teniente,almirante, etc.). Es importante conocer el actor que interpreta el personaje, teniendo en cuenta que, un personaje solo puede ser interpretado por un actor, y un actor solo puede interpretar un personaje. Además, será necesario conocerel personaje del que depende directamente en graduación militar. Capítulos: Hay que almacenar todos los capítulos, indicando a qué temporada pertenece cada capítulo, el título, el orden en el que fue rodado, fecha de su primera emisión en televisión y los personajes que participaron en cada capítulo. Películas: Se debe almacenar también, todas las películas que se proyectaron en cines, cada una con su año de lanzamiento, título y director. También hay que guardar los personajes que aparecen en cada película y cuál de ellos fue el protagonista. Planetas: En cada capítulo, se visita 1 o varios planetas, hay que almacenar el código del planeta, su nombre, galaxia a la que pertenece, y el problema que se resolvió en esa visita y la nave con la que se viajó al planeta. Para la descripción del problema será suciente con un campo de texto de 255 caracteres. De la nave se almacenará el nombre, código y número de tripulantes. 1. Realizar un diagrama entidad relación que modele el diseño de la base de datos. Puedes hacerlo en papel, con dia, con Visio. o con cualquier otro software de diagramas. 2. Realizar la conversión al modelo relacional del diagrama realizado en el primer Apartado, indicando qué claves primarias y foráneas se han de crear. 77
Bases
de Datos
Paso a tablas: A CTORES(Código,Nombre,Fecha, Nacionalidad) PERSONA JES(Código.Nombre,Raza, Grado, CádigoActor, CodigoSupeñor) PLANETAóYCódigo,GalazimNombne)
CAPÍTUL OS(Temporada, Orden,Título,Fecha) PELÍCULASYCódigo, Título,Director,Año) PERSONA JESCA PITUL OS(CódigoPersonaje,Temporada.Orden) PERSONA JESPELICULA S(CódigoPersonaje, CódigoPelicula) VISITAS(CódigoNave, CódigoPlaneta, Temporada, Orden) NA VES(Código,N° Tripulantes,Nombre) Obsérvese que: En el enunciado no aparece explícitamente el campo Código para los personajes y actores, pero es necesario incluirlo para dotar de un atributo clave a estas entidades. La clave de la entidad Capítulo es compuesta, por tanto en las relaciones se importan que forman la clave. La relación ternaria
tiene cardinalidad
M:N:P,
los dos atributos
es decir, Aluchos-Aluchos-Aluchos.
En la relación interpreta se podría haber incorporando los dos campos claves a las entidades opuestas. Aunque introduce redundancia de datos, es útil para agilizar consultas. Nótese que a las dos relaciones Apanece, se les ha cambiado el nombre por una combinación entidades que relaciona, para evitar la posible ambigüedad.
de las dos
El nombre de las tablas aparece en plural, mientras que el de las entidades aparece en singular. debido a que la entidad representa un concepto abstracto y la tabla un conjunto de datos.
78
Esto es
Capítulo 2. Diseño lógico relaciona]
Práctica 2.2:
Startrekfanscom v.2.0
El club de fans de Startrek ha pensado ampliar los requisitos de la página web para hacer una segunda versión. Esta segunda versión consiste en incluir información extra para los personajes. De esta manera, si el personaje es un humano, se indicará su fecha de nacimiento y ciudad terráquea donde nació. Si el personaje es de la raza Vulcano, se almacenará el nombre del mentor y la fecha de graduación, y si es de raza Klingon, se guardará su planeta natal y la fecha de su último combate. 1. Realizar una generalización de la entidad Personaje indicando las especializaciones necesarias.
2. Transforma al modelo relacional la generalización del apartado anterior.
PERSONAJEóYCódigmNombre,Grado, CódigoActor.CodigoSuperior, F. UlLCombate, ltlentor, Fecha_Grado)
Raza. Ciudad.
F_Nacim, Planeta,
Obsénrese que: k Se ha optado por una de las 4opciones que hay. En este caso. se ha creado una única tabla con el campo Raza como discriminante de tipo. que indicará los campos a rellenar según su tipo. Por ejemplo, si la raza es Klingon, tan solo se rellenarán los campos Planeta yF_Ult_Combate. Esto generará 4valores nulas por personaje, pero evitará complejidad en el modelo al no tener tablas extra. Al tratarse de una especialización total yexclusiva. cada personaje solo puede pertenecer a una de las razas, yademás tiene que pertenecer a una de manera obligatoria.
79
Bases de
Datos
Práctica 2.3:
Startrekfanscom v.3.0
El club de fans de Startrek quiere la tercera versión de la base de datos de la siguiente forma: En cada capítulo, 1a nave que viaja a un planeta, puede disponer de una nave pequeña llamada lanzadera con la que bajan a la supercie del planeta. La existencia de la lanzadera, solo tiene sentido si existe la nave a la que pertenece. Se identicará cada lanzadera mediante un número entero y el código de la nave. Es necesario conocer la capacidad en personas de la lanzadera. 1. Incorporar los cambios de la tercera versión al modelo conceptual y lógico de las prácticas anteriores.
Paso a, tablas:
LA NZA DERA
S(CódigoNave, Número,Personas) NA VES(Código, N 7Hpulantes,Nombre)
Obsérvese que: i Al
ser una relación 1-N
k El
campo Número
k Al
80
se importa
a LANZADERAS
el atributo
CódigoNave.
es una clave débil.
tratarse de una dependencia de la tabla LANZADERAS.
de identicación,
el CódigoNave forma parte
de la clave primaria.
Capítulo 2. Diseño lógico relaciona] 2.10.
Prácticas Propuestas
Práctica 2.4:
Peluquería
Una peluquería desea llevar el control de sus empleadas y de sus clientes así como de los servicios que se prestan. Se deseaalmacenar la siguiente información: Empleadas: DNI, Nombre, Especialidad (Masaje, Corte, Color, Brushing, Ma-
nicuras, Rulos,etc.) Clientes: Datos personales (DNI, Nombre, Profesión, Teléfono y Dirección) y los tratamientos médicos a los que está sometido el cliente. Servicios prestados: Qué empleada atendió a qué cliente, y qué tipo de servicio le prestó en qué fecha y hora. Citas: Fecha y Hora en la que se cita al cliente y empleada que realizará el servicio.
Cosméticos: Código, Nombre, Cantidad y Precio. Ventas de cosméticos: Una empleada vende un cosmético a un cliente, obteniendo una
comisión.
.Realiza. una lista de candidatos a entidades, relaciones y atributos, indicando en cada entrada, si se admite o se rechaza como tal razonando el porqué de tu decisión. Por cada relación, razona su tipo y cardinalidad. .Modeliza mediante un diagrama E/ R. .Realiza el paso a tablas del modelo E/ R.
81
Bases de
Datos
Práctica 2.5:
Reyes Magossin fronteras
La ONG Reyes Magos sin fronteras desea hacer una base de datos para que esta Navidad todos los niños pobres de España puedan recibir sus regalos la noche de los Reyes Magos. La ONG contacta con vecinos de distintos barrios para disfrazarlos de Reyes Magos y organizarlos en grupos lúdicos que realicen eventos para que los niños los visiten y puedan formular sus peticiones. Cada niño es recibido por un Rey Mago y puede hacer una única petición, la cual queda anotada en la base de datos para posteriormente, el día 6 de enero, entregar esa petición. La ONG comprará los regalos con el dinero que distintas organizaciones benécas aportarán a la causa. Los datos que interesa almacenar son los siguientes: De los vecinos: DNI, Nombre y apellidos, Rey Mago al que encarna y los vecinos a los que ha conseguido convencer para que se unan a la causa.
De losniños: Nombre,Dirección y el Regaloque pideal Rey Mago. (Losniños, no tienen DNI, y necesitarán un dato identicativo). De los grupos de vecinos se necesita saber a qué Barrio pertenecen, número de integrantes del grupo y los Eventos que han organizado. De los eventos interesa conocer la Ubicación física, la Fecha, la Hora y los niños asistentes.
. Realiza una lista de candidatos a entidades, relaciones y atributos, indicando en cada entrada, si se admite o se rechaza como tal justicando el porqué de tu decisión. Por cada relación, razona su tipo y cardinalidad. .Realiza el diagrama entidad-relación y el paso al modelo relacional.
82
Capítulo 2. Diseño lógico relaciona]
Práctica 2.6:
Mundial de
fútbol
Diseñar una base de datos para organizar el campeonato mundial de fútbol. Considerar los siguientes aspectos: IJugadores: un jugador puede pertenece a un único equipo y puede actuar en varios puestos distintos, pero en un determinado partido solo puede jugar en un puesto.
IÁrbitros: En unpartido intervienen 3 árbitrostitulares, linier derecho, izquierdo, principal y un árbitro secundario. Un árbitro puede realizar una función en un partido y otra distinta en otro partido. -Estadísticas: Se deseasaber los goles queha marcado un jugador en qué partido y en qué minuto, también se desea poder describir cómo sucedió el gol. IPorteros: Se desea almacenar cuántas paradas ha realizado, en qué minuto, y en qué situación se han producido: penalti, tiro libre, corner o jugada de ataque.
IPartidos: Todos generan un acta arbitrar donde se pueden incluir todo los comentarios que el árbitro considere oportuno: lesiones, expulsiones, tarjetas, etc.
1. Realiza una lista de candidatos a entidades, relaciones y atributos, indicando en cada entrada, si se admite o se rechaza como tal, justicando el porqué de tu decisión. Por cada relación, razona su tipo y cardinalidad. 2. Realiza el diagrama entidad-re1a.ción y el paso al modelo relacional.
83
Bases de
Datos
Práctica 2.7:
Supermercado virtual
Se va a desarrollar una aplicación informática para wwwxvirtualmarkeïïcom cuya interfaz de usuario estará basada en páginas web para que los clientes puedan realizar compras desde sus casas. La empresa dispone de una serie de repartidores que se encargan de distribuir los pedidos a los clientes. A continuación se muestra el informe de un
analista tras
una entrevista
con el
cliente:
La aplicación permitirá registrar nuevos clientes. Para usar la aplicación, un cliente deberá registrarse indicando sus datos personales (DNI, Nombre, Dirección,
Código Postal,Teléfono decontacto, emaily password)a travésde un formulario de registro. Una vez registrado podrá acceder a la realización de pedidos con su email y su password. Los productos que oferta el supermercado están divididos en diversas categorías. Los datos necesarios para cada categoría son: nombre de la categoría, condiciones
de almacenamiento(frío, congelado,seco) yobservaciones. Los datos delos productos son: nombre, marca, origen, dimensiones (volumen y peso), una fotografía, la
categoría y unidades disponibles7. La aplicación permitirá visualizar un listado de productos ordenado por categoría, permitiendo seleccionar los productos que desee comprar mediante una caja de texto donde se indicará el número de unidades seleccionadas. La aplicación llevará la
cuenta (cestade la compra) de los productosque el cliente ha ido seleccionando. La aplicación permitirá también efectuar un pedido con todos los productos que lleve almacenados en su cesta de la compra. Los datos del pedido son: código del pedido, fecha del pedido, cliente, dirección de entrega, productos pedidos, importe
total del pedido ydatos depago (númerode tarjetay fechade caducidad)? Para poder generar un pedido se deberán dar dos situaciones: IEl cliente deberá pertenecer a una zona (Código Postal) donde existan repartidores. Un repartidor se ident.ica mediante un nombre, número de matrícula de la furgoneta y zona donde reparte. -Debe haber unidades sucientes por cada producto para satisfacer las demandas de cada pedido. Una vez generado el pedido se mostrará al usuario una página con los datos de su pedido, se restarán del stock las unidades pedidas y se emitirá una nota de entrega 7El control del stock está supervisadopor otra aplicación subcontratada, y por tanto no es necesario preocuparse por él.
SEI pagodel pedido está automatizadomediante otro software queproporciona el banco. 84
Capítulo 2. Diseño lógico relaciona} (albarán) a los responsables de almacén para. que sirvan ese pedido. Se pide: 1.
Diseño Conceptual. Realizar el diagrama entidad relación de la aplicación. Se ha de tener en cuenta que el entrevistado narra todo el proceso que necesita la lógica de su negocio. Se deberán separar los procedimientos de los datos. Diseño Lógico. Realizar el paso al modelo relacional.
.¿En qué forma normal está la tabla Clientes?
Práctica 2.8:
Requisitos deuna aplicación
Busca alguna persona que tenga un negocio. Puedes trabajar haciendo equipo con otros compañeros. Tenga informatizado el negocio o nó, pídele que sea tu cliente y realiza las siguientes tareas de análisis: Entrevístale, si es necesario graba la entrevista e intenta extraer una lista de requisitos.
Extrae de esta lista de requisitos los que versen sobre almacenamiento de la información en bases de datos y realiza un diagrama entidad relación que satisfaga todos esos requisitos. Reúnete de nuevo con el cliente y pídele que verique tu modelo E-R. Repite este proceso hasta que el cliente de el visto bueno. Cuando el cliente haya validado tu modelo, realiza el diseño de base de datos, transformando el modelo E-R al modelo relacional ydespués, implementando ese modelo en Access.
85
Bases de
Datos
Práctica 2.9:
MySQL Workbench
El objetivo de esta práctica es conocer en profundidad un software de diseño de base de datos de licencia GNU. Debes tener en cuenta que los diagramas de MySQL Workbench son una mezcla del modelo conceptual de Chen y del modelo relacional de Codd, incluso más orientado al modelo relacional. Por ejemplo, no existen las relaciones ternarias, y a las entidades las llama tablas, como en el modelo relacional. Toda su
nomenclatura está
orientada a
comunicarse con
un SGBD
sin necesidad
de
transformaciones previas. Además, aunque tiene el apellido MySQL, este software está basado en DB Designer, programa genérico de diseño de base de datos, y por
tanto se puede conectara cualquier SGBD (Oracle, DB2, Access..
y no solo a
MySQL. 1. Conectarse a la página web de l\rIySQL Workbench. http://wb.mysq1.com/ 2. Seleccionar 1a opción Download Workbench y mientras se descarga, selecciona el enlace About - Screenshots y comenta para qué sirve el software. 3. Buscar en google MySQL Workbench instrucciones de MySQL Workbench.
manual y
descárgate el manual de
4. Instalar el software. El proceso de instalación es muy sencillo. 5. Iniciar la aplicación y seleccionar la opción Add Dzïagram para comenzar a dibujar un diagrama entidad relación (EER (Extended Entity Relationship - Entidad Relación Extendido). En la opción de menú Model, seleccionar la notación para los objetos y para las relaciones. Seleccionar la opción Classic y compararlas con las otras notaciones. 6. Insertar los objetos necesarios para representar el siguiente diagrama E-R:
Se puede usar el panel inferior para incorporar los atributos y así, del panel lateral izquierdo, poder seleccionar los objetos. Debe quedar así: 86
Capítulo 2. Diseño lógico relacional
File Edit View Arrnnge Model Dnabne Plugins Tools Community Htip
H H° I} MySQL
F7
Model V Dlagram
Espera que se cierre una comilla doble mysq1> Listo para una nueva consulta
Otra forma de ejecutar comandos SQL es almacenarlos en un chero de texto y mandarlo a ejecución mediante el comando source, que recibe como parámetro un chero de comandos y ejecuta uno por uno todos los comandos que tenga el chero: átejecución del
script de
creación crear_bbdd_startrek.sq1
mysq1> source /home/ivan/crear_bbdd_startrek
.sql
Por último, también es posible ejecutar los comandos de un chero de texto desde la shell, esto es, en modo batch. redirigiendo al cliente mysql un chero de entrada. Esto es útil para tareas administrativas donde se ejecutan varios cheros «le comandos, además de otras tareas de maxitenimiento
del servidor
a través de un
shell script: 101
Bases de
Datos
#ejecucion en
"S mysql
modo batch
-u root
#ejecucion en
"S mysql
-pPassWdUsuario ]
[©] |
/|
/no1og }]
[AS {SYSDBA I SYSOPERH
En Oracle, cada instancia está referenciada por uno o más identicadores de conexión. ÍdGTZÉÍCGdOTLCOTLCIÍÓTZ es el nombre de esta referencia. #conexión a
la instancia
jardineria con
el usuario
paco
sqlplus paco/password_paco©jardineria
La opción /nolog arranca sqlplus sin conectarse ala basede datos. #arrancar sqlplus
sin conexión
sqlplus /nolog
La opción /conecta a la instancia sin usuario. Sueleusarse paratareas administrativas:
#conexión a
sqlplus
/as
la instancia
SÜRACLE_SID como
SYSDBA
SYSDBA
Cada usuario se puede conectar representando un rol: estos roles son el de administrador de la base de datos (SYSDBA) y operador de base de datos (SYSOPER). SYSDBA y SYSOPER tienen privilegios para conectarse a la base de datos cuando no está abierta, pudiendo de este modo. realizar tareas de administración y mantenimiento.
102
Capítulo 3. Diseño sico relacional
3.3.4. Ejecución
de consultas en SQL*Plus
Al igual que en MySQL. una vez conectado sqlplus a una base de datos con un usuario, password y nombre de servicio, se procedea escribir las consultas terminadas en punto y coma, con las siguientes consideraciones: ISQL*PLUS no es sensible a mayúsculas y minúsculas ni en las palabras reserVadas, ni en los nombres de los objetos. ISe puede escribir una consulta en múltiples líneas: SQL> select
*
2 from
3 nbajugadores;
"comentario de
línea
- Los comentarios de línea se realizan precediendo una línea de dos caracteres IExisten los comentarios de bloque. es decir, que afectan a más de una línea. Comienzan con los caracteres /* yterminan con los caracteres */ n Existe una tabla llamada Dual que está disponible para todos los usuarios, y sirve para seleccionar variables del sistema o para evaluar una expresión: SQL> select
sysdate, user
from dual;
SYSDATE USER
27/06/10 SYS SQL> select
5+4 from
dual;
5+4
¿Sabías que . . . 7Existe un intérpretede comandos gráco en Oracle llamado iSQL*Plus. con interfaz web. Se instala aparte del software de Oracle, descargando de la página Web de Oracle (wvv\v.oracle.com) el paquete isqlplus.zip.
Actividad 3.5: Arrancala máquinaxirtual Ubuntuyabre un terminal.Conéctate con
el usuario
oracle mediante
el comando:
103
Bases de Datos
su oracle Contraseña:
oracle
Acontinuación, sqlplus
arranca sqlplus
con el usuario
nba y
la passwordnba:
nba/nba
Después, ejecuta las siguientes consultas: SQL> select
tab1e_name
from
user_tab1es;
SQL> select
tab1e_name
from
dba_tables;
Lee la sección 3.8.5 ycomenta brevemente qué qué se diferencian.
3.4.
El lenguaje
El sublenguaje
de denición
de datos
de SQL que permite la denición
Denition Language).Las funciones - Crear tablas, índices mos, etc.) n Denir
hacen las sentenciasanteriores y en
yotros
las estructuras físicas
datos (espacios
de datos es el DDL (Data
de estesublenguaje son: objetos de
la base de
datos (como
donde se almacenarán los
de tablas (tablespaces), cheros de
Por ejemplo, para crear el el siguiente código:
esquema de la práctica
resuelta 2.1 se
Codigo INTEGER PRIMARY KEY, Nombre VARCHAR(40), DATE,
Nacionalidad
VARCHAR(20),
CodigoPersonaje INTEGERREFERENCES PERSONAJES(Codigo) );
CREATETABLEPersonajes( CodigoPersonaje INTEGER, Nombre VARCHAR(30), Raza
DATE,
Grado VARCHAR(20),
CodigoActor INTEGERREFERENCES Actores(Codigo), Codigosuperior INTEGERREFERENCES Personajes(Codigo) J;
104
objetos de las bases de
datos (datales), etc.)
CREATE TABLE Actores(
Fecha
vistas, sinóni-
puede escribir
Capítulo 3. Diseño sico relaciona] En el código anterior, las palabras reservadas del lenguaje se han escrito en
mayúsculas (CREATE. DATE, VARCHAR). ylos
nombres de objetos (Actores,
Grado, Nombre) se han escrito en minúsculas para que el lector pueda identicar fácilmente qué parte de la sintaxis se debe respetar ycuál se puede variar. DDL tiene
3 instrucciones
básicas:
CREATE tipo_objeto Nombre Denición. Crea un objeto de un determinado tipo (DATABASE, TABLE, INDEX, etc.) con un nombre (por ejemplo Actores
o Personajes)y una denición (CodigoPersonaje, Nombre, etc.). DROP tipo_objeto Nombre. Elimina un tipo de objeto especicado mediante un nombre. Por ejemplo, la sentencia DROP TABLE Actores, borraría de la base de datos la tabla Actores junto con todos sus datos. ALTER tipo_objeto Nombre Modicación. Modica la denición de un objeto. Por ejemplo, la sentencia ALTER TABLE Actores DROP COLUMN Fecha, eliminaría la
columna Fecha
3.5. Creación
de la
tabla Actores.
de bases
3.5.1. Creación
de datos
de bases de datos
en MySQL
En MySQL, para crear una base de datos se usa el comando CREATE DATABASE:
CREATE {DATABASE | SCHEMA} [IF NOT
[especificación_create [,
EXISTS] nombre_db
especificación_create] ...]
especificación_create: [DEFAULT] CHARACTER juego_caracteres SET I [DEFAULT]
CDLLATE nombre_co1ación
Por ejemplo, para crear la base de datos Startrek, en MySQL, habrá que teclear, en la consola de comandos, la instrucciónl: CREATE DATABASE Startrek CHARACTER
SET Latinl
CDLLATE 1atin1_spanish_ci;
Nótese que el término a elegir puede ser o DATABASE o SCHEMA, en cualquier caso, el efecto es el mismo; MySQL usa algunos sinónimos para hacer más compatible su sistema de gestión con otros SGBD. Por otro lado, el parámetro opcional lTodas las sentencias mysqldeben terminar en un carácter punto ycoma (2) 105
Bases de
Datos
(especicación_create) permite elegir el juego de caracteres que va a usar la base de datos (utf8, latinl, latin2, etc.), y la colación, que especica cómo tratar el alfabeto del juego de caracteres, es decir, cómo se ordena (por ejemplo, la ñ después de la m
y n y no conforme la a tablade códigos ascii), ycómo se comparan los caracteres (por ejemplo, si A es igual a á) Para poder utilizar una base de datos, primero hay que establecer que las operaciones que se realicen a continuación se realicen sobre esta, es decir, hay que usarla. Para usarla
se utiliza
el comando
USE dbmame
Por ejemplo, para empezar a manipular la base de datos Startrek, habrá que ejecutar el comando USE Startrek; Otro comando muy útil para ver cuántas basesde datos está controlando el gestor es el comando SHOW DATABASES, que obtiene un listado de las bases de datos activas en
el servidor.
mysql> snow
DATABASES;
+------------------
--+
I Database
I
+ ------------------
--+
I information_schema
I
I Startrek
I mysql + ------------------
--+
Tras la ejecución de este comando se puede ver que, además de NBA y Startrek, hay otras dos que están siempre presentes, "information_schema y mysql que almacenan metadatos (datos sobre los datos) e información de usuarios y permisos.
Actividad 3.6: Ejecuta los siguientes comandos en la máquinavirtual Ubuntu para crear una base de datos y una tabla:
mysq1> CREATE DATABASE Veterinario; mysq1> USE Veterinario;
mysq1> CREATE TABLE Mascotas ( Nombre VARCHAR(10),
106
Capítulo 3. Diseño físico relacional
FechaNacim DATE,
Amo VARCHAR(40)
);
A continuación, prueba a crear una tabla llamada Vacunas, con una fecha y una ilüfa para cada mascota. Si es necesario, lee la Sección 3.8
3.5.2. Creación
de bases
de datos
en Oracle
El proceso de creación de una base dedatos en Oracle es bastante más elaborado. En MySQL, una sola instancia controla todas las bases de datos, pero en Oracle, ¡ada base de datos está asociada a una. instancia. Una instancia es el conjunto de procesos de Oracle que están en ejecución en el sistema operativo y cuya misión es controlar todo lo referente a la gestión de la base de datos. Para crear una base
de datos,primero hay que crear una instancia para procedera invocar el comando «reate databasepertinente. Oracle dispone de la utilidad gráca dbca (database conguration assistant )que facilita este proceso. No obstante, a continuación se detalla el procedimiento para crear una base de datos Oracle en un sistema operativo Unix de forma
manual:
#desde el
sistema operativo
su oracle
#conecta con
el usuario
cp SORACLE_HOME/dbs/init.ora export 0RACLE_SID=jardineria #editar los
parámetros del
#inicio de
la base
#Debe llamarse
con el
oracle
SÜRACLE_HDME/dbs/initjardineria.ora #se conectará a la instancia jardineria fichero init
que contiene
los parámetros
de
de datos. nombre initNombreInstancia.ora
gedit SORACLE_HUME/dbs/initjardineria.ora #cambiar los
siguientes parámetros db_name=jardin
memory_target=100M processes =40 audit_file_dest=/var/oracle/product/11.2.0/ audit_trail =db
db_b1ock_size=8192 db_domain=
Bases de Datos
--dentro
de SQL PLUS,
SQL> Startup
conectarse
sin
montar
base
de datos
nomount
ORACLE instance
Total
started.
System Global
Area
104611840
Fixed Size Variable
Size
83886548
se
bytes
16777216 bytes
Redo Buffers continuación,
bytes
1334828 bytes
Database Buffers --a
la
2613248 invoca
el
comando
bytes
CREATE DATABASE
SQL> CREATEDATABASEjardin MAXINSTANCES MAXLÜGFILES
1 16
MAXLÜGMEMBERS 3 MAXDATAFILES
100
CHARACTER SET WE8ISO8859P15
DATAFILE /var/oracle/datos/jardineria/system01.dbf SIZE
300M
EXTENT MANAGEMENT LOCAL
UNDO TABLESPACE UNDOTBSI
DATAFILE
/var/oracle/datos/jardineria/undotbsol.dbf SIZE
550M
SYSAUX DATAFILE
/var/oracle/datos/jardineria/sysauxol.dbf
SIZE 300M
DEFAULT TEMPORARY TABLESPACE TEMP
TEMPFILE /var/oracle/datos/jardineria/tempO1.dbf SIZE 100M LDGFILE GROUP1 (/var/oracle/datos/jardineria/redoO1.1og) SIZE 512OOK, GROUP2 (/var/oracle/datos/jardineria/redo02.log) SIZE 51200K, GROUP3 (/var/oracle/datos/jardineria/redo03.log) SIZE 5120OK; >Database
created.
--Finalmente,
se crea
el
catalogo
de metadatos
SQL> Q/rdbms/admin/Catalog.sql SQL> G/rdbms/admin/catproc.sq1 SQL> G/rdbms/admin/ut1rp.sq1
Las opcionesde CREATE
DATABASE para Oracle son las siguientes
I MAXINSTAN CES indica el número máximo de instanciasque pueden estar usando a la vez la base de datos objeto de la creación. Un valor distinto de 1 implicaría que la. base de datos puede ser usada en RAC, Real Application Cluster, lo cual signica que la base de datos puede estar montada, abierta y en uso desde más de un servidor.
- MAXLOGFILES esel número máximo de gruposde cheros de log que pueden crearse.Un chero log registra todas las operacionesque realizan los usuarios. I INIAXDATAFILES indica el número máximo de cheros de datos que pueden usarse.
- DATAFILE 108
es el chero para el tablespaceSYSTEM.
Capítulo 3. Diseño físico relacional MAXLOGMEMBERS es
el número
máximo de
cheros de
los miembros
de
un grupo. Los cheros log se combinan en grupos.
UNDO TABLESPACE es el tablespace que almacenará los datos originales presentes en cualquier tabla o índice antes de hacer cualquier transacción que suponga una modicación sobre aquéllos.
SYSAUX TABLESPACE es un nuevo tablespace aparecido en la versión 10g de Oracle que permite independizar de SYSTEM objetos de aplicaciones, como el Enterprise Manager, que antiguamente se alojaban en el tablespace SYSTEM.
DEFAULT TEMPORARY TABLESPACE es el tablespace temporal que utilizarán los usuarios que no tengan explícitamente asignado otro tablespace temporal.
LOGFILE GROUP
es la denición de los grupos de cheros log.
CHARACTER SET especica el juego de caracteres que la base de datos. utilizará para almacenar los datos (por ejemplo el WE8ISO8859P15 es el juego que incluye todos los caracteres presentesen los idiomas de Europa Occidental, incluyendo el signo del euro, ¬, acentos y la
Todo este farragoso proceso se puede simplicar utilizando el asistente de creación de base de datos de Oracle (dbca, database conguration assistant). Este asistente conduce al administrador automáticamente por el proceso de creación de una instancia con su base de datos. Además, congura automáticamente un repositorio para poder ejecutar Enterprise Manager. Para invocar este asistente tan solo hay que escribir en un terminal de un sistema operativo el comando dbca.
Actividad
3.72 Abre la máquinavirtual Ubuntu y con un terminal,haz login
con el usuario oracle (su oracle). Acontinuación, ejecuta el comando dbcay sigue los pasos para Crear una nueva instancia y su base de datos asociada.
109
Bases de Datos
---'.'...L.:u.a\ v- dagu" 2'
LIaLgJL"¿ÏJJUJLI3""1'J"
Seleccione la operación quedesearealizar i crearBasedeDatos l
::n:': :: >_-z tu l'
I'm-n" :1 ;;='» r Gestionar Plantillas
Í
Las operaciones deconguración deASM sepueden realizar mediante elAsistente
. ' deConguración deGestión deNmacenamiento Automático (ASMCA) desdeel directorio raízde9nddeOracle.
Cancelar 44
AWÜG
Figura 3.6: Database Conguration Assistant.
3.6.
Modicación
de
una
base
de
datos
El comando ALTER DATABASE permite cambiar las característicasde funcionamiento de una base de datos. Por ejemplo, en MySQL. tan solo se puede cambiar el juego de caracteres y su colación: #cambia
la
colación
de una
ALTER DATABASE Startrek
base
de datos
COLLATE latin1_spanish_ci;
En Oracle, se puede cambiar cualquiera de sus múltiples parámetros, aquí se muestran algunosejemplos: --Cambia
el
tamaño
del
fichero
de datos
del
sistema
SQL> ALTER DATABASE DATAFILE --Cambia
/var/oracle/datos/jardineria/systemoi.dbf'
SIZE 1G;
el
lectura
modo de acceso
a la
base
SQL> ALTER DATABASE open read only; -Desactiva la opción de recuperación ALTER DATABASE flashback
110
off;
de datos
rápida
a solo
Capítulo 3. Diseño sico relacional
3.7. Borrado
de bases
de datos
El comando DROP DATABASE es el utilizado para eliminar bases de datos. En INIySQL, el comando se acompaña del nombre de la base de datos a eliminar: >mysq1 -u root -p drop database Proveedores;
En Oracle, no hay que especicarlo, tan solo es necesarioconectarse a la instancia y escribir: >sq1p1us /as
sysdba
shutdown abort; Startup mount drop database;
--parada de la instancia exclusive restrict; --reinicio en --borrado
modo exclusivo
exit; --salir
Otra forma menos elegante de borrar una base de datos consiste en borrar físicamente todos
los cheros
3.8. Creación Para crear
binarios de
la base
de datos.
de tablas
tablas se
usa el comando CREATE
TABLE:
CREATE [TEMPDRARY] TABLE [esquema.]nombre_tab1a [(definición_create,
. ..)]
[opciones_tab1a] def inición_create
:
definición_columna
I [CÜNSTRAINT I [CÜNSTRAINT
[símbolo]] PRIMARY [símbo1o]] FDREIGN
KEY (nombre_co1umna,...) KEY (nombre_co1umna,...)
[def inición_referencia]
definición_co1umna: nombre_columna tipo_datos NULL [NOT NULL] l [DEFAULT valor] [UNIQUE [KEY] Í [PRIMARY] [def inición_referencia]
KEY]
definición_referencia: REFERENCES nombre_tab1a [(nombre_columna, ...)] [ON DELETE {CASCADE I SET NULL I NO ACTION} ] [ON UPDATE {CASCADE |
SET NULL
I ND
ACTION} ] 111
Bases de
Datos
El formato que aquí se presentaes un formato reducido, compatible con la mayoría de los gestores de bases dedatos, para más información sobre un comando CREATE TABLE para un gestor en particular, se debe recurrir al manual de referencia del gestor.
La porción de sentencia(denicióïncreate, .. .)especicará. ladenición de los campos que va a contener la tabla y sus restricciones. Los puntos suspensivos sugieren que denicióïucreate se puede repetir tantas veces como sea necesario, por ejemplo si hay una tabla con 5columnas, habrá que especicar 5 veces denición_create.
El token opcional TEMPORARY se utiliza para crear tablas temporales (esto es, una tabla invisible al resto de usuarios y que se borrará en el momento de la desconexión del usuario que la creó). La primera cláusula que lleva la denición es denicióïncolumna, donde se especicará la denición de un campo o columna de la tabla:
definición_co1umna: nombre_columna tipo_datos NULL [NOT NULL] I [DEFAULT valor] [UNIQUE [KEY] I [PRIMARY] [definicióngreferencia]
KEY]
Se indica el nombre de columna yel tipo de datos, por ejemplo, el Codigo Postal podría ser un tipo NUMERIC(5,0) de MySQL, puesto que los códigos postales tienen 5 dígitos enteros y O decimales. NOT NULL y NULL especican que la columna admite o no admite valores nulos, es decir si un campo puede quedar sin valor, o con valor desconocido. DEFAULT indica el valor por defecto que toma el campo si no es especicado de forma explícita. Por ejemplo, si se declara la. siguiente columna: CodigoPostal Numeric(5,0)
NÜT NULL DEFAULT 28941
Se indica que el campo Código Postal es un número de 5 dígitos enteros, que no admite valores nulos, y que en caso deno especificarlo, por ejemplo, en una inserción, el valor que tomará es 28941. UNIQUE KEY especica la creación de un índice, esto es, una estructura de datos que permite un acceso rápido a la información de una tabla y además, controla que no haya ningún valor repetido en el campo. Se producirá un error si se intenta insertar un elemento que ya coincida con un valor anterior. A efectos prácticos, la diferencia con una clave primaria es básicamente que un campo UNIQUE puede admitir valores NULL, mientras que un campo que se dene como clave primaria no puede admitir nulos (debe ser NOT NULL). 112
Capítulo 3. Diseño sico relacional PRIMARY KEY indica que la columna denida es la clave primaria. Una tabla tan solo puede tener una clave primaria. Si se especica. a nivel de colummdenition, la clave solo puede tener un campo, si la clave se dene a nivel de tabla, la clave puede ser multicolumna.
3.8.1. Implementación
de restricciones
En la sintaxis de CREATE TABLE, deniciónJeferencia sirve para crear una clave foránea. De esta manera, se enlaza el campo a su campo origen, es decir se crea una
referencia:
Si existe la siguiente tabla creada:
create table
c1ientes(
dni varchar(9) PRIMARY KEY, nombre varchar(50), direccion varchar(60)
);
Se puede crear otra tabla mascotas que contenga el registro de las mascotas de una tienda veterinaria y con un campo que haga referencia al dueño de la mascota: create table
mascotas(
codigo integer PRIMARY KEY, nombre varchar(50), raza varchar(50), cliente varchar(9)
REFERENCES c1ientes(dni)
);
Las opciones ON DELETE
y ON UPDATE establecen el comportamiento del
gestor en caso deque las las de la tabla padre (es decir, la tabla referenciada)se borren o se actualicen. Los comportamientos pueden ser CASCADE, SET NULL y NO ACTION.
ISi se usa NO ACTION y se intenta un borrado o actualización sobre la tabla padre, la operación se impide, rechazando el borrado o la actualización. ISi se especica CASCADE, la operación se propaga en cascada a la tabla hija, es decir, si se actualiza la tabla padre. se actualizan los registros relacionados de la tabla. hija, ysi se borra un registro de la tabla padre, se borran aquellos registros de la tabla hija que estén referenciando al registro borrado. 113
Bases de
Datos
ISi se indica SET NULL, se establece a NULL la clave foránea afectada por un borrado o modicación de la tabla padre.
create table
mascotas(
codigo integer PRIMARY KEY, nombre varchar(50), raza varchar(50), cliente varchar(9) UN DELETE
REFERENCES c1ientes(dni) CASCADE ON
UPDATE SET
Si no se especica ON DELETE
NULL
u ON UPDATE por
defecto se actúa como NO
ACTION. Oracle no implementa la opción ON UPDATE porque lo que hay recurrir a otros métodos para realizar las acciones de actualización, como por ejemplo, mediante
TRIGGERS (disparadores). La siguiente parte de la sintaxis de CREATE TABLE hace referencia a las declaraciones globales sobre la tabla, esto es, restricciones, claves primarias y foráneas compuestas, etc. [CÜNSTRAINT [símbo1o]] PRIMARY KEY (nombre_co1umna,. ..) I [CONSTRAINT [simbo1o]] FOREIGN KEY (nombre_co1umna, . ..) [definiciómreferencia]
En SQL, todas las restricciones pueden tener un nombre para facilitar su poste-
rior referencia, por tanto cuando aparezcael opcional CONSTRAINT [símbolo] se indica que la denición
de una restricción tiene un nombre.
PRIMARY KEY sirve para especicar la creación de una clave primaria a nivel de tabla. Existe la opción de crearla a nivel de columna, mediante denicióïncolumna o denirla aquí. Por ejemplo, es posible denir la siguiente tabla de dos formas: #primera forma create table
-nivel
de columna
vehicu1o(
matricula varchar(7) marca varchar(20), modelo varchar(20),
precio numeric(7,2)
primary key,
Capítulo 3. Diseño sico relacional #segunda forma create table
-nivel
de tabla
vehicu1o(
matricula varchar(7), marca varchar(20), modelo varchar(20),
precio numeric(7,2) primary key
(matricula)
);
Ambas formas son equivalentes. la diferencia es que mediante la segunda forma, es posible crear claves primarias compuestas por varios campos. Ejemplo: #Clave primaria
create table
=dni
+ n_ss
emp1eado(
dni varchar(9), n_ss varchar(15), nombre varchar(40),
PRIMARY KEY (dni,n_ss) #compuesta
De forma análoga, también se puede crear claves foráneas a. nivel de tabla, haciendo uso
de:
[CONSTRAINT [symbo1]] FÜREIGN KEY(index_col_name, . ..) [referencejefinition]
create table
mascotas(
codigo integer
PRIMARY KEY,
nombre varchar(50), raza varchar(50), cliente varchar(9), FOREIGN KEY
(cliente) references
clientes(dni)
);
Actividad 3.8: Conéctate a MySQLy pruebaa ejecutarlos comandos CREATE TABLE anteriores. Posteriormente, Conéctate a. Oracle mediante SQL*Plus y ejecútalos de nuevo. ¿Son compatibles?
115
Bases de
Datos
Para terminar, cada gestor de base de datos efectúa sus propias modicaciones al formato de la sintaxis create table. La cláusula opcionesiabla permite especicar las peculiaridades de cada gestor con respecto al almacenamiento en soporte físico de sus tablas. Además, cada gestor incorpora diversas características, por ejemplo, Oracle y DB2 implementan tipos de datos distintos a MySQL o a SQL Server y Access.
3.8.2. Tipos
de Datos
Los tipos de datos que pueden usarse tanto para MySQL como para Oracle en la denición de una. columna son los siguientes: MySQL
TINYINT [UNSIGNED] Entero SMALLINT [UNSIGNED] Entero MEDIUMIN T [UNSIGNED] Entero INT [UNSIGNED] Entero BIGINT [UNSIGNED] Entero INTEGER [UNSIGNED] Entero DOUBLE [UNSIGNED] Real Aproximado 8 bytes FLOAT [UNSIGNED] 4 bytes DECIMAL(longituddecimales) Real Exacto Variable NUMERIC(longitud,decimales) Real Exacto Variable NUMBER(longitudLdecimales]) Real Exacto Variable DATE Fecha
X
aaaa-mm-dd
TIME Hora
hhzmmzss
TIMESTAMP Fecha DATETIME Fecha CHAR(longitud) caracteres
y Hora y hora
VARCHARUongitud) caracteres VARCHAR2(longitud) caracteres
aaaa-mm-dd hhzmmzss aaaa-mm-dd hh:mm:ss Longitud Fija
Longitud Variable Longitud Variable
BLOB Objetos TEXT Campos CLOB Campos
binarios Longitud Memo Longitud Memo Longitud
EN UM(valor1,valor2,valor3...)
Enumeraciones Lista
SET(valor1, valor2, valor3. . . )Conjuntos
Variable Variable Variable
de valores
Conjuntos de valores
Cuadro 3.1: Tipos de datos en MySQL y Oracle/DBZ
ü
Puede verse que no todos los tipos de datos están en todos los gestores. Así por ejemplo, el tipo de datos ENUM no está disponible en Oracle y si en MySQL. Se utiliza para crear enumeraciones, esdecir, campos que admiten solo valores fijos, por ejemplo Color EN UM (rojo , hmaïvillo , verde ). En Oracle, en su lugar, se puede implementar utilizando la directiva CHECK. 116
Capítulo 3. Diseño fisico relacional
3.8.3. Características
de la creación de
tablas para
MySQL
Las opciones de tabla para l\vIySQL son las siguientes: opciones_tab1a: opción_tab1a
[opción_tab1a]
opción_tab1a: ENGINE =nombre_motor l AUTÜ_INCREMENT =valor
I [DEFAULT] CHARACTER SET juego_caracteres [COLLATE I CHECKSUM = {o
colación]
I 1}
| COMMENT= string l MAX_ROWS =valor I MIN_ROWS
= Valor
El almacenamiento fisico de una tabla en MySQL está controlada por un software especial denominado Motor de almacenamiento. Mediante la opción ENGINE= nombreJnotor se indica el motor de almacenamiento para la tabla. Puede ser, entre otros, innodb, que son tablas transaccionales con bloqueo de registro y claves foráneas, mylsam por defecto usado por MySQL y que genera tablas operadas a gran velocidad, pero sin control de integridad referencial y Memory, que genera tablas que están almacenadas en memoria en lugar de un archivo físico. La opción AUTOJNCREMENT permite indicar el valor inicial para campos de tipo AUTOJNCREMENT. AUTOJNCREMENT indica que ese campo es autoincrementado después de cada. inserción. Un campo denido como autojncrement debe ser numérico; de esta manera, cuando en ese campo se indica el valor NULL en una inserción, el campo toma automáticamente el último valor incrementado en una unidad. Este campo es muy útil para los campos código donde se especican valores clave autogenerados. En MySQL para denir un campo AUTOJNCREMENT se especica la palabra clave justo a continuación del tipo de datos. Para simular este
comportamiento enOracle, seutiliza una secuencia (SEQUENCE). ÏDEFAULT] CHARACTER SET Especica el conjunto de caracterespara la tabla y COLLATE dene la colación por defecto de la tabla. Si se especica CHECKSUM, MySQL mantiene una suma de vericación para todos los registros. El co-
mando CHECKSUM TABLE muestra esa sumade vericación (solo para motores de almacenamiento 1\ilyISAl\l). COMMENT es un comentario para la tabla, hasta 60 caracteres. También es posible crear comentarios para cada una de las columnas. Mediante el token COMMENT 117
Bases de
Datos
se puede documentar el diccionario de datos. MySQL dispone de este token para comentar no
solo tablas, sino también
columnas.
MAX_ROWS es el máximo número de registros que se quiere almacenar en la tabla. No es un límite absoluto, sino un indicador que la tabla debe ser capaz de almacenar al menos estos registros. MIN_ROWS es el mínimo número de registros que se planea almacenar en la tabla. Por último, al igual que en la creación de base de datos, MySQL dispone de la cláusula IF NOT EXISTS, para que solamente se cree la tabla si no está creada previamente.
#Ejemp1o de
creación de
tabla en
create table
if not
codigo int
MySQL
exists Pedido(
auto_increment primary
key,
fecha datetime,
estado enum(Pendiente,Entregado,Rechazado) )
comment =
tab1a de
auto_increment
pedidos a
proveedores
=10000
max_rows=100000O checksum=1
engine=innodb;
3.8.4. Características
de la creación de
tablas para
Oracle
En Oracle, la mayoría de las opciones tienen que ver con su almacenamiento físico. Por ejemplo, las tablas deben ser almacenadas en un contenedor llamado
tablespace (Espacio de tablas). Por defecto, si no se indican opciones dealmacenamiento, la tabla se ubica en el tablespace del usuario, pero si se quiere ubicar en otro tablespace, se puede incluir la opción tablespace nombre para designar otro tablespace. Además, se puede denir cómo se reserva.el espacio en disco para controlar el crecimiento desmedido del tamaño de una tabla mediante la cláusula storage. Estas y muchas otras opciones. son propias de Oracle. Por último, cabe destacar la capacidad de Oracle de permitir la creación de restricciones de tipo CHECK, que permite validar el valor de un campo mediante una expresión. --Ejemplo de
creación de
create table
codigo integer fecha date,
estado varchar(10).
118
tablas con
Pedido(
primary key,
opciones propias
de Oracle
Capítulo 3. Diseño físico relaciona]
constraint
c_estado
check (estado IN (Pendiente,Entregado,Rechazado)) )
tablespace
Administracion
storage (initial 100k next 100k minextents 1 maxextents unlimited pctincrease 0);
3.8.5.
Consulta
de las tablas
de una
base
de datos
Para consultarlas tablas disponiblesde una base de datos en MySQL, se utiliza el comando SHOW TABLES
mysq1> show tables; + --------------------
--+
I Tab1es_in_jardineria I + --------------------
--+
| Clientes I Deta11ePedidos I I Productos + --------------------
--+
En Oracle, se pueden consultarlas vistas user_tables,dbajcables y alLtables. En Oracle, las vistas que comienzanpor usen, aportan informaciónsobrelos objetos que poseeel usuario conectado.Las vistas que comienzanpor dba- son solo accesibles por los administradoresde basesde datos y muestran información sobre todos los objetos.Finalmente, las vistas que comienzanpor all- muestranla informaciónsobre los objetos a los que el usuario tiene acceso,sean suyoso no.
SQL> select
table_name
from
user_tables;
TABLE_NAME PARTIDOS
ESTADISTICAS JUGADORES EQUIPOS
3.8.6.
Consulta
de la estructura
de una
tabla
Para conocerla estructura de una tabla ya creada es posibleutilizar el comando 119
Bases de
Datos
DESCRIBE [esquema.] nombre_tab1a Este comando muestra un listado con las Columnas de la tabla. aportando información sobre los tipos de datos, restricciones, etc.
SQL> describe
nba.equipos;
NOT NULL
VARCHAR2 (20) VARCHARQ (20)
CONFERENCIA VARCHARQ
(4)
DIVISION VARCHAR2(9)
3.9. Modicación
de tablas
El comando para modicar es bastante compleja:
una tabla es ALTER TABLE y su sintaxis también
ALTER TABLE
nombre_tab1a
especificación_a1ter [,
especificación_a1ter]
especificación_a1ter: ADD definición_co1umna I AFTER nombre_co1umna [FIRST ] I ADD (definición_columna,...) I ADD [CÜNSTRAINT [símboloïl] PRIMARY KEY (nombre_co1umna,...) I ADD
[CONSTRAINT [símbo1o]]
UNIQUE (nombre_co1umna,...) IADD [CONSTRAINT [simbo1o]] FOREIGN KEY (nombre_co1umna,...) [definición_referencia] I CHANGE [COLUMN] anterior_nombre_co1umna [FIRSTIAFTER nombre_columna] RENAME COLUMN anterior_nombre_co1umna TD
MDDIFY definición_columna DRÜP COLUMN nombre_co1umna DROP PRIMARY
KEY
DROP FOREIGN KEY fk_símbo1o
opciones_tabla 120
[FIRST I
definición_co1umna nuevo_nombre_co1umna
AFTER nombre_columna]
Capítulo 3. Diseño físico relacional Al ver esta sintaxis se puede caer en la tentación de pensar que es mejor borrar una tabla y volver a crearla haciendo las modicaciones oportunas. Esto es posible si la tabla no tiene datos, pero. .. ¿qué ocurre si hay un centenar o un millar de registros? No queda otra opción que ejecutar una sentencia ALTER TABLE para evitar la pérdida de datos. ILa opción ADD permite añadir una columna, se puede especicar el lugar donde se va a insertar mediante las cláusulas AFTER (después de una colum-
na) y FIRST (la primera columna). Oracle no admite las cláusulas AFTER y FIRST.
ICon
la opción MODIFY se cambia el tipo de datos de una columna y se añaden
restricciones.
ICon la opción DROP se pueden eliminar las restricciones de claves foráneas y primarias, dejando el tipo de dato y su contenido intacto. - Las opciones de tabla, al igual que en CREATE TABLE varían con cada SGBD, y sirven principalmente para modicar las características del almacenamiento físico.
- Para cambiar el nombre de una columna, Oracle usa la cláusula RENAME y MySQL la cláusula CHANGE. Por ejemplo, en MySQL, para añadir a la tabla mascotas el campo especie después del campo Raza, habría que ejecutar la siguiente instrucción:
ALTER TABLE Mascotas ADD Especie VARCHAR(10) AFTER Raza;
Para eliminar la columna con clave primaria CodigoCliente de la tabla Clientes en Oracle y establecer como clave primaria. el campo NIF , hay que ejecutar las siguientes sentencias:
ALTER TABLE
Clientes DRDP
PRIMARY KEY;
ALTER TABLE Clientes DROP CodigoC1iente; ALTER TABLE Clientes ADD CÜLUMN Nif
VARCHAR(10) PRIMARY
KEY FIRST
;
121
Bases de
Datos
3.10. Borrado
de tablas
El formato de instrucción en l\IySQL para el borrado de una tabla es muy sencillo: DRDP [TEMPORARY]
TABLE
tb1_name [,
tbl_name]
Ejemplo: DRDP TABLE
Mascotas;
DRDP TABLE Clientes, Empleados;
En Oracle, cambia un poco pero es muy similar: DRDP [TEMPORARY] TABLE tbl_name
[CASCADE CÜNSTRAINT]
No se permite el borrado de varias tablas en la misma sentencia, y, de forma opcional, CASCADE CONSTRAINT exige a Oracle que elimine las claves foráneas de las tablas relacionadas (en cascada). --Elimina la
tabla Partidos
DRDP TABLE
--Elimina la --borra las
Partidos;
tabla Jugadores claves foráneas
y de otras
DRDP TABLE Jugadores CASCADE
3.11. Renombrado
tablas
CONSTRAINT;
de tablas
Para renombrar una tabla en MySQL se usa el comando RENAME TABLE: RENAME TABLE nombre_tabla TD
[, nombre_tabla
nuevo_nombre_tab1a
TD nuevo_nombre_tab1a]
Ejemplo: RENAME TABLE
Mascotas TD
Animales;
En Oracle, no hay que indicar el token TABLE. basta con poner: RENAME Jugadores
122
T0 Baloncestistas;
Capítulo 3. Diseño sico relacional
3.12. Prácticas
Resueltas
Práctica 3.1:
Modelo físico para stratrekfanscom v.1.0
En un chero de texto con nombre startreklsql, escribe las sentencias SQL para crear el modelo físico de la práctica 2.1. Después, crea una base de datos llamada startrek en un servidor MySQL yejecuta las sentencias con comando source. A
continuación, Conéctate a Oracle con el usuario administrador (sqlplus /as sysdba) y crea un usuario en una instancia de oracle con el comando: CREATE USER startrek IDENTIFIED QUOTA UNLIMITED
BY startrekpwd
ON USERS;
.Dale permisos al usuario startrek para iniciar sesion y crear tablas con: GRANT CREATE SESSION,CREATE TABLE
TO startrek;
Con ese usuario, Conéctate a sqlplus y ejecuta el chero que has creado. startrek1.sq1 CREATE TABLE
Actores(
Codigo integer PRIMARY KEY, Nombre varchar(50) NOT NULL, Fecha DATE
NOT NULL,
Nacionalidad varchar(20)
DEFAULT EEUU
);
CREATE TABLEPersonajes( Codigo integer PRIMARY KEY, Nombre varchar(50) NOT NULL, Raza varchar(20) NOT NULL, Grado varchar(20) NOT NULL, CodigoActor integer Codigosuperior integer
NOT NULL, NULL,
FOREIGN KEY (CodigoActor) REFERENCES Actores(Codigo), FOREIGN KEY (Codigosuperior) REFERENCES Personajes(Codigo) ); CREATE TABLE
P1anetas(
Codigo integer
PRIMARY KEY,
Galaxia varchar(50)
NULL,
Nombre varchar(50)
NOT NULL
);
CREATE TABLECapitulos( ¡Temporada
N Orden
integer,
integer, Titulo varchar(50)
NOT NULL,
123
Bases de Datos
Fecha
date
NOT NULL,
PRIMARYKEY (Temporada, Orden) ); CREATE TABLE Pe1iculas(
Codigo integer PRIMARY KEY, Titulo varchar(50) NOT NULL, Director varchar(30) NOT NULL, Anyo Date NULL );
CREATETABLE PersonajesCapitu1os( CodigoPersonaje integer PRIMARY KEY, Temporada integer NOT NULL, Orden integer NOT NULL,
FOREIGNKEY (Temporada,Orden) REFERENCES
Capitulos(Temporada,Orden)
);
CREATE TABLEPersonajesPe1icu1as( CodigoPersonaje integer REFERENCES CodigoPelicu1a integer REFERENCES
Personajes(Codigo), Pe1icu1as(Codigo)
); CREATE TABLE
Naves(
Codigo integer PRIMARY KEY, NTripu1antes integer NULL, Nombre
varchar(50)
NOT NULL
); CREATE TABLE
Visitas(
CodigoNave integer REFERENCES CodigoP1aneta integer REFERENCES
Naves(Codigo), P1anetas(Codigo),
Temporada integer NOT NULL, Orden integer NOT NULL,
FOREIGNKEY (Temporada,Orden) REFERENCES
Capitulos(Temporada,Orden)
Con el chero anterior llamado startreILsqI, en mysql: mysql> CREATE DATABASE Startrek; USE Stratrek; mysql>source stratrelczsql En Oracle: sqlplus / as sysdba SQL> CREA TE USER startrek IDENTIFIED BY startrekpwd; SQL> GRANT CREATE SESSIOMCREATE TABLE TO startrek; SQL>ezit sqlplus startrek/startrekpwd SQL> @startrek.sql
124
Capítulo 3. Diseño físico relacional
Práctica 3.2:
Restricciones parastartrekfanscom v.1.0
Se deseaimponer las siguientes características al modelo físico, pero son dependientes del gestor de base de datos donde se van a codicar, así que se codican en cheros independientes. Para MySQL se desea: IQue todas las tablas tengan el motor de almacenamiento innodb para que las claves foráneas no sean ignoradas. -Que
las claves primarias numéricas sean de tipo autojncrement.
n Que el campo Galaxia de la tabla Planetas sea una enumeración de los valores (Via LácteaÚAndrómedafsombrero). Para Oracle
se desea:
-Que
las tablas se encuentren ubicadas en el tablespace STARTREK.
IQue
el campo NTripulantes de la tabla Naves solo pueda tener un valor entre
1 y 500.
IQue el campo Galaxia de la tabla Planetas solo pueda tener los valores (Via Láctea,Andrómeda,Sombrero). Las sentencias SQL para efectuar los cambios en MySQL son: Cambios en #Las tablas
se pueden
ALTER TABLE
Actores ENGINE=innodb;
ó, si
están vacías
DRÜP TABLE CREATE TABLE
cambiar de
se puede
MySQL
dos formas:
hacer:
Actores; Actores(
) ENGINE=innodb; #Para cambiar a auto_increment
la clave
primaria
#se usa: ALTER TABLE
Actores MODIFY
Codigo integer #Para cambiar ALTER TABLE
auto_increment PRIMARY
el campo
Galaxia a
KEY;
una enumeración:
Planetas MODIFY
Galaxia ENUM
(Via Láctea,Andrómeda,Sombrero);
Las sentencias SQL para efectuar los cambios en Oracle son:
125
Bases
de Datos
Cambios
-- Asignar --hacer si drop table
el tablespace STARTREK están vacías, y actores cascade
en Oracle
a las recrearlasz constraints;
tablas,
solo
se puede
CREATE TABLE Actores(
Codigo integer PRIMARY
KEY,
Nombre varchar(50) Fecha
NOT NULL,
DATE NOT NULL,
Nacionalidad
varchar(20) DEFAULT
EEUU
) TABLESPACE STARTREK; -- Para cambiar el campo NTripu1antes: ALTER TABLE Naves MDDIFY NTripu1antes
check (NTripu1antes>=1 --
Para
añadir
la
restricción
ALTER TABLE Planetas MDDIFY
CHECK (Galaxia
IN (Via
integer
and NTripu1antes USE Stratrek; mysql>source stratrekísql En Oracle: sqlplus startrek/startrekpwd S QL> @startrek2. sql
126
P1anetas(Codigo);
Capítulo 3. Diseño físico relacional
Práctica 3.4:
Modelo físico para stratrekfanscom v.3.0 Enun
chero de texto con nombre startrek3.sql, escribe las sentencias SQL para modicar el modelo físico de la práctica 2.2. Después,crea una base de datos llamada startrek en un servidor MySQL. Ejecuta las sentencias del chero en un servidor de MySQL con el comando source.
A continuación,
Conéctate a Oracle con el usuario startrek
y ejecuta el chero que has creado. startrek3.sql CREATE TABLE
Lanzaderas(
CodigoNave integer, Numero integer, Personas integer,
PRIMARY KEY(CodigoNave,Numero), FOREIGN KEY(CodigoNave) REFERENCES Naves(Codigo)
Can el chero anterior llamado startrekísql, mysql) USE Stratrek; mysql>source stratrekzsql En Oracle: sqlplus startrek/starirekpwd SQL> @startrek2. sql
en mysql:
127
Bases de
Datos
3.13. Prácticas
Propuestas
Práctica 3.5: Modelo físicopara jerarquías Dado el diagrama E / R de la gura siguiente, genera el modelo físico, codicando en SQL todas las sentencias para crear las tablas de dos maneras posibles, generando una tabla para cada especialización. y generando una sola tabla para los empleados. Ejecuta los dos modelos tanto en Oracle como en l\IySQL.
Práctica 3.6:
Más modelos
físico
Para los modelos lógicos creados en las prácticas 2.4. 2.5. 2.6 y2.7, crea el modelo físico asociado mediante varios cheros con extensión sql. En l\'IySQL crea una base de datos para cada modelo y ejecuta el chero correspondiente, y en Oracle, crea un usuario distinto que contenga cada uno de los esquemas delas diferentes prácticas.
128
Capítulo 3. Diseño sico relacional
Práctica 3.7:
Parque Ecológico
Un parque ecológico quiere informatizar la gestión de su sistema de información para poder obtener datos más concluyentes sobre las especies migratorias que se establecen en su territorio. El parque desea clasicar todas las especies animales y contabilizar el número de individuos de cada especie que se establecen en el territorio en cada época del año. Se desea que la base de datos almacene datos de nuevas especiesy nuevos individuos de cada especie animal. Para cada especie, se requiere el nombre de la especie, características generales de un individuo tipo y sus periodos migratorios. Para cada individuo se tendrá en cuenta el peso, dimensiones, y un código que identique de forma única cada individuo dentro de su especie. Esta forma de identicación, irá almacenada en un pequeño dispositivo con una batería autónoma implantada en el animal, y que servirá para detectar cuando el individuo sale o entra en el territorio gracias a unas torretas de control instaladas en el perímetro del parque. Estas torretas informan vía inalámbrica al sistema de las idas y venidas de cada individuo. De esta manera, se pueden contabilizar sus migraciones y los posibles descontroles que sufran en el periodo migratorio. Toda la información sobre migraciones de individuos de determinadas especies será enviada cada tres meses aun grupo de expertos biólogos, encargados de hacer una valoración sobre futuros periodos migratorios y posibles alteraciones del comportamiento de las especies. Delos biólogos, se quiere almacenar, el nombre, la dirección, provincia y su fecha de titulación. En principio, no se conocetodavía si se implementará en Oracle o MySQL por lo que el diseño debe ser compatible para ambos gestores de bases de datos.
Práctica 3.8:
BuscoPareja.net
Se va a crear una página Web de contactos en el dominio BuscoPareja.net. Cuando un usuario se registra en el sistema, se almacenan sus datos personales, concretamente su email, su nombre, dirección, ciudad, país, su sexo y orientación sexual, su foto y una password que utilizará junto con su email para acceder al sistema. El usuario a continuación rellena una lista de preferencias o gustos. De cada gusto o preferencia se almacenará el tipo (Deporte, Música, Evento Social), la fecha de la última. vez que hizo una actividad de ese estilo y si le gustaría o no que su pareja tuviera la misma preferencia. A partir de esta información se organizan citas entre los contactos en distintas ubicaciones. Se desea registrar las citas entre los contactos almacenando quién se cita con quién. en qué lugar y a qué hora, y si la cita fracasó. Se desearealizar el diseño conceptual. lógico y físico de la base de datos, creando el modelo físico para Oracle y para MySQL.
129
Bases de
Datos
3.14.
Resumen
Los conceptos clave de este capítulo son los siguientes: Las herramientas grácas ayudan al informático a gestionar los componentes de una base de datos, pero además, un buen administrador debe conocer los comandos necesarios para hacer las tareas administrativas. Entre las herramientas grácas que dispone el mercado, se encuentran PhpMyAdmin, de MySQL, Enterprise Manager y Grid Control, de Oracle y Data Studio de DB2. Un intérprete de comandos envía comandos en modo texto al SGDB y muestra los resultados en una consola. Estos intérpretes de comandos suelen permitir la ejecución remota de comandos a través de protocolos TCP-IP. Entre otros
están, mysqly SQL*Plus e iSQL*Plus(Oracle). El DDL o Data Denition Language de SQL dene la sintaxis de los comandos CREATE, DROP y ALTER, para crear, borrar y modicar objetos de una BBDD.
El comando CREATE DATABASE permite crear bases dedatos en los SGBD. Algunos SGBD permiten manipular varias BBDD mediante una sola instancia, otros, como Oracle, permiten solo manipular una BBDD por instancia. Además, existen asistentes grácos (como dbca de Oracle), que permiten de forma sencilla
crear bases
de datos.
El comando ALTER DATABASE permite modicar ciertos parámetros de funcionamiento de la BBDD. Estos parámetros dependen del funcionamiento y de la arquitectura del SGBD, por tanto, no son estándar. El comando
DROP DATABASE
borra una
base de datos de
un servidor.
Los comandos CREATE TABLE, ALTER TABLE y DROP TABLE están denidos en el estándar SQL para poder crear, modicar y borrar tablas, y, salvo pequeñasdiferencias, se pueden escribir estos comandoscompatibles para la mayoría de los SGBD. Para implementar restricciones se usan las cláusulas PRIMARY KEY (claves primarias) y REFERENCES (para claves Foráneas). Hay dos formas de crearlas, a nivel de tabla y a nivel de columna. A nivel de tabla es posible especicar claves compuestas. Es posible también, denir otras restricciones como las UNIQUE, CHECK, NULL o NOT NULL, etc. Los comandos DESCRIBE y RENAME sirven para mostrar la estructura de una tabla y cambiarle el nombre a un objeto. 130
3.15. Test
de repaso Capítulo 3. Diseño sico relacional
1. ¿Qué función no phpMyAdmin?
permite realizar
a) Ejecución remota de comandos b)
Copias de seguridad
c) Creación y borrado de tablas d )Parar
6. La
y arrancar el servidor
2. Oracle
Grid Control
opción ON
del comando
no permite
DELETE CASCADE
CREATE TABLE
a) No funciona en Oracle
a)Controlar
el estado de múltiples BBDD
b) No funciona en MySQL
b) Controlar
múltiples servidores
c) Permite borrar registros relacionados en cascada
c)
Creación y borrado de tablas d) Permite 7. A
)
d Parar
borrar claves foráneas en cascada
una restricción
a) No se le puede poner nombre b) Se
y arrancar un SGBD
le puede
poner nombre
mediante
CONSTRAINT 3. El
comando CREATE
DATABASE
no
TRICTION
a) Es una sentencia DDL b) Es compatible entre los distintos SGBD C)
c) Se le puede poner nombre mediante RES-
Permite especicar
los tablespaces de una
d) Se le puede poner nombre mediante REFERENCES
8. autojncrement
es una opción
BBDD
d) Permite
especicar el juego de caracteres
a) Sólo de MySQL b) Para incrementar valores numéricos de for-
4. Una
ma automática
clave foránea
a) Se dene con FOREIGN KEY b) Se dene con REF ERENCES
c) Se suele aplicar a las claves primarias d) Todas las anteriores son correctas
c) Puede ser compuesta
9. Con el comando
d) Todas las anteriores son correctas
a Borrar
5. Para
arrancar el
Enterprise Manager
a) No hay que hacer nada, viene instalado por defecto
)
b Modicar c Cambiarle
d Todas
ALTER, no
una columna
el tipo de dato de una columna el nombre
a la tabla
las opciones anteriores son posibles
b) Hay que arrancarlo con el comando ernctl start dbconsole
c) Hay que arrancarlo con el comando emctl stop dbconsole d) Es un entorno gráco basado en ventanas
se puede
)
Bases de
3.16.
Datos
Comprueba tu
aprendizaje
. Nombra los distintos tipos de instrucciones DDL que puede haber, distinguiendo el tipo de objeto que se puede crear, borrar o modicar. .Pon un ejemplo de un tipo de dato numérico, otro alfanumérico y otro
añadir una
para qué sirven los siguien-
tes tokens
datos
(DBA) conocer los comandosSQL además de
saber usar
las herra-
mientas grácas? . Escribe,
sin mirar
ICOLLATION nCHARACTER
comando CREATE crear una
tabla de
un
TABLE para alumnos con
5
campos a tu elección. . Escribe,
sin mirar
la sintaxis,
un
comando ALTER TABLE para añadir un campo a la tabla. ante-
. Escribe,
sin mirar
la sintaxis,
un
comando CREATE TABLE para crear la tabla Notas y luego. un comando ALTER TABLE para
132
VAR-
.¿Qué diferencia hay entre un campo F LOAT y uno NUMBER? para qué sirven los tokens
de crea.ción
de bases
de datos
TA-
BLESPACE y DATAFILE en Oracle.
.Comenta para qué sirven las cláusulas ON DELETE y ON UPDATE de .Para
I'lOI'.
SET
¿Qué diferencia hay entre CHAR y CHAR?
.Dene la sintaxis,
tablas
nAUTOJNCREMENT
11.
bases de
creación de
a ENGINE
can enel tema (por ejemplo, MMC
administrador de
de la
en l\IySQL:
Nombra tres herramientas grácas y sus correspondientes gestores. Añade alguno de los que no aparez-
.¿Por qué es fundamental para un
tabla
. ¿Qué tipos de columna dene Oracle que no son compatibles con MySQL?
. ¿Cómo se instala phpMyAdmin en Linux? ¿Necesitas algún otro software para poder instalarlo?
de SQL Server).
a la
anterior.
. Dene
de fecha/hora.
clave foránea
REFERENCES.
las cláusulas
anteriores exis-
ten tres opciones SET NULL, CASCADE y NO ACTION. Comenta qué efecto tiene sobre los borrados y las modicaciones de registros en tablas relacionadas.
CAPÍTULO 4
Realización de
Consultas Objetivos W Identicar herramientas y sen. tencias para reahzar consultas
Contenidos . W La
sentencia SELECT
.
Identicar y
B? Consultas básicas, ltros y ordenación
crear consultas
Simples 50m9 una tabla» _
Identicar y crear consultas que gGHCÏHH valores resumen
Consultas resufnen subconsmtas Identicar
y crear con composiciones
Consultas multitabla.
consultas internas y
Compo- externas
siciones internas y externas
Identicar crear y subconsultas
Consultas reexivas Valorar ventajas las inconvee COHSUÏWS tablas COTI deïiVadas
nientes de las distintasopciones válidas para realizar una consulta
Con este tema, se detalla Ia sintaxis completa de 1a sentencia SELECT en toda su extensión. Se proporciona a1 estudiante métodos para construir consultas simples y complejas de forma estructurada, con ltros, agrupaciones y ordenaciones.
133
Bases de
Datos
4.1. El
lenguaje DML
Las sentencias DML del lenguaje SQL son las siguientes: - La sentencia SELECT, que se utiliza para extraer información de la base de datos, ya sea de una tabla o de varias. ILa sentencia INSERT, cuyo cometido es insertar uno o varios registros en alguna tabla. ILa
sentencia DELETE, que borra registros de una tabla.
ILa
sentencia UPDATE, que modica
registros de una tabla.
Cualquier ejecución de un comando en un SGBD se denomina.CONSULTA, término derivado del anglosajón QUERY. Este término debe ser entendido más que corno una consulta de información, como una orden, esdecir, las QUERYS o CONSULTAS no son solo SELECT, sino también cualquier sentencia de tipo UPDATE, INSERT, CREATE, DROP, etc, entendidas todas ellas como peticiones al SGBD para realizar una operación
determinada.
4.2. La
sentencia SELECT
La sentencia SELECT es la sentencia más versátil de todo SQL, y por tanto la más compleja de todas. Como se ha expuesto anteriormente, se utiliza para consultar información de determinadas tablas. Es posible ejecutar sentencias muy sencillas que muestran todos los registros de una tabla: #esta consulta selecciona todos los campos #registros de la tabla empleados SELECT * FROM empleados;
y muestra
todos los
O incluso consultas que obtienen información ltrada de múltiples tablas, usando relaciones entre tablas e incluso tablas virtuales creadas a partir de una consulta. #esta consulta #de los
clientes de
obtiene el
total de
los pedidos
una tienda
SELECT NombreC1iente,tot.Cantidad FROM C1ientes,Pedidos,
(SELECT sum(Cantidad*PrecioUnidad) FROM Deta11ePedidos
GROUP BY
as Cantidad,NumeroPedido NumeroPedido) tot
WHERE Clientes.NumeroC1iente=Pedidos.NumeroC1iente
AND Pedidos.numeroPedido=tot.NumeroPedido
134
ORDER BY
Cantidad;
Capítulo 4. Realización de Consultas
4.3. Consultas
básicas
El formato básico para hacer una consulta es el siguiente: SELECT [DISTINCT] se1ect_expr [,select_expr] select_expr: nombre_co1umna [AS
[FROM
tabla]
alias]
| 4:
I expresión
nombre_columna indica un nombre de columna, es decir, se puede seleccionar de una tabla una serie de columnas, o todas si se usa *, o una expresión algebraica compuesta por operadores, operandos y funciones. El parámetro opcional DISTINCT fuerza que solo se muestren los registros con valores distintos, o, dicho de otro modo, que suprima las repeticiones. En la página siguiente, se muestran algunos ejemplos del uso de la sentencia
SELECT. Hay que prestaratención a algunas curiosidadesl: n En la consulta 4 se selecciona una columna calculada (1+5), con la selección de los registros de una tabla, incorporándose esa nueva columna creada al conjunto de las devueltas por el gestor. - En la consulta número 5 se hace uso de una expresión algebraica para crear una columna cuyo resultado será el de sumar 1 y6. Para hacer esto, en MySQL no es necesario indicar la cláusula FROM, pero en Oracle, hay que poner la cláusula FROM con la tabla dual. Al no haber una tabla real seleccionada, el resultado será
una única
la con
el resultado.
- En la consulta 3 se hace uso de la función concat cuyo cometido es concatenar dos columnas creando una única columna. En Oracle, la función concat solo admite dos parámetros, mientras que en MySQL se puede concatenar múltiples parámetros. Para concatenar en oracle múltiples columnas se puede hacer uso del operador I I. Véase Sección6.4. IEn las consultas 6 y7 se muestran las marcas de los vehículos. La diferencia entre ambas consultas está en el uso del DISTINCT, que elimina las repeticiones. Hay dos vehículos seat en la consulta 6 y uno en la 7. ¡La ejecuciónde lasconsultas quese muestraa continuaciónestá realizadaen MySQL, pero son perfectamente compatibles con Oracle, excepto la consulta 5, que hay que añadir FROM dual. 135
Bases
de Datos
#consu1ta #consu1ta 1 SELECT
4
SELECT matricula, * FROM vehiculos;
I matricula I +
I 1129FGT
ibiza
I 1132GHT
leon
I M6836YX I 7423FZY
corolla coupe
I 3447BYD
a3 tdi
mode1o,1+5
FROM vehiculos; + --------+
gt I tdi
105cv I
g6 I
1+5 I --+----+
--+
1129FGT I
ibiza
1132GHT I
leon
M6836YX I I 7423FZY I
130cv I
-+-----+ modelo I
3447BYD I +
+
gt I tdi
6I 105cv I
corolla coupe I
g6 I
a3 tdi
130cv I
--------------
#consu1ta 5 #consu1ta
SELECT +-----+
2
SELECT matricula,
modelo I
1+6;
1+6 I
FROM vehiculos;
+-----+ 7I I +---+
1129FGT I 1132GHT
ibiza gt leon tdi 105cv
I M6836YX | 7423FZY coupe
corolla
I 3447BYD a3
tdi
#consu1ta SELECT marca
I
g6 I
6 FROM vehiculos;
+--------+ | marca I
130cv
+ -------
--+
I seat I I seat I
l toyota I I hyundai I #consu1ta 3 SELECT matricula, +
I audi I -------
concat(marca,mode1o)
as coche #consu1ta 7
FROM vehiculos; + ----------+ -------------------
+
I matricula I 1129FGT
SELECT DISTINCT
FROM vehiculos; seatibiza
gt
I 1132GHT
seatleon
I M6836YX I 7423FZY
toyotacorolla hyundaicoupe
I 3447BYD
audia3
136
--+
tdi
tdi
105cv
g6
130CV
marca
6I
6I 6I 6I --+-----+
Capítulo 4. Realización de Consultas
Actividad
4.1: Crea una tablaen MySQLcon lasiguiente estructura:
MASCOTAS(Nombre, especie, raza, edad, sexo).
Introduce 6 registros2 y,a continuación,codica las siguientes querys: IMuestra
el nombre y la especie de todas las mascotas.
n Muestra el nombre y el sexo de las mascotas poniendo un alias a los campos. IMuestra
el nombre y la fecha de nacimiento aproximada de las mascotas (con-
sulta la documentación deMySQL y usa la función date_suby now). Realiza el mismo procedimiento creando 1a tabla en Oracle.
4.4. Filtros Los ltros son condiciones que cualquier gestor de base de datos interpreta para seleccionar registros y mostrarles como resultado de la consulta. En SQL la palabra clave para realizar ltros es la cláusula WHERE. A continuación
se añade
a la sintaxis de
la cláusula
SELECT la
sintaxis de
los
ltros:
SELECT [DISTINCT] select_expr [,select_expr] [FROM tabla]
[WHERE filtro]
ltro es una ¡expresión que indicala condicióno condiciones que debensatisfacer los registros para ser seleccionados. Un ejemplo de funcionamiento sería el siguiente: itselecciona los SELECT
vehículos de
*FROM
1a marca
seat
vehiculos
WHERE marca= +---------
seat ; --+ --------------
--+ -----
-+
| matricula +---------
l modelo --+ --------------
--+ -----
--+
I seat --+ -----
--+
I 1129FGT | 1132GHT +---------
I ibiza
gt
l leon tdi 105cv --+ --------------
2 VéaseCapítulo 5si es necesario. 137
Bases de
Datos
4.4.1. Expresiones
para ltros
Los ltros se construyen mediante expresiones. Una expresión, es una combinación de operadores, operandos y funciones que producen un resultado. Por ejemplo, una expresión puede ser: #expresión
1(oracle):
SELECT (2+3)*7
ttexpresión 2
(2+3)*7
from dual;
(mysql): (2+3)>(6*2)
SELECT (24-3)>(6*2);
#0 =falso,
es falso
que 5>12
itexpresión 3 (mysql): 1a fecha de SELECT date_sub(now(), interval 31
hoy -31 year);
+ ---------------------------------
+
I date_sub(now(),
interval 31
años;
year) |
Se detalla a continuación los elementos que pueden formar parte de las expresiones:
IOperandos: Los operandos pueden ser constantes. por ejemplo el número entero 3, el número real 2.3, la cadena de caracteres España o la fecha C201001-02; también pueden ser variables, por ejemplo el campo edad o o el campo
NombreMascota; ypueden sertambién otras expresiones 3. IOperadores aritméticos: +, -, *, /, 7c. El operador + yel operador-se utilizan para sumar o restar dos operandos(binario) o para poner el signo positivo o negativo a un operando (unario). El operador * es la multiplicación de dos operandosyel operador /es para dividir. El operador% o resto dela división entera a°7ob devuelve el resto de dividir a
entre b.
3Todas losoperandos numéricosya seanreales oenteros vansin comilla simple, ycualquier otra cosa que no sea número, por ejemplo, cadenas de caracteres o fechas, van entre comillas simples. 138
Capítulo 4. Realización de Consultas - Operadores relacionales: >, =, b devuelve 1 si a es estrictamente mayor que b y O en caso contrario. La. expresión de devuelve 1 si d y e son valores distintos. IOperadores lógicos: AND, OR, NOT. Los operadores lógicos toman como operandos valores lógicos, esto es, cierto o falso, en caso de SQL, 1 o O. Los operadores lógicos se comportan según las siguientes tablas de verdad: Operando 1
Operando 2
Opl AND
Op2 Opl
OR Op2
NOT Opl
falso falso
falso falso
cierto
falso cierto
falso cierto
cierto
cierto falso
falso cierto
falso
cierto cierto
cierto cierto
falso
Cuadro 4.1: Tabla de verdad de los operadores lógicos.
Por otro lado, se necesita un tratamiento de los valores nulos; hay que incluir como un posible operando el valor nulo: Operando 1
Operando 2
Opl AND
Op2 Opl
OR Op2
NOT Opl
falso falso
falso falso
cierto
falso cierto
falso cierto
cierto
cierto falso
falso cierto
falso
cierto cierto
cierto cierto
falso
nulo
Xnulo
nulo nulo
nulo nulo
nulo
Cuadro 4.2: Tabla de verdad de los operadores lógicos con valores nulos.
-Paréntesis: Los
operadores tienenuna prioridad, por ejemplo, en la ex-
presión 3+4*2, la multiplicación se aplica antes que la suma, se dice que el operador * tiene ¡nas prioridad que el operador +. Para alterar esta prioridad, se puede usar el operador paréntesis, cuyo cometido es precisamente dar máxi-
ma prioridad a una parte de una expresión.Así, (3+4)*2, no eslo mismo que 3+4*2. 139
Bases de
Datos
u Funciones: date_add, concat, left, right. . .. Cada SGBD incorpora su propio repertorio de funciones que en pocas ocasiones coincide con el de otros SGBD. En la tabla que se muestra a continuación aparecen los resultados que provoca la ejecución de algunos de los operadores descritos:
í í (1o>=1o AND
o= 970 AND Peso 228 + -------------
ORDER BY
--+ ---------
I Nombre_equipo
I avg(peso)
avg(peso);
--+
l
228.8462 229.6923
Bases de
Datos
#query 2 #seleccionar qué
equipos de
la nba
tienen más
de 1jugador
español
SELECT Nombre_equipo,count(*) FROM jugadores WHERE procedencia=Spain GROUP BY Nombre_equipo HAVING count(*)>1; + -------------
--+ --------
I Nombre_equipo
--+
I count(*)
I
4.7. Subconsultas Las subconsultas se utilizan para realizar ltrados con los datos de otra consulta. Estos ltros pueden ser aplicados tanto en la cláusula WHERE para ltrar registros como en la cláusula HAVING para ltrar grupos. Por ejemplo, con la base de datos de la NBA, es posible codicar una consulta para pedir los nombres de los jugadores de la división SouthEast:
SELECT nombre WHERE Nombre_equipo
FROM jugadores IN
(SELECT Nombre FROM equipos WHRE division=SouthWest); +-------------------
--+
I nombre + -------------------
--+
I Andre
Brown I
| Kwame
Brown I
I Brian
Cardinal I
| Jason
Collins I
|
I + -------------------
--+
Se observa que la subconsulta es precisamente la sentencia SELECT encerrada entre paréntesis. De esta forma, se hace uso del operador in para tornar los equipos de la división SouthEast. Si se ejecuta la subconsulta por separado se obtiene: 152
Capítulo 4. Realización de Consultas SELECT Nombre FROM
equipos
WHERE division=SouthWest
;
"' """"" "+ La l Nmbre
subconsulta se convierte en algo equiva-
l lente
+ ---------
a:
--+
¡Hornets
I
SELECT nombre FROM jugadores
¡ Spurs
¡WHERE
| Rockets
| (Hornets
Nombre_equipo IN ,Spurs
,Rockets
,
I ¡ Mavericks I Grizzlies + ---------
Mavericks
I
,Grizzlies)
--+
En las siguientes secciones se detallan los posibles operadores que se pueden usar con las
subconsultas.
4.7.1. Test
de Comparación
Consiste en usar los operadores de comparación --, >=, y ALL
from jugadores
(SELECT peso FROMjugadores WHEREprocedencia=Spain);
I Michael
Doleac
I A1 Jefferson I Chris
Richard
A1 igual que en el casodel operadorexists,se puede asumir que por cada registro de la consulta principal se ejecuta una subconsulta.En tal caso, para el jugador Michae1 Doleac cuyopesoes262 libras, secomprobaríasi 262 esmayor que lospesos de todos los jugadores españoles,que son devueltos por la subconsulta(SELECT peso FROM jugadoresWHERE procedenciafspain). También se podría consultar los bases (en inglés Guard G) posicion=G, que pesanmás que cualquier (ANY) pívot (en inglésCenter "C) posicion: C de la nba:
SELECT nombre,peso WHEREposicion=G peso > ANY
from jugadores AND
(SELECT peso FROMjugadores where posicion=C);
I Joe Johnson I + ------------+ ----
--+
Secomprueba queen el casode Joe Johnson,su peso(235libras),esmayorque algún peso de algún pívot de la nba, dándoseasí el peculiar caso de un base más pesadoque algún pívot. 4.7.5.
Subconsultas
anidadas
Se puede usar una subconsultapara ltrar los resultadosde otra subconsulta. De esta manera se anidan Subconsultas.Por ejemplo. si se deseaobtener el nombre de la ciudad donde juega el jugador más alto de la nba, habría que pensar cómo hacerlo de forma estructurada: 157
Bases de
Datos
1. Obtener la altura del jugador más alto: X SELECT * FROM animales LEFT -> ON anima1es.propietario ->
la opción ALL, FULL OUT ER
OUTER JOIN propietarios -propietarios.dni
UNION
-> SELECT * FROM animales -> ON anima1es.propietario +
-+
I codigo +
-+
I nombre
-+ -----------
I tipo
-+ --------
-+ -----
I Cloncho I Yoda I Sprocket I Arco
RIGHT OUTER JOIN propietarios =propietarios.dni;
I propietario
NULL I
4.9. Consultas
-+
I dni
-+ -----------
I gato I gato I perro I perro
I I NULL ++
-+
I nombre
-+ ---------
I 51993482Y I 51993482Y I 372763172 I NULL I
I
-+ ------------------
I 51993482Y I 51993482Y I372763172 NULL I
NULL 2883477X
-+ -+
I José Pérez I I José Pérez I I Francisco Martinez I NULL I Matias Fernández
I +
I
reexivas
A veces, es necesario obtener información de relaciones reexivas, por ejemplo, un informe de empleados donde junto a su nombre y apellidos apareciera el nombre y apellidos de su jefe. Para ello, es necesario hacer una JOIN entre registros de la misma tabla:
mysq1> desc
Empleados;
+ --------------
I F1e1d +--------------
-+ ------------
I Type -+ ------------
-+ ----
I Null -+ ----
I CodigoEmp1eado I int(11)
I N0 I
I Nombre
I varchar(50)
| Apellidol I Ape11ido2
I varchar(50) I varchar(50)
I Extension | Email
I varchar(10) I varchar(100)
I N0 I I ND I
I Codigoüficina I CodigoJefe
I varchar(10) I int(11)
I N0 I I YES
I Puesto +--------------
I varchar(50) -+ ------------
+--+ -------
I Key
-+ -----
I Default
--+-----+ -------
I Extra -+ -----
I -+
NULL I
|
I N0 I
I NULL I
I
I N0 I I YES
I NULL I I NULL I
I |
l NULL I I NULL I
I |
II
I NULL I NULL I
I I #autore1ación
II
NULL I
I YES -+ ----
PRI I
-+
I
-+----+ -------
SELECT concat(emp.Nombre, ,emp.Ape11ido1) as concat(jefe.Nombre, ,jefe.Ape11ido1)
I -+
-+
Empleado, as jefe 169
Bases de
Datos
FROM Empleados emp INNER JOIN Empleados ON emp.CodigoEmp1eado=jeÍe.CodigoJefe; +
-+ -----------------------
I Empleado
-+
I Jefe
+ -----------------
jefe
I
-+ -----------------------
-+
I Marcos Magaña I I Ruben López I
Ruben López Alberto Soria
I I
I Alberto I Kevin
Kevin Fallmer Julian Bellinelli
I I
Soria I Fallmer I
l Kevin Fallmer I +-----------------
Mariko Kishi -+ -----------------------
I -+
Analizando la query anterior, primero se observa el uso de la tabla empleados dos veces, una con un alias emp que representa los empleados como subordinados y otra con alias jefe que representa los empleados como jefes. Ambas tablas (aunque en realidad son la misma) se unen en una JOIN a través de la relación CodigoEmpleado y CodigoJefe. Por otro lado, el primer campo que se selecciona esla concatenación del nombre y apellido del empleado (concat(emp.Nombre,' ,emp.Apellido1) al que a su vez le damos un alias (empleado) y el segundo campo que es la concatenación de los empleados jefes, al que le se le da el alias jefe. Se puede observar que en esta query no aparecen los empleados sin jefe, puesto que se ha utilizado un INNER JOIN. Para mostrarlos, habría. que usar un LEFT o RIGHT OUTER
JOIN.
4.10. Consultas
con tablas
derivadas
Las consultas con tablas derivadas, o inline views, son aquellas que utilizan sentencias SELECT en la cláusula FROM en lugar de nombres de tablas, por ejemplo: SELECT *
FROM
(SELECT CodigoEmpleado, Nombre FROMEmpleados WHERE CodigoOficina=TAL-ES) as tabla_derivada;
En este caso se ha de distinguir, por
un lado la tabla derivada, (SELECT
Co-
digoEmpleado, NombreFROM Empleados) que tiene un alias tabla_derivada, es decir, una especie de tabla temporal cuyo contenido es el resultado de ejecutar la consulta, su nombre es tabla_derivada y tiene dos columnas, una CodigoEmpleado y otra Nombre. Este tipo de consultas ayudará a obtener información relacionada de forma 170
mucho más
avanzada.
Capítulo 4. Realización de Consultas Por ejemplo, en la base de datos jardineria, si se desea sacarel importe del pedido de menor coste de todos los pedidos. hay que pensar primero como sacar el total de todos los pedidos y de ahí, el pedido con menor coste con la función de columna MIN:
#1: Para calcular el total de cada pedido, hay que codificar esta SELECT SUM(Cantidad*PrecioUnidad) as total,CodigoPedido
query
FROM Deta11ePedidos
GROUP BY CodigoPedido;
#2: Para #derivada
calcular el de la
#obtener
menor pedido, consulta anterior
el menor
SELECT MIN(total)
se puede hacer una y con la función
tabla MIN
de ellos: FROM (
SELECT SUM(Cantidad*PrecioUnidad)
as total,CodigoPedido
FROM Deta11ePedidos
GROUP BYCodigoPedido ) AS
TotalPedidos;
+ ----------
--+
I MIN(tota1)
l
+
--+
| + ----------
4 I --+
#Tota1Pedidos es
#por el
resultado de
la tabla
derivada formada
la consulta
entre paréntesis
Las tablas derivadas no tienen limitación, es decir, se pueden unir a otras tablas, ltrar, agrupar, etc.
171
Bases de
Datos
4.11. Prácticas
Resueltas
Práctica 4.1:
Consultas simplesen MS-Access
Con la BBDD Automóviles,
genera sentencias SQL para obtener:
1. El nombre de las marcas y modelos de los vehículos. 2. El nombre de los modelos cuyas emisiones estén entre 150 y 165. 3. El nombre de los modelos cuyas emisiones estén entre 150 y 165 o que su consumo esté entre 5y 6 ordenado por consumo descendentemente. 4. Un listado de todas las Marcas que hay (sin repeticiones). Para crear una consulta en modo SQL en Access, se pulsa en la pestaña. Crear, opción Diseño de Consulta, y a continuación, se pulsa en el botón SQL. Finalmente, se escribe la sentencia SELECT y, para ejecutarla, se pulsa en la admiración de la pestaña Diseño .
#1 SELECT Marca,Mode1o Automóviles; FROM #2 SELECT modelo Automóviles FROM WHERE Emisiones >=
150 AND
Emisiones =
150 AND
ORDER BY
FROM Automóviles
Emisiones =5
AND Consumo3000;
#4
SELECT CONCAT(0ficinas.LineaDireccion1,0ficinas.LineaDire Dficinas.Ciudad
FROM Oficinas,
Emp1eados,C1ientes
WHERE Oficinas.CodigoÜficina=Emp1eados.Codigo0ficina AND Empleados.CodigoEmp1eado=C1ientes.CodigoEmp1eadoRepVentas AND Clientes.Ciudad=Fuenlabrada;
174
Capítulo 4. Realización de Consultas
Práctica
4.5: Consulta con tablas derivadas
Sacar el cliente que hizo
el pedido de mayor cuantía:
Esta. consulta es mejor codicarla en un. amhivo de texto para no tener que escribirla múltiples veces si da errores. La estrategia para resolverlo es hacer pequeñas consultas (querys A,B y C) para luego unirlas y generar la denitiva:
#query A: Sacar la cuantía de los pedidos: (select CodigoPedido, Codigocliente, sum(Cantidad*PrecioUnidad)
from Pedidos
natural
as
join
total
DetallePedidos
group by CodigoPedido,CodigoC1iente) #query
B: Sacar
select
max(tota1)
(select
el pedido
Tota1Pedidos;
más caro:
from
CodigoPedido, Codigocliente,
sum(Cantidad*PrecioUnidad)
from Pedidos
group by
natural
as
join
total
Deta1lePedidos
CodigoPedido,CodigoC1iente)
#query
C: Sacar
el
código
de cliente
Tota1Pedidos; correspondiente
al pedido más caro (querydefinitiva.sq1)
querydefinitiva.sq1 Select
Tota1Pedidos.Codigocliente,NombreCliente
(select
CodigoPedido, Codigocliente,
sum(Cantidad*PrecioUnidad) from Pedidos natural join
group by inner
from
as total Detal1ePedidos
CodigoPedido,CodigoCliente) join
Clientes
Tota1Pedidos
on
Clientes.CodigoC1iente=Tota1Pedidos.CodigoC1iente where
tota1=
( select
(select
max(tota1)
from
CodigoPedido, CodigoC1iente,
sum(Cantidad*PrecioUnidad)
from Pedidos
natural
as
join
total
Deta11ePedidos
group by CodigoPedido,CodigoCliente)
TotalPedidos
);
175
Bases de
Datos
Prácticas Propuestas
4.12.
Práctica 4.6:
Consultas simplesen MS-Access
Con la BBDD Automóviles,
genera sentencias SELECT para obtener esta informa-
ción: 1. 2. Modelos de vehículos TDlf
3.
Modelos de la marca Audi y
de la marca "Seat ordenado por l\llarca y Modelo.
Alarcas de Vehículos que empiecen por T y terminen en a. .Vehículos que tengan foto. .El consumo de los vehículos está expresado en litros / IOOkm. Listar el consumo
de los vehículos Seat en MPG, l\Iillas por galón (10 MPG=23.49 1/100km). O
Práctica 4.7:
Consultas simplescon la BBDD jardinería
Codica en SQL (Oracle y MySQL) sentencias para obtener la siguiente información: 1.
Sacar la ciudad y el teléfono de las ocinas de Estados Unidos.
2.
Sacar el nombre, los apellidos y el email de los empleados a cargo de Alberto Soria.
Sacar el cargo, nombre, apellidos y email del jefe de la empresa. Sacar el nombre, apellidos y cargo de aquellos que no sean representantes de ventas.
Sacar el número de clientes que tiene la empresa. Sacar el nombre de los clientes españoles.
OWNQF-l Sacar cuántos clientes tiene cada país. Sacar cuántos
clientes tiene
la ciudad
de Madrid.
.Sacar cuántos clientes tienen las ciudades que empiezan por M.
4Hay quetener en cuenta queen Access,el comodín°7c esun *
10.
11. 12. 13. 14.
Bases de
Datos
3. Obtener los clientes cuya línea de crédito sea mayor que los pagos que haya realizado.
4. Sacar el producto que más unidades tiene en stock y el que menos unidades tiene en
stock.
Práctica 4.9: Consultas multitablacon Ia BBDD jardinería Codica en SQL las siguientes consultas: 1. Sacar el nombre de los clientes y el nombre de sus representantes junto con la ciudad de 1a ocina a la que pertenece el representante. 2. Sacar la misma información que en la pregunta anterior pero solo los clientes que no hayan echo pagos. 3. Obtener un listado con el nombre de los empleados junto con el nombre de sus jefes. 4. Obtener el nombre de los clientes a los que no se les ha entregado a tiempo un
pedido (FechaEntrega>FechaEsperada).
Práctica 4.10: Codica en
Consultas variadascon la BBDD jardinería
SQL las siguientes consultas:
1. Sacar un listado de clientes indicando el nombre del cliente y cuántos pedidos ha realizado.
2. Sacar un listado con los nombres de los clientes y el total pagado por cada uno de ellos.
3. Sacar el nombre de los clientes que hayan hecho pedidos en 2008. 4. Listar el nombre del cliente y el nombre y apellido de sus representantes de aquellos clientes que no hayan realizado pagos. 178
10. Capítulo 4. Realización de Consultas
11.
Sacar un listado de clientes donde aparezca el nombre de su comercial y la ciudad donde
está su ocina.
. Sacar el nombre, apellidos, ocina tantes de
y cargo de aquellos que no sean represen-
ventas.
12.
. Sacar cuántos empleados tiene cada ocina, mostrando donde está
13.
el nombre de la ciudad
la ocina.
. Sacar un listado con el nombre de los empleados,y el nombre de sus respectivos jefes. . Sacar el nombre, apellido, ocina sente a ningún cliente.
14.
(ciudad) y cargo del empleado que no repre-
Sacar la media de unidades en stock de los productos agrupados por gama. Sacar los clientes que residan en la misma ciudad donde hay una ocina, indi-
15.
cando dónde
está la
ocina.
Sacar los clientes que residan en ciudades donde no hay ocinas ordenado por la ciudad
donde residen.
16.
Sacar el número de clientes que tiene asignado ca.da representantede ventas. Sacar cuál fue el cliente que hizo el pago con mayor cuantía y el que hizo el pago con menor cuantía.
17.
Sacar un listado con el precio total de cada pedido. Sacar los clientes que hayan hecho pedidos en el 2008 por una cuantía superior
a 2000
euros.
18.
Sacar cuántos pedidos tiene cada cliente en cada estado. Sacar los clientes que han pedido más de 200 unidades de cualquier producto.
Bases de
Datos
2. Equipos que comiencen por Hy
terminen en S.
3. Puntos por partido de Pau Gasol en toda su carrera. 4. Equipos que hay en la conferencia oeste (w'est).
5. Jugadores de Arizona que pesenmás de 100 kilos y midan más de 1.82m (6 pies). Puntos por partido de los jugadores de los cavaliers.
©9051? Jugadores cuya tercera letra de su nombre sea la v.
Número de jugadores que tiene cada equipo de la conferencia oeste West.
.Número de jugadores Argentinos en la NBA.
10. Máxima media de puntos de Lebron James en su carrera.
11. Asistenciaspor partido de Jose Calderon en la temporada O7/O8. 12. Puntos por partido de Lebron James en las temporadasdel 03/04 al 05/06. 13. Número de jugadores que tiene cada equipo de la conferencia este East. 14. Tapones por partido de los jugadores de los Blazers. 15. Media de rebotes de los jugadores de la conferencia Este East. 16. Rebotes por partido de los jugadores de los equipos de Los Angeles. 17. Número de jugadores que tiene cada equipo de la división N orthWest. 18. Número de jugadores de España y Francia en la NBA. 19. Número de pivots C que tiene cada equipo. 20. ¿Cuánto mide el pívot más alto de la nba? 21. ¿Cuánto pesa (en libras y en kilos) el pívot más alto de la NBA? 22. Número de jugadores que empiezan por "Y". 23. Jugadores que no metieron ningún punto en alguna temporada. 24. Número total de jugadores de cada división. 25. Peso medio en kilos y en libras de los jugadores de los Raptors. 180
Capítulo 4. Realización de Consultas 26.
Mostrar un listado de jugadores con el formato Nombre(Equipo) en una sola columna.
27.
Puntuación más baja de un partido de la NBA.
28.
Primeros 10 jugadores por orden alfabético.
29.
Temporada con más puntos por partido de Kobe Bryant.
30.
Número de bases "G que tiene cada equipo de la conferencia este East.
31.
Número de equipos que tiene cada conferencia.
32.
Nombre de
33.
Máximo reboteador
34.
Nláximo anotador de la toda base de datos en una temporada.
35.
Sacar cuántas letras tiene el nombre de cada jugador de los grizzlies función LENGTH).
36.
¿Cuántas letras tiene el equipo con nombre más largo de la NBA (Ciudad y Nombre)?
Práctica 4.12:
las divisiones
de la
Conferencia Este.
de los Suns.
Consultas con
(Usar
tablas derivadas
Realizar las siguientes consultas con tablas derivadas con las BBDD NBA y jardineria:
Sacar el importe medio de los pedidos de la BBDD jardineria. Sacar un listado con el número de partidos ganados por los equipos de la NBA. Sacar la media de partidos ganados por los equipos del oeste. ¿Cuál es el pedido más caro del empleado que más clientes tiene?
181
Bases de
4.13.
Datos
Resumen
Los conceptos clave de este capítulo son los siguientes: La sentencia SELECT devuelve un conjunto de resultados en forma de tabla
compuesto porlas (o registros) y columnas (ocampos). La cláusula FROM de la sentencia SELECT especica las tablas de las que se extrae la información, y permite. a través de operaciones como el producto cartesiano y las JOIN, construir conjuntos de datos de información relacionada. Cuando se especica más de una tabla en la cláusula FROM se denomina consulta multitabla. Pueden ser escritas en dos tipos de sintaxis, SQLI y SQL2. SQLl solo permite composiciones internas (INNER JOIN), mientras que SQL2 permite, además, composiciones externas (OUTER JOIN). Las NATURAL JOIN, son un tipo de INNER JOIN que hace coincidir la información de dos campos con el mismo nombre. Los registros de una SELECT se pueden F ILTRAR mediante el uso de la cláusula WHERE. Los ltros se pueden construir mediante expresiones, el
operador de pertenencia a conjuntos (IN), operador de rango (BETWEEN), test de valor nulo (IS, IS NOT), test de patrón (LIKE), y limitación de registros
(LIMIT y numrows). Para ordenar un conjunto de resultados se utiliza la palabra clave ORDER BY. Se puede ordenar ascendentemente (ASC) o descendentemente (DESC). Las consultas de resumen se usanpara calcular información en base aconjuntos o grupos de datos. Los grupos se construyen mediante la cláusula GROUP BY. Los ltros
sobre grupos se generan mediante la cláusula HAVING.
Las subconsultas son SELECT usadas para ltrar información
mediante test
de comparación, Test de Existencia (EXISTS), Test cuanticados (ANY y ALL). Pueden ser anidadas. Las consultas reexivas son las que forman en su cláusula FROM la misma tabla dos
o más
veces.
Las tablas derivadas son tablas virtuales generadas a través de consultas en tiempo de ejecución. Tienen un alias que las identica. 182
Capítulo 4. Realización de Consultas
4.14. Test 1. ¿Para
de repaso qué sirve
DISTINCT en
una
SELECT?
6. Filtrar
a) Para mostrar las las idénticas
por el
número de
resultados
a) No se puede de ninguna manera en Oracle
b) Para no mostrar las idénticas
b) Se puede mediante la cláusula LIMIT en c) Para mostrar, aparte, las las distintas d) Ninguna
de las anteriores
Oracle
c) Se puede mediantela cláusulanumrows en Oracle
2. Un ltro WHERE expresiones con
puede incorporar
d) No se puede hacer de ninguna manera en MySQL
a) Operadores numéricos b) Operadores relacionales
7 .En
SQL se puede ordenar
c) Llamadas a funciones
a)El
d) Todas las anteriores
b) El nombre de la columna
número de columna (1,2,3. .
c Una 3. El operador
IN no
se puede usar para
d
por
expresión
)
a) Escribir en un ltro una lista de valores b) Escribir en un ltro una subconsulta
Todas ) anteriores las
c) Una ordenación d) Encadenar varios condicionesde tipo AND 4. El
test de
8. Si junto a una función selecciona un campo
valor nulo
a) Sirve para comprobarsi un conjunto deresultados es
vacío
b) Sirve para comprobarsi el valor deun campo es desconocido c) Sirve para comprobar si el valor de un campo es o no es desconocido
d) Todas las anterioresson correctas 5. El patrón %AX_
_seleccionaría
se
a) Se debe agrupar por el campo b )No
se debe agrupar por el campo
c) No se puede seleccionar el campo
d) No se puede seleccionar la función de columna
9. Una
el va-
de columna,
subconsulta
a) Es un tipo especial de tabla derivada
lor
b) Se puede anidar con otras subconsultas
a) XXXAX11
c) Sus resultados se pueden ordenar bajo de-
b) AX1111 c) XXXXIF
terminadas circunstancias
d) Todas las opciones anteriores son posibles
d) XXXAX1
"q'6v'e'p'¿'a'9'e'9ow-o-svaqI ¡
183
Bases de
Datos
4.15.
.Realiza una lista con los operado8. Comprueba aprendizaje res que puedes escribir tu en un ltro, clasicándolos según su tipo. .La
tabla alumno
tiene un campo
llamado Nacionalidad.
consulta para sacar los alumnos de España, Italia yDinamarca de dos formas, una con el operador IN, y otra con operadores AND. .Escribe
la sintaxis
cia SELECT
Escribe un ejemplo de la ejecución de una subconsulta con el operador EXISTS y otra con el operador
Escribe una
de la
con todas
10.
NOT EXISTS.
.¿Para qué sirve el operador UNION? Pon un ejemplo de su uso.
senten-
sus cláusu-
Dene para qué sirven los siguientes operadores de ltros, y pon un ejemplo de cada uno de ellos:
las correspondientes (ORDER BY, HAVING, GROUP BY, etc.) y describe para qué sirve cada una.
uBETWEEN
. Haz un esquema clasicando los tipos de JOIN que existen. Incorpora un ejemplo de cada una de ellas.
uANY nALL 11.
. ¿En qué se diferencia LEFT TER JOIN
de RIGHT
OU-
OUTER
JOIN? Pon un ejemplo de una consulta que afecte a dos tablas, indicando la
un ejemplo
uLIKE
¿Qué diferencia hay entre HAVING x>y y WHERE x>y?
13.
¿Para qué sirve un CROSS JOIN?
JOIN? Pon
de una consulta que
afecte a dos tablas, indicando la
¿Qué diferencia hay entre NATU-
di-
RAL JOIN
.¿Qué es una tabla derivada? ¿Dealias una
¿Por qué?
JOIN? Pon
mismos resultados.
tabla derivada? 14.
¿Qué esuna consulta reexiva? Pon un ejemplo de una sentencia SQL con una
15. 184
e INNER
un ejemplo usando ambas de dos consultas que hagan produzcan los
ferencia.
be llevar
NOT
12.
¿En qué se diferencia FULL OUde INNER
nIS uIS
diferencia.
TER JOIN
...AND
consulta reflexiva.
¿Se podría utilizar una tabla derivada dentro
de una
subconsulta?
CAPÍTULO
Tratamiento de
5
los datos Objetivos
C°ntenid°5 e
Identicar
H'
t erramlen as gra caspTOpOÏ nldo
herramientasseny
tencias para modicar el ,
cionadas por el SGBD
Insertar, borrar
Sentencia INSERT
conte-
de labase de datos
y actualizar
datos en las tablas
INSERT y SELECT
Incluir en
una tabla
informa-
sentencia UPDATE
ción de una consulta
Sentencia DELETE
Adoptar medidas para mantener la integridad y consistencia
UPDATE y DELETE con sub-
de la
información
consultas Reconocer
el funcionamiento
Borrado y modicación de gistros con relaciones
re-
Transacciones Acceso concurrente
a los
datos
Vistas. usuarios y privilegios e"
de transacciones y anular parcial o totalmente cambios producidos por una transacción Identicar efectos de las políti. cas de bloqueo de registros . . . Crear vistas y usuarios y asignar privilegios
En este capítulo se detalla la sintaxis de las sentencias INSERT, UPDATE y DELETE. Se expone el tratamiento de las transacciones y los problemas del acceso concurrente a los datos. Además, se introducen las principales herramientas grácas de edición de datos y se explica cómo crear Vistas, usuarios y otorgar y
revocar permisos.
185
Bases de
Datos
5.1. Herramientas
grácas para
la edición
de los
datos Existen multitud de herramientas grácas para la edición de datos, algunas, incorporadas como parte del software del gestor de base de datos, por ejemplo, el entorno gráco de Access;otras herramientas se distribuyen como paquetes a añadir a.l SGBD, como phplyAdmin de MySQL: yel software de terceros, programas por los que hay que pagar una licencia aparte como TOAD o Aqua Data Studio. Otros gestores como Oracle, no incorporan expresamente una herramienta de edición de datos como tal (se pueden consultar, pero no se puede editar datos desde Enterprise
Manager), perose aprovechande herramientasde tercerospara esta labor.
5.1.1. Edición
con phpMyAdmin
Una de las muchas utilidades de phpMyAdmin es la inserción de datos a través de formularios web, donde, de forma muy sencilla, se escriben los valores para cada campo de la tabla deseada. Tan solo hay que seleccionar la pestaña Insertar y seleccionar la tabla donde se va a insertar los registros. Se rellenan los valores y se pulsa continuar. Ép;jÉ=}._;JJL,"-.¿ u! Sorvidor: localhost b¡y late dodatos: startrok D¡suTabla: Aduna _¡Examinar Ïvaciav
inruttura ÍJSOL ¿Eliminar y
Base de datos Campo stamek (9) vCodigo
nmng Nombre Ikm5
Em Nacional-dad
, Buscar ENWWÜJ
Tipo Función mll) v
varcharíso) Fecha date
vmmñzm
Enar
Im nar
o racimos
nulo Valor 1 L
y597097,57 pimp!Vi o J1531_o3:v26' _a
vEELÏLÏÏW
i: L
' ""4 ;T
"
IHnculas
=wm
mu COHUHUBI
| Mwmekhculas
E
Ignorar Campo Tipo Funciónnulo Valor Codugo mui)
y
N°m°'° V3'< 2 Williamshacner 1931-03-22 eeuu t Marcar todos/as IDesmarcar todos Para loselementos que estan marcados: fx I Mostrar: 3o mas empezando ode en modohorizontal vy repeorios encabezados cada 10o celdas (¡p-racionessobra los nsuiudos dola zonsulu
__ Vista deampresuon Prevusualuzacron ¡mpnmnrtdocumento .' para Exportar QCREATE VIEW completo) |
Figura 5.3: Modicación y
5.1.2. Access
eliminación de datos a través de phpMyAdmin.
como entorno
gráco para
otros gestores
Si se conoce el entorno Access es muy sencillo conectarlo con otros gestores, y de esta manera, aprovecharse del conocimiento de la interfaz de Microsoft para administrar otros gestores de bases de datos. Esto es posible gracias a la utilización de conectores ODBC. ODBC son las siglas de Open Database Connectivity. Es una 187
Bases de
Datos
herramienta que, de forma estándar, permite conectar aplicaciones a cualquier gestor de bases de datos. Muchas aplicaciones omáticas, como Excel, Word y el propio Access permite el accesoremoto a datos de un SGBD. Para esto, tan solo es necesario instalar el driver ODBC para ese SGBD. De esta manera, se puede crear una DSN o Data Source Name, es decir, una referencia a cierta base de datos. MySQL Comedor/ODBC Dm Senna: Conguration
Cannon Puameters Data Source Name:
:192. 168. 224. 128
Figura 5.4: Creación de un origen de datos ODBC para MySQL. Esta referencia se crea en Windows a través del panel de Control, Herramientas Administrativas, y la opción Onyenes de Datos ODBC. Cada origen de datos requiere, además de un nombre para el propio origen, el nombre del usuario, la contraseña,
el nombre de la base dedatos y los datos de conexiónal servidor (Dirección IP y puerto TCP / UDP por donde se conecta). A través de un origen de datos ODBC, se pueden enlazar a Access las tablas de un SGDB para el cual se ha congurado la DSN. Para ello, a través de la pestaña de Access Datos Externos, opción más, se elige la opción bases de datos de ODBC y a continuación se siguen los pasos del asistente. Después, se elige la opción de vincular al origen de datos creando una tabla vinculada, y nalmente, se selecciona la DSN creada anteriormente desde la pestaña Origen de datos de equipo.
Actividad 5.1: Descargadesde lapágina webde mysqlwwmmysql.org, apartado Downloads, connectors, el conector ODBC para MySQL. Instálalo en tu ordenador y Conéctate a la base de datos jardinería de la máquina virtual de prácticas disponible en wwwgarcetaes. Si lo preeres, Conéctate a algún otro servidor que tengas disponible. (Asegúrate, en ese caso,de tener desactivada la opción 188
Capítulo 5.
Tratamiento de los datos
bind-address delservidor mysqlen elchero / etc/mysql/ my.cnfpara poderconectar desde fuerade la propia máquina virtual). Creu 01:3:enema: HQVVÍÜHCÜÏ. ae nuue ¡nox
,7;
7
n, n:
a
**
me o
A.» umvolml v ' su onoenoenaooaowwo Mo-óeuovdenno m: ssEne! unade v. wE-conwones Ene! Snavebmm Lgf}: _quruncas 7 gNowbvvedongeneowm Too Dowpaón Irporïay ¡ Wdegmkm ¿aseoecaosnnmenï Sue-n "3V lrlnernv nncuinr n un:ntuu de ¡nos th ,99m3 g, n,«m, no! ejemplonu una neemosSQL de Se t :1 panama-no HTML lmccrurnnzum a una euumenw HTML
Selecooneorigen el el y destno de losdatos.
ïamemrvnmdmdeduenúvucerwbsdomsenhbasedeomxui ¡mpwhreiuboldehumninevlbhhdehbnc v sselememesoeeudamnsrmnmmbaeris-daopmewec -encsrghccensuvawiwvuwodrvnbrndd nophonortndmwswhosveuzuosmmwxmaeaw datosucllsühmserekyïrvenbbseae densidad. 'EéEEEEï¡h6En29-bïíí Accesscreráuwuveuuermtwüimvi-nxabsamue cnwbnurnhndosenbsnnmsenkznnsnreewü mdommvvusvu. l Amt!
1 (mehr
Figura 5.5: Vínculo de INIySQL a Access.
5.2. La
sentencia INSERT
La sentencia INSERT de SQL permite insertar una la en añadir un registro de información a una tabla. El formato de uso es muy sencillo: INSERT [INTO]
nombre_tab1a [(nombre_columna,
VALUES ({expr
I DEFAULT},...)
una tabla, es decir,
. ..)]
nombre_tabla es el nombre de la tabla donde se quiere insertar la la. Después del nombre de la tabla, de forma optativa, se pueden indicar las columnas donde se va a insertar la información. Si se especican las columnas, la lista de valores
(VALUES) a insertar se asociará correlativamentecon los valores a las columnas indicadas. Si no se especican las columnas, la lista de valores se escribirá conforme al orden
de las
columnas en
la denición
de la
tabla. A
continuación se
muestran
unos cuantos ejemplos:
desc mascotas; + --------+ -----------
I Field
I Type
--+ ----
I Null
--+-----+ -------
I Key
I Default
--+
I 189
Bases de
Datos
varchar(50) varchar(50) varchar(9) #INSERT especificando
la lista
INSERT INTO mascotas (Codigo,
de columnas
Nombre, Raza)
VALUES (1,Pequitas,Gato Común Europeo) Este tipo de INSERT, hace corresponder a la columna Codigo el valor 1, a la columna Nombre el valor Pequitas y a la columna raza el valor Gato Común Europeo. La columna cliente, queda con un valor NULL, puesto que no se ha indicado un valor.
#INSERT sin especificar la INSERT INTO
lista de
columnas.
mascotas VALUES
(2, Ca1cetines,
Gato Común Europeo, 59932387L)
En este caso, al no especicarse la lista de columnas, hay que indicar todos los valores para todas las columnas en el orden en que están denidas las columnas en la tabla.
#INSERT con columnas con INSERT INTO
valores por
vehiculos VALUES
defecto
(1215 BCD,To1edo
Aquí, se ha usado el valor DEFAULT para tercera. columna
de la tabla vehículos,
TDI, DEFAULT);
asignar el valor por defecto a la
es decir, la columna
marca tiene
denida la
asignación por defecto del valor Seat. Si se construye una sentencia INSERT con más campos en la lista de valores que el número de columnas especicadas (o número de columnas de la tabla) el SGBD informará del
error.
#INSERT Erronea
insert into
vehiculos (Matricula,Mode1o,Marca) VALUES (4123 BFH,Ibiza);
Capítulo 5.
5.3. La
sentencia INSERT
Tratamiento de los datos
extendida
La sintaxis extendida de INSERT para gestores tipo MySQL es la siguiente: INSERT [INTO]
nombre_tabla [(nombre_co1umna,...)]
VALUES ({expr
I DEFAULT},...),(...),...
Los puntos suspensivos del nal indican que se puede repetir varias veces la lista de valores. Así, MySQL admítiría algo del estilo:
insert into
vehiculos (Matricula,Mode1o,Marca) VALUES (4123 BFH,Ibiza,Seat), (1314 FHD,To1edo,Seat), (3923 GJS,León,Seat);
5.4. INSERT Una variante
de la
ySELECT sentencia INSERT
consiste en
una utilizar
la sentencia
SE-
LECT para obtener un conjunto de datos y, posteriormente, insertarlos en la tabla.
INSERT
[INTO] nombre_tabla SELECT ...
[(nombre_co1umna,...)]
FROM ...
Se puede ejecutar la siguiente consulta: #Inserta en una tabla Backup todos INSERT INTO Backupvehiculos SELECT *
los vehículos
FROM vehiculos;
La sentencia SELECT debe devolver tantas columnas como columnas tenga la tabla donde se introduce la información. En el ejemplo anterior, la tabla BackupVehiculos tiene
una estructura
idéntica a
la tabla
vehículos.
Se puede ver, además, que la sentencia SELECT puede ser tan compleja como se desee,usando ltros, agrupaciones, ordenaciones, etc. 191
Bases de
Datos
5.5. La
sentencia UPDATE
La sentencia UPDATE de SQL permite modicar el contenido de cualquier columna y de cualquier la de una tabla. Su sintaxis es la siguiente: UPDATE nombre_tab1a
SET nombre_col1=expr1
[, nombre_co12=expr2
]
[WHERE filtro]
La actualización se realiza dando a las columnas nombre_col1, nombre_col2... los valores exprl, expr2,... Se actualizan todas las las seleccionadas por el ltro indicado mediante la cláusula WHERE. Esta cláusula WHERE, es idéntica a la que se ha utilizado para el ltrado de registros en la sentencia SELECT. Por ejemplo, si se desea actualizar el equipo de Pau Gasol porque ha chado por otro equipo, por ejemplo, los Knicks, habría que ejecutar la siguiente sentencia:
UPDATE jugadores WHERE Nombre=Pau
Query DK,
1row
Rows matched:
SET Nombre_equipo=Knicks Gasol;
affected (0.02 1Changed:
sec)
1Warnings:
O
El gestor informa de que el ltro seleccionó una la, y que, por tanto, cambió 1 la, en este caso, la columna Nombre_equipo de esa la seleccionada. Es posible cambiar más de una Columna a la vez:
UPDATE jugadores WHERE Nombre=Pau
SET Nombre_equipo=Knicks,
Query OK, 1 row affected (0.02 Rows matched:
Peso=21O
Gasol;
1Changed:
sec)
1 Warnings:
0
Si se omite el ltro, el resultado es la Inodicación de todos los registros de la tabla, por ejemplo, para cambiar el peso de los jugadores de la NBA de libras a kilos:
UPDATE jugadores
192
SET Peso=Peso*0.4535;
Capítulo 5. Tratamiento de los datos
5.6. La
sentencia DELETE
En SQL se utiliza la sentencia DELETE para
eliminar las
de una tabla. Su
sintaxis es: DELETE FROM
nombre_tab1a
[WHERE filtro]
El comando DELETE borra los registros seleccionados por el ltro es idéntico
al de la sentencia
WHERE, que
SELECT.
Si se desea borrar al jugador Jorge Garbajosa escribir la siguiente sentencia:
de la base de datos, habría que
DELETE FROMjugadores WHERE Nombre=Jorge Garbajosa; Query OK, 1row affected (0.01 sec)
Si se omite el ltro, el
resultado es el borrado de todos los registros de la tabla:
DELETE FROM jugadores;
Query OK, 432 rows
5.7. La
affected (2.42
sec)
sentencias UPDATE
y DELETE
con sub-
consultas Es posible actualizar o borrar registros de una tabla ltrando a través de una subconsulta. La única limitación es que hay gestores que no permiten realizar cambios en la tabla que se está leyendo a través de la subconsulta. Por ejemplo. si se desea eliminar los empleados Representante Ventas tengan clientes se podría codicar:
que no
DELETE FROM Empleados WHERE CodigoEmp1eado Not in
(SELECT CodigoEmp1eadoRepVentas FROM Clientes)
AND Puesto=Representante
Ventas;
193
Bases de
Datos
No sería posible. sin embargo, escribir una sentencia de este tipo para borrar los clientes con LimiteCreditozü, puesto que se leen datos de la misma tabla que se borran:
DELETE FROM
Clientes
WHERE CodigoC1iente
in
(SELECT Codigocliente FROM Clientes
WHERE LimiteCredito=0);
ERROR 1093 (HY000): You in FROM
cant specify
target table
Clientes for
update
clause
5.8. Borrado
y modicación
de registros
con re-
laciones Hay que tener en cuenta que no siempre se pueden borrar o modicar datos: Considérese por ejemplo, que un cliente llama a una. empresapidiendo darse de baja como cliente, pero el cliente tiene algunos pagos pendientes. Si el operador de la BBDD intenta eliminar el registro (DELETE), el SGBD debería informar de que no es posible eliminar ese registro puesto que hay registros relacionados.
O por ejemplo, sedesea cambiar(UPDATE) el nombre deun equipo de la NBA (que es su clave primaria), ¿qué sucede con los jugadores? También habrá que cambiar el nombre del equipo de los jugadores, puesto que el campo Nombre_Equipo es una clave
foránea.
En este punto, hay que recordar las cláusulas REFERENCES de la sentencia CREATE TABLE para crear las relaciones de clave foránea-clave primaria de alguna columna de
una tabla:
definiciómreferencia: REFERENCES nombre_tab1a[(nombre_columna, ...)] [ON DELETEopción_referencia] [DN UPDATEopción_referencia]
opción_referencia: CASCADE I SET NULL ND I ACTION Las cláusulas ON DELETEy ON UPDATE personalizan el comportamiento de estos dos casos. Si por ejemplo, se intenta eliminar un registro con otros registros 194
Capítulo 5. Trataznientode los datos relacionados, y se ha seleccionadola opción ON DELETE NO ACTION UPDATE NO ACTION el comportamientosería el siguiente: #dos tablas relacionadas #han de ser innodb para
y ON
en mysql soportar FOREING KEYS
CREATE TABLE clientes (
dni varchar(15) PRIMARY KEY, nombre varchar(50), direccion
varchar(50)
) engine=innodb; CREATETABLEpagos_pendientes( dni
varchar(15),
importe
double,
FOREIGN
KEY(dni)
REFERENCES clientes(dni)
on delete
on update
NO ACTION
NO ACTION
) engine=innodb; #un cliente y INSERT
dos pagos pendientes
INTO
clientes
VALUES (5555672L,Pepe Cifuentes,C/Los almendros,23); INSERT INTO pagos_pendientes VALUES (5555672L,500); INSERT INTO pagos_pendientes VALUES (5555672L,234.5); #Se intenta
borrar
el
DELETE FROM clientes
cliente
y no es posible
WHERE dni=5555672L;
ERROR1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (gestion/pagos_pendientes, CONSTRAINTpagos_pendientes_ibfk_1 FÜREIGN
KEY (dni)
#Se intenta
modificar
UPDATE clientes
set
REFERENCES
'clienteS
el
cliente
dni
del
dni=55555555L
('dni))
y no lo permite
WHERE dni=5555672L;
ERROR1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (gestion/pagos_pendientes, CONSTRAINTpagos_pendientes_ibfk_1 FOREIGN
#de igual
KEY (dni)
modo si
REFERENCES
se intenta
clientes
borrar
la
(dni))
tabla
clientes,
#tampoco podemos DROP TABLE clientes;
ERROR1217 (23000): a parent
row:
Cannot delete a foreign
or update
key constraint
fails
Sin embargo,si la creaciónde la relaciónestuviesepersonalizadacon las opciones ON UPDATE CASCADE y ON DELETE CASCADE, el comportamientosería: 195
Bases de
Datos
#dos tablas
relacionadas en
create table
mysql
clientes (
dni varchar(15)
primary key,
nombre varchar(50), direccion varchar(50)
) engine=innodb; create table pagos_pendientes( dni varchar(15), importe double,
foreign key
(dni) references on delete
c1ientes(dni)
CASCADE on update CASCADE
) engine=innodb; #un cliente INSERT
y dos
pagos pendientes
INTO clientes
values (5555672L,Pepe Cifuentes,C/Los a1mendros,23); INSERT INTO pagos_pendientes VALUES (5555672L,500); INSERT INTO pagos_pendientes VALUES (5555672L,234.5); #se borra
el cliente...
DELETE FROM
clientes WHERE
Query DK,
dni=5555672L;
1 row affected (0.00
sec)
#además, se verifica que ha borrado SELECT * FROM pagos_pendientes;
Empty set #si en
lugar de
borrar el
cliente, se
set dni=55555555L
Query OK, 1 row affected (0.02
pendientes.
+---------
--+ -------
+ ---------
--+ -------
hubiera cambiado
el dni:
WHERE dni=5555672L;
sec)
#ha cambiado el dni de los pagos en SELECT * FROM pagos_pendientes;
cascada.
--+
I importe
I 55555555L + ---------
sus pagos
(0.00 sec)
UPDATE clientes
I 55555555L
en cascada
I --+
I I 234.5 --+ -------
I --+
Recuerda. En Oracle. solo existela cláusulaON DELETE. Para
implemen-
tar ON UPDATE. se debe generarun TRIGGER (Véase Capítulo 6)
196
Capítulo 5.
Actividad
Tratamiento de los datos
5.2: Crea las tablasde mascotas y clientescon la opción ONUP-
DATE y ON DELETE a SET NULL y comprueba el resultado de ejecutar las inserciones, actualizaciones y borrados de los ejemplos anteriores.
5.9. Transacciones Un SGBD actualiza múltiples datos a través de una transacción. Una transacción es un conjunto de sentencias SQL que se tratan como una sola instrucción (atómica). Una transacción puede ser conrmada (commit). si todas las operaciones individua-
les seejecutaron correctamente,o, abortada (rollback) a la mitad de su ejecución si hubo algún problema (por ejemplo, el producto pedido no está en stock, por tanto no se puede generar el envío). Trabajar con transacciones puede ser esencial para mantener la integridad de los datos. Por ejemplo, se puede dar el caso de que se descuenta el stock de un producto antes de proceder a su envío, pero cuando se va a generar la cabecera del pedido, la aplicación cliente sufre un corte en las comunicaciones y no da tiempo a generarlo. Esto supone una pérdida de stock. La transacción garantiza la atomicidad de la operación: O se hacen todas las operaciones, o no se hace ninguna. Generalmente, cuando se conecta con un cliente a un SGBD, por defecto está activado el modo AU TOCOMMI T =ON, es decir, cada comando SQL que se ejecute, será considerado como una transacción independiente. Para activar las transacciones de múltiples sentencias hay que establecer el modo A U TOCOMMI T=OF F .A partir de esemomento, todos los comandos SQL enviados al SGBD tendrán que terminarse con una orden COMMIT o una orden ROLLBACK. De este modo, se asegura la integridad de los datos a un nivel más alto. Muchos SGBD requieren de una orden START TRANS/l CT I ON o START WORK para comenzar una transacción y otros lo hacen de forma implícita al establecer el modo autocommit=off. #MySQL, 3
formas para
SET AUTDCOMMIT=O; START TRANSACTIDN;
comenzar una
transacción:
#6 #6
BEGIN WORK; --Oracle: SET AUTOCOMIT
OFF
Para terminar una transacción, tanto en MySQL como en ORACLE, hay que aceptar, o rechazar los cambios mediante: 197
Bases de
Datos
#La palabra
clave WORK es opcional
COMMIT WORK; #Acepta los RÜLLBACK WORK;
cambios.
#Cancela los
cambios
Cualquier conjunto de sentencias SQL se considera cancelado si termina abruptamente la sesión de un usuario sin hacer COl\Il\IIT. Un ejemplo de transacción en MySQL sería la siguiente: SET AUTÜCDMMIT #se actualiza
0; el stock
UPDATE Productos SET Stock=Stock-2 #se inserta
la cabecera
INSERT INTO
Pedidos VALUES
WHERE CodigoProducto=AAAF102;
del pedido
(25,now(),Francisco Garcia,Pendiente #se inserta
el detalle
INSERT INTO
Deta11ePedidos
de Entrega);
del pedido
(CodigoPedido,CodigoProducto,Unidades) VALUES (25,AAAF102,2); #aceptar transacción COMMIT WORK;
5.10. Acceso
concurrente a
los datos
Cuando se utilizan transacciones, pueden suceder problemas de concurrencia en el acceso a los datos, es decir, problemas ocasionados por el acceso al mismo dato de dos transacciones distintas. Estos problemas están descritos por SQL estándar y son los siguientes:
Dirty Read
(Lectura Sucia).
Una transacciónlee datosescritos poruna transac-
ción que no ha hecho COMMIT.
Nonrepeateable Read
(Lectura No
Repetible). Una transacción vuelvealeer
datos que leyó previamente y encuentra que han sido modicados
por otra
transacción.
Phantom Read existían cuando
(Lectura Fantasma). se inició
Una transacción lee unos datos que no
la transacción.
Cuando se trabaja con transacciones, el SGBD puede bloquear conjuntos de datos para evitar o permitir que sucedan estos problemas. Según el nivel de concurrencia 198
Capítulo 5.
Tratamiento de los datos
que se desee, esposible solicitar al SGBD cuatro niveles de aislamiento. Un nivel de aislamiento dene cómo los cambios hechos por una transacción son visibles a otras transacciones:
Read Uncommited
(Lectura no acometida). Permite que sucedanlos trespro-
blemas. Las sentencias SELECT son efectuadas sin realizar bloqueos, por tanto, todos los cambios hechos por una transacción pueden verlos las otras transacciones.
Read Commited
(Lectura acometida).
Los datos leídos por una transacción
pueden ser modicados por otras transacciones. Se pueden dar los problemas de Phantom Read y Non Repeteable Read.
Repeateable Read (Lectura Repetible).
Tan solo se permite el problema del
Phantom Read. Consiste en que ningún registro leído con un SELECT se puede cambiar en Serializable. Las
otra transacción. transacciones ocurren
de forma
totalmente aislada
a otras
transac-
ciones. Sebloquean las transacciones de tal manera que ocurren unas detrás de otras, sin capacidad de concurrencia. El SGBD las ejecuta concurrentemente si puede asegurar que no hay conflicto con el acceso a los datos. En MySQL, las tablas innodb tienen el nivel de aislamiento por defecto establecido en REPETEABLE READ, y se puede alterar cambiándolo en el chero de conguración mycnf o ejecutando: SET TRANSACTION
LEVEL {READ
ISÜLATION
UNCÜMMITTED I
READ COMMITTED I REPEATABLE
READ I
SERIALIZABLE}
En Oracle, el nivel por defecto es READ COMMI TED y, además de este, solo permite SERIALIZABLE. Se puede cambiar ejecutando el comando: SET TRANSACTIDN ISÜLATIDN LEVEL {READ CÜMMITTEDISERIALIZABLE};
¿Sabías que . .. 7Algunas transacciones pueden quedar interbloqueadas dependiendo del nivel de aislamiento seleccionado. Esta situación de interbloqueo, odeadlock entre dos transacciones. consiste en que ninguna de ellas puede seguir ejecutándose porque la primera intenta acceder aun bloque de datos que tiene bloqueada la segunda, y la segunda, intenta acceder a un bloque de datos que tiene bloqueada la primera. En esta situación de interbloqueo, el SGBD elimina a una de las dos transacciones. siendo la víctima del interbloqueo la que hace rollback de sus operaciones.
199
Bases de
Datos
5.10.1. Ejemplo
de problemas
en el acceso concurrente
A continuación se muestran, mediante una serie de consultas en MySQL cómo reproducir los problemas típicos de la concurrencia en bases dedatos. Primero, para consultar el tipo de aislamiento y cambiarlo a read uncommited, que permite que se produzcan los tres problemas, se puede ejecutar los comandos:
#consu1ta tipo de aislamiento mysql) select @@tx_isolation; + -+ I @@tx_iso1ation + ---------------+ I REPEATABLE-READI + ---------------+ 1row in set (0.00 sec) #estab1ecer el tipo de aislamiento a read uncommitted mysq1> set session transaction isolation level read uncommitted; Query DK, 0 rous affected (0.00 sec)
Para el siguiente ejemplo se utilizará la tabla coches creada con el motor innodb:
create table insert into
coches (nombre varchar(20)) engine=innodb; coches values (toyota),(audi),(seat);
La lectura
no repetible
A continuación, dos sesiones distintas, de dos usuarios distintos, consultan la base de datos en el siguiente orden para producir una lectura no repetible: Lectura no #sesión 1 mysq1> start transaction; Query DK, 0rows affected (0.00 mysq1> select + ------ -+ Inombre I + ------ -+ I toyota Iaudi + -----3 rows
200
t from
coches;
I I -+ in set
(0.00 sec)
sec)
repetible-1
Capítulo 5.
Tratamiento de los datos
La sesión 1 inició una transacción para hacer operaciones y segundos despuésuna segunda sesión realiza cambios en la tabla mientras la transacción continúa en la sesión 1: Lectura no #sesión 2 mysq1> update coches set nombre=vo1vo vhere Query DK, 1row affected (0.00 sec) Rows matched: 1Changed: 1Warnings: 0
repetible-2
nombre=audi;
La sesión 2ha realizado un cambio en los datos, por tanto, la transacción de la primera sesión no será capaz de reproducir la situación anterior puesto que se ha producido una lectura no repetible: Lectura no #sesi6n 1 mysq1> select +-------+ I nombre I + ------ --+ I toyota I volvo + -----3rows
*from
repetible-3
coches;
I | --+ in set
La lectura
(0.00 sec)
fantasma
Si a continuación, el cliente 2 inserta un nuevo registro en la tabla, la sesión 1 podrá inmediatamente ver los cambios. Esto es lo que se llama una lectura fantasma: Lectura fantasma-1 #cliente 2 mysq1> insert into coches values (renault); Query OK, 1row affected (0.00 sec)
Lectura fantasma-2 #c1iente 1 mysq1> select
rovs in
*from
set (0.00
coches;
sec)
201
Bases de
Datos
La potencial situación problemática tanto de la lectura no repetible como de la lectura fantasma es que datos que participan en una transacción cambian o aparecen sin previo aviso, pudiendo provocar que la transacción genere información que no es del todo íntegra. La lectura
sucia
El último problema, ymás grave, es el de la lectura sucia. A continuación, siguiendo con las dos sesiones delos ejemplos anteriores, se reproduce esta situación. En este caso, la sesión 2 inicia una transacción y realiza operaciones DML sobre los datos: Lectura sucia-1 #sesión 2 mysq1> start transaction; Query OK, 0 rows affected (0.00
sec)
mysq1> insert into coches values (alfa); Query DK, 1row affected (0.00 sec) mysq1> update coches set nombre=honda where Query OK, 1row affected (0.00 sec) Rovs matched: 1Changed: 1Harnings: 0
nombre=toyota;
Después, la sesión 1 lee los datos que hay en la tabla: Lectura sucia-2 #sesión 1 mysq1> select
rows in
set
t from
coches;
(0.00 sec)
Se puedeobservar, que gracias a esa lectura la sesión 1 puede generar nueva información o realizar algún trabajo que implique trabajar con la información modicada por la sesión 2. Pero, supóngase que ahora, la sesión 2realiza un rollback de sus operaciones:
202
Capítulo 5.
Tratamiento de 10s datos
Lectura sucia-3 #sesión 2 mysq1> rollback; Query OK, 0rows
affected (0.00
sec)
Se puede observar que la sesión 1, aunque ya no puede acceder a la información que fue insertada por la sesión 2, puesto que se ha efectuado un rollback, puede haber estado trabajando con datos, que, en realidad, nunca han estado en la base de datos. Esto, es una lectura
sucia: Lectura sucia-4
sesión 1 mysq1> select
rows in
*from
set (0.00
5.11. El
coches;
sec)
acceso a
la información
Cuando se administra la. seguridad en el acceso a información de una base de datos, es común utilizar dos tipos de seguridad, la integrada con el sistema operativo y la proporcionada por el SGBD (nativa). En la seguridad integrada, se suele contar con los usuarios de un sistema de dominio o un servicio de directorio (LDAP) para proporcionar el acceso a determinados recursos del gestor de base de datos. En la seguridad nativa del SGBD, es el propio software servidor el que proporciona los mecanismos elementos de
mediante los bases de
cuales se
autoriza a
un usuario
a utilizar
distintos
datos.
El alcance de este libro es tratar la seguridad nativa de un SGBD a través de SQL explicando el funcionamiento básico de la seguridad en MySQL, Oracle y DB2.
5.12. Las
vistas
Una vista es una tabla sin contenido, totalmente virtual, que devuelve las las resultado de ejecutar una consulta SQL. La diferencia con una consulta ejecutada directamente es que, mientras cada sentencia SQL enviada al SGBD tiene que pasar 203
Bases de
Datos
por un proceso de compilación, la vista es una consulta cuya denición ha sido almacenada previamente y que ya ha sido compilada, siendo por tanto el tiempo de ejecución bastante menor. También tiene una implicación importante en el hecho de que un usuario podría no tener acceso a la información de varias tablas y, sin embargo, sí tener acceso a la Vista que consulta esas tablas, proporcionando de esta manera un acceso controlado solo a detern1inadas las y columnas de esas tablas.
¿r Usuario de Madrid La
xústaii j
CLIENTES DE
Figura 5.6: Vistas. Por ejemplo, en una tabla de clientes, un usuario de una ocina de Madrid podría tener solo acceso a la información de los clientes de Madrid, y tan solo a ciertos campos. De esta manera, no tendría acceso a ningun campo de la tabla de clientes y, sin embargo, podría tener acceso auna vista que consulte aquellos clientes cuya provincia sea Madrid. La sintaxis para crear una vista es la siguiente: CREATE [OR REPLACE] VIEW [esquema.]nombre_vista [(1ista_co1umnas)]
AS
sentencia_se1ect
La ejecución del CREATE VIEW provoca que secompile la sentencia selecty que se almacene
con el
nombre nombremista.
Los nombres
de las columnas de
la vista
se pueden especicar mediante lista_columnas. Si se especica la lista de columnas, cada columna tendrá el alias correspondiente, si no, se obtendrá el nombre devuelto por la consulta. Si la vista ya existe, se puede reemplazar con OR REPLA CE. 204
Capítulo 5.
Tratamiento de los datos
Un ejemplo de CREATE VIEW es el siguiente: CREATE VIEW nba.jugadoresMiami AS
SELECT Nombre, Posicion FROM nba.jugadores WHERE Nombre_equipo=HEAT; SELECT * from nba.jugadoresMiami;
Además, se pueden crear vistas para que los usuarios no expertos puedan acceder de forma fácil a la información, proporcionándoles, a través de una vista, información obtenida a través de una sentencia SQL compleja:
CREATE VIEWVistaPedidos (CodigoPedido,C1iente,Tota1) AS SELECT CodigoPedido, NombreC1iente, SUM(Cantidad*PrecioUnidad) FROM Clientes
NATURAL JOIN
Pedidos NATURAL
JOIN Deta11ePedidos
GROUP BYCodigoPedido;
Para eliminar
una vista
se hace
uso del
comando DROP
VIEW:
DROP VIEW [esquema.]nombre_vista;
Hay pequeñas variaciones en la sintaxis de los comandos CREATE VIEW y DROP VIEW dependiendo del SGBD que se utilice. Además, se dispone también de un comando ALTER VIEW para hacer modicaciones a la denición de la vista. Para más información sobre estas variaciones, consultar los manuales de cada gestor.
5. 13.
Los usuarios
Para crear cuentas de usuario que permitan a los usuarios acceder a ciertos objetos con un nivel determinado de privilegios hay que hacer uso del comando CREATE USER.
CREATE USERnombre_usuario IDENTIFIED
BY password
[opciones];
Esta sencilla sentencia crea una cuenta usuario que permite la autenticación de un usuario en el SGBD a traves de la password identicada mediante la opción IDENTIFIED BY. Esta sintaxis de create user es válida tanto para MySQL como 205
Bases de
Datos
para Oracle, aunque a Oracle se le pueden incluir multitud de opciones extras para dar características adicionales, como la asignación de cuota para añadir información a un tablespace o bloquear la cuenta temporalmente. En DB2 no se utiliza el comando CREATE USER puesto que la mayor parte de la gestión de usuarios se hace de forma integrada con el Sistema Operativo. A continua.ción se muestran ejemplos de creación
de usuarios:
#creación de usuario en MySQL CREATE USER paco IDENTIFIED BY o99238kjkA; --creación de
usuario en
Oracle
CREATE USER paco IDENTIFIED BY o99238kjkA DEFAULT TABLESPACE
Nominas
QUÜTA UNLIMITED
DN Nominas
ACCÜUNT LOCK;
Actividad
5.32 Crealos usuariosPedro yJavier enlos SGBDmysql y Oracle
con passwords apropiadas. En Oracle, asigna quota de 1MB en algún tablespace. Para eliminar usuarios, se puede utilizar la sentencia DROP USER: DRÜP USER nombre_usuario [CASCADE];
En Oracle, se puede incluir el token CASCADE para indicar que junto con el usuario se borren todos los objetos de su esquema. En l\iIySQL, se pueden borrar la vez varios usuarios, separando los nombres de los usuarios mediante comas. Para modicar usuarios, Oracle utiliza el comando ALTER USER, que no está disponible en MySQL. Este comando ALTER USER usa las mismas opciones que CREATE USER.
--Modificación de ALTER USER
usuario en
Oracle
Paco
IDENTIFIED BY
nueva_pass DEFAULT
Tablespace Facturas;
En MySQL hay que modicar los usuarios actualizando sus datos en la propia tabla mysq1.user del sistema. Por ejemplo, para cambiar el host desde el que el 206
Capítulo 5.
Tratamiento de los datos
usuario Javier se puede conectar, habría que ejecutar la siguiente sentencia. Cuando en MySQL se modica algún permiso modicando el contenido de las tablas del sistema, hay que ejecutar además el comando FLUSH PRIVILEGES para forzar al gestor a volver leer las tablas de permisos y que los cambios en los permisos sean efectivos desde
ese momento.
#Modificación de UPDATE mysql.user
usuario en
SET host=192.168.3.1
mysql.
where user=JAVIER;
FLUSH PRIVILEGES;
En MySQL también se puede renombrar un usuario conservando todos sus privilegios utilizando el comando RENAME USER ycambiar la password mediante el comando SET
PASSWORD:
#Modificación de RENAME USER
usuarios en
Paco@1oca1host to
SET PASSWORD for Pacoclocalhost
MySQL. Cambiar
nombre y
password al
usuario Paco
PacoSanchez@1ocalhost;
=PASSw0RD(nueva_pass);
Actividad 5.4: Ejecuta el siguientecomando paracambiar lapassword de un usuario en mysql: UPDATE mysql.user
SET Password =PASSWORD("nueva_pwd") WHERE user=paco
o Actividad
AND host=loca1host;
5.5: Cambia la passwordde los usuarios Pedroy Javier creados en
Oracle y bloquea sus cuentas mediante la opción ACCOUNT UNLOCK.
5. 14.
Los privilegios
Un usuario puede obtener privilegios para manipular objetos de una base de datos con el comando GRANT. Asimismo, se le pueden denegar permisos con el 207
Bases de
Datos
comando REVOKE. Estos comandos varian en su sintaxis dependiendo del SGBD que se está usuando puesto que el sistema de seguridad de cada uno es distinto. Además, inuye también la forma en que el subsistema de permisos del SGBD se integra con el sistema operativo.
5.14.1. El
sistema de
privilegios de
MySQL
La sintaxis del comando GRANT para MySQL es la siguiente:
GRANT tipo_privi1egio ON {nombre_tab1a
I*
[(co1umnas)] [, I *.*
I base_datos.*
tipo_privi1egio [(co1umnas)]] I base_datos.nombre_tabla}
T0 usuario [IDENTIFIED BY [PASSWORD] password] [, usuario [IDENTIFIED BY [PASSWORD] password]]
[WITH opcion [opcion] opcion
=
GRANT DPTION
| MAX_QUERIES_PER_HOUR count I MAX_UPDATES_PER_HOUR count I MAX_CDNNECTIÜNS_PER_HDUR count I MAX_USER_CONNECTIONS count
En MySQL se puede otorgar a un usuario permisos para hacer cualquier operación a nivel de host, de base de datos, de tabla o de columna. Así, es posible asignar. por ejemplo, permisos de SELECT sobre las columnas NombreCliente, Dirección y Telefono de
la tabla
GRANT SELECT
ON Clientes
clientes:
(Nombrecliente,Telefono,Ciudad)
TU paco@1oca1host;
Con esta sentencia el usuario paco@localhost solo podrá seleccionar las columnas NombreCliente, Telefono yCiudad de la tabla clientes, siéndole denegada una consulta del tipo select * from clientes.
tipo_privi1egio es la clase de permiso que puede ser a otorgar, típicamente pueden ser select, insert, update. . . .Pueden ser de los más variados. En el Cuadro 5.3 de la página 210 hay algunos ejemplos de los permisos disponibles en MySQL. 208
Capítulo 5.
Ïiatamiento de
los datos
Estos tipos de privilegio se pueden aplicar a las siguientes expresiones: Expresión Se
aplica el permiso a
nombre_tabla La
tabla nombre_tab1a
Todas las tablas de la base de datos que se está usando *.* Todas
las tablas
de todas
base_datos.* Todas
las tablas
de la base de datos db_name
base_datos.nombre_tabla Solo
la tabla
las bases de datos
nombre_tabla de
la base de datos
db_name
Cuadro 5.1: Tipos de objetos a los que se puede otorgar permisos. Finalmente con TO usuario se indica el usuario al que se quiere otorgar el permiso. Si el usuario user no existe, se crea, opcionalmente con la password indicada mediante la cláusula identied by. Adicionalmente, se puede indicar ciertas opciones precedidas de la cláusula WITH: Expresión GRANT OPTION
Permite conceder a otros usuarios los permisos que tiene el usuario, por tanto, el administrador debe ser muy cauto a la hora de conceder esta opción a los usuarios de la base de datos. MAX_QUERIES_PER_HOUR count Permite restringir el número de consultas por hora que puede realizar un usuario. MAX_UPDATES_PER_HOUR count Permite restringir el número de modicaciones MAX-CONNECTIONS_PER_HOUR Permite count restringir las conexiones (logins) por hora que realiza un usuario.
MAX_USER-CONNECTIONS APermite count
limitar el número deconexiones
simultáneas que puede tener un usuario. En cualquiera
de las opciones MAX-
si a count se le da el valor O. signica
ilimitado.
Cuadro 5.2: Opciones adicionales a los permisos.
209
Bases de
Datos
Privilegio Signicado
ALL [PRIVILEGES]
Da todos los permisossimples exceptoGRANT OPTION
ALTER Permite
el uso
ALTER ROUTINE
Modica o
CREATE Permite
borra rutinas el uso
CREATE ROUTINE
de ALTER
Crea rutinas
TABLE almacenadas
de CREATE
TABLE
almacenadas
CREATE TEMPORARY TABLES Permite
el uso
de CREATE
TEMPORARY TABLE
CREATE USER
Permite el uso de CREATE USER, DROP USER, RENAME USER, y REVOKE.
CREATE VIEW
Permite el
uso de
CREATE VIEW
DELETE Permite
el uso
de DELETE
DROP Permite
el uso
de DROP
EXECUTE Permite
al usuario ejecutar rutinas almacenadas
FILE Permite
el uso
de SELECT
TABLE INTO
OUTFILE
y LOAD DATA INFILE el uso de CREATE INDEX y DROP INDEX
INDEX Permite INSERT Permite
el uso
LOCK TABLES
Permite el
de INSERT
uso de
LOCK TABLES
en
tablas para las que tenga el permiso SELECT PROCESS Permite RELOAD Permite
REPLICATION CLIENT
el uso
de SHOW
el uso
de FLUSH
FULL PROCESSLIST
Permite al usuario preguntar dónde están los
servidores maestro
o esclavo
REPLICATION SLAVE
Necesario para los esclavos de replicación
SELECT
Permite el
SHOW DATABASES
SHOW DATABASES
SHOW VIEW
Permite el
uso de uso de
SELECT muestra todas SHOW CREATE
las bases VIEW
SHUTDOWN Permite el uso de mysqladmin shutdown Permite el
UPDATE
uso de
UPDATE
Sinónimo de no privileges, permite únicamente la conexión al gestor
GRANT OPTION USAGE
10
Cuadro 5.3: Tipos de privilegios en mjysql.
de datos
Capítulo 5.
Tratamiento de los datos
Algunos ejemplos de consultas para asignación de permisos en MySQL son los siguientes:
#0torga permisos de select e insert a todas las tablas GRANT SELECT, INSERT on nba.* T0 paco@loca1host;
#0torga todos
los privilegios
GRANT ALL PRIVILEGES on #Ütorga permisos #permitiendo al
tabla Clientes
jardineria.C1ientes
#0torga permisos
to paco@1oca1host
en la
de todas las bases a otros usuarios
y DELETE con
tabla jugadores
de la
un límite
de 10
nba
GRANTSELECT,INSERT,UPDATE,DELETE on nba.jugadores to WITH MAX_QUERIES_PER_HOUR
de datos
WITH GRANTDPTIÜN;
de SELECT, INSERT, UPDATE
la hora
de jardineria
TD paco©localhost;
de select a todas las tablas usuario ceder esos permisos
GRANT SELECTon *.*
#consu1tas a
a la
de nba
10 MAX_UPDATES_PER_HGUR
paco@1oca1host
10
La sentencia revoke deniegapermisos a un usuario sobre un objeto. A continuación se describe
la sintaxis:
REVDKE tipo_privi1egio
[(columnas)] [,
ON {nombre_tabla I *I FROM usuario [, usuario]
*.* I
tipo_privi1egio [(co1umnas)]]
base_datos.* I
base_datos.nombre_tab1a}
La sintaxis es muy parecida a la de la sentencia grant, a continuación se muestran unos cuantos ejemplos: #quita el permiso de select en revoke select on jardineria.Clientes #e1imina el
revoke all
permiso ALL
privileges on
la tabla
PRIVILEGES de
*.* from
jardineria.C1iente from paco@localhost; todas las
tablas
paco@1oca1host;
#quita los permisos de select e insert de todas las tablas de revoke se1ect,insert on jardineria.* from paco@1ocalhost;
jardineria
Otra forma de asignar y eliminar permisos en MySQL es utilizando las tablas del catálogo de metadatos, es decir, las tablas de la base de datos mysql creada en toda instalación del SGBD y que almacena toda la información sobre todos los 211
Bases de
Datos
ob jetos manejados por el gestor. En esta base de datos existen 5 tablas relacionadas con el sistema de permisos de MySQL, user, db, host, tables-priv y columns_priv. Estas tablas se pueden manipular manualmente con inserts y deletes para otorgar y denegar permisos a nivel de usuario, base de datos, equipo, tablas y columnas respectivamente.
A continuación se ilustra cómo MySQL procesa una consulta. Al recibir la instrucción SQL, se comprueba si el acceso a los diversos objetos están autorizados en cualquiera de estas tablas. Si ninguno de los niveles permite el acceso, la consulta es denegada por falta de permisos.
AUTORIZACIÓN EJECUCION DE Grado "l:
Consulta
DE CONSULTA
de permisos a CONSULTA DE PERMISOS EN
¡Va -'Grado 2:
Devuelve resultados
LA TABLAHSH
Consulta
de permisos a
nivel db. y @host PERMISOS EN LAS TABLAS ob ha Grado 3;
Consulta
de permisos a nivel4:dbiabla Grado Consulta
dbiablacolumna
de permisos a nivel
PERMISOS EN LA TABLAS tables ariv
o -n PERMISOS EN LA TABLAS -,u .N0 ACCESO
/, DENEGADO 5.14.2.
Figura 5.7: Estructura de permisos en mysql.
El sistema de privilegios de Oracle clasica los permisos en dos tipos, privilegios El sistema de privilegios de Oracle del sistema y privilegios de objetos. Además dene los siguientes conceptos: uROLES
Conjunto de privilegios que se pueden asignar a un determinado usua-
rio. Un usuario puede pertenecer a múltiples roles. 212
Capítulo 5.
Tratamiento de los datos
IPERFILES Un perl es un conjunto de restricciones sobre el uso de recursos. Cada usuario puede pertenecer a un único perl. De esta manera, Oracle permite asignar a un usuario privilegios del sistema, de objetos, roles y perles, todo ello a través de la sentencia GRANT:
GRANT privilegio
[ON [esquema Jobjeto] T0
[WITH {GRANT privilegio =
I ADMIN}
{usuario I
rol I
PUBLIC}
OPTION]
tipo_privi1egio [(co1umnas)] I privi1egio_sistema
[, tipo_privi1egio
[(co1umnas)]]
I rol
El privilegio a otorgar puede ser de varios tipos: IUn privilegio sobre un objeto a un usuario o rol. Si el privilegio es INSERT o UPDATE se puede indicar sobre qué columnas se tiene el permiso. En este caso, se debe incluir la cláusula ON para indicar sobre qué objeto se va a aplicar el permiso. -- permiso de select y update en dos GRANT SELECT, UPDATE (NombreC1iente, ON Jardineria.C1ientes
--todos
IUn
la tabla
Clientes
To Javier;
los permisos
GRANT ALL
columnas de Telefono)
sobre Pedidos
PHIVILEGES UN
al rol
ADMINISTRACION
Jardineria.Pedidos to
ADMINISTRACION;
privilegio de sistema sobre un usuario o rol.
--permiso para GRANT CREATE
--permiso para GRANT CREATE
crear tablas TABLE to
Javier;
crear tablas TABLE to
al rol
ADMINISTRACION
ADMINISTRACION;
IUn rol sobre un usuario u otro rol. El rol puede estar predenido sistema.) o puede ser denido por el usuario.
--asignar Rol GRANT CONNECT,
de acceso
y consumo
RESOURCE to
a otro
(rol de
Rol
ADMINISTRACION;
213
Bases
de Datos
"asignar
el rol ADMINISTRACION
GRANT ADMINISTRACION
to
a Javier
Javier;
I Un privilegiode objetoo sistemaa todo el mundo (PUBLIC). --pemiso
de acceso y consumo de recurso
GRANT CONNECT, RESOURCE
--permiso
a todos
to PUBLIC;
de update
sobre
las
GRANT UPDATE(Nombre, email)
columnas Nombre y
email
UN Jardineria.Emp1eados
de empleados
to Public;
Privilegio
ALL [PRIVILEGES DELETE
INSERT SELECT
UPDATE Privilegio
REFERENCES l
Signicado Da todos los permisossimples incluido GRANT Permite
el uso de DELETE
Permite
el uso de INSERT
Permite
el uso de SELECT
ALTER DATABASE ALTER
SYSTEM
OPTION
EXECUTE
AUDIT SYSTEM
CREATE [ANY]
Permite
el uso de UPDATE
Permite
crear claves foráneas
ALTER
Permite ejecutar un procedimiento, función, paquete. . . Permite cambiar la denición de un objeto
INDEX
Permite
ALTER [ANY] objeto SYSDBA
crear índices de una tabla
Cuadro 5.4: Tipos de privilegiosde objeto en Oracle.
ANALYZE [ANY] objeto ¿Ï En É Permite ejecutar el comando ALTER
objeto
Permite
el uso de ALTER
Permite
la auditoría
DATABASE
SYSTEM
mediante
la sentencia AUDIT
Permite el uso de CREATE para un tipo de objeto (TABLE, VIEW, PROCEDURE, USER, PROFILE, etc...) Permite el uso de ALTER para un tipo de objeto (TABLE, VIEW, PROCEDURE, USER, PROFILE, etc...) Permite ejecutar operacionesde parada y puesta en marcha de la BBDD
Capítulo 5.
Tratamiento de los datos
REVOKE privilegio
[ON [esqnema.]objeto] FROM {usuario privilegio
I rol
I PUBLIC}
=
tipo_privi1egio [(co1umnas)] I privi1egio_sistema
[, tipo_privi1egio
[(co1umnas)]]
I rol
Algunos ejemplos de esta sentencia son los siguientes: --Denegar permiso
de select
en Clientes
REVOKE SELECT
ON Jardineria.C1ientes
--Denegar rol
CONNECT a todos
REVOKE CONNECT
--Denegar los
ADMINISTRACION
FROM ADMINISTRACION;
FROM PUBLIC;
roles ALMACEN
REVOKE ALMACEN,CONTABILIDAD
--Denegar todos REVOKE ALL
al rol
YCONTABILIDAD
los privilegios
PRIVILEGES ON
AJavier;
FROM Javier;
a Javier
Pedidos FROM
en la
tabla Pedidos
Javier;
Cuando se elimina. un privilegio de un usuario, el SGBD elimina el permiso de ese usuario de forma inmediata a él y a todos los usuarios a los que se les haya concedido el privilegio con la opción WITH GRANT o WITH ADMIN. Los roles
Para simplicar de Roles
con la
la tarea de organizar los permisos, Oracle permite la creación
sentencia CREATE
ROLE:
CREATE ROLEnombre_ro1 [opciones_identificacion]; opciones_identificacion: NOT IDENTIFIED
I IDENTIFIED
{BYpassword EXTERNALLY I GLOBALLY USING I I [esquema].pack Al crear un rol, se puede especicar el tipo de autenticación. Si se especica NOT IDENTIFIED, el rol está autorizado por la base de datos y no es necesaria ninguna contraseña para. activarlo, sin embargo si se especica IDENTIFIED, el 215
Bases de
Datos
usuario debe
ser autorizado
antes de
activar el
rol. Dentro
de IDENTIFIED
existen
varias posibilidades: - BY password, donde el usuario debe indicar la contraseña antes de activar el papel. nEXTERNALLY,para ser autorizado mediante un servicio externo (como el sistema
operativo). I GLÜBALLY, que
cede la autorización al servicio Oracle Security Service.
ISi se elige USING, se elige crear un rol de aplicación segura, es decir, un rol que solo puede ser activado por las aplicaciones que usen el paquete. Cuando un usuario se conecta al SGBD, este otorga al usuario los permisos que se le hayan concedido explícitamente mediante la orden GRANT y los permisos que tengan los roles por defecto del usuario. Para asignar un rol por defecto a un usuario se utiliza la sentencia ALTER USER de la siguiente forma:
ALTER USERusuario DEFAULT RDLE [opciones_ro1];
opciones_ro1: rol[, rol]... I ALL [EXCEPT
rol]
I NÜNE
Se puede anular el rol por defecto mediante la opción N ONE, o habilitar todos los roles mediante ALL, o todos menos uno mediante ALL EXCEPT rol, o conceder varios separados por coma. Por ejemplo, para asignar los roles ADMINISTRACION y CONTABILIDAD al usuario Javier:
GRANT Contabilidad,Administracion ALTER USER
Javier DEFAULT
to Javier; ROLE ADMINISTRACION,CONTABILIDAD;
Finalmente, se puede utilizar también la sentencia SET ROLE para dotar momentáneamente de ciertos privilegios a un usuario que tenga autorizado su uso. Por ejemplo, se puede crear el rol ALMACEN, con todos los privilegios sobre la tabla Productos y asignarselo al usuario Javier. Si el usuario Javier no activa el rol ALMACEN mediante SET ROLE y su contraseña, no podrá disfrutar de sus privilegios 216
Capítulo 5.
CREATE ROLE
ALMACEN IDENTIFIED
GRANT ALL Privileges UN GRANT ALMACEN
BY AlmacenPwd;
Jardineria.Productos TD
ALMACEN;
to Javier;
--conexión con
SQL> select
Tratamiento de los datos
el usuario
Javier
count(*) from
Jardineria.productos;
select count(*) from Jardineria.productos *
ERROR en
línea
ORA-00942: la
1: tabla o
vista no
existe
SQL> SET ROLE ALMACEN identified by
A1macenPwd;
Rol definido.
SQL> select
Creación de
count(*) from
Jardineria.productos;
perles
Los perles se usan para limitar la cantidad de recursos del sistema o de la base de datos disponibles para un usuario. Existe un perl llamado DEFAULT que concede recursos ilimitados a todos los usuarios. Para evitar esto, se puede hacer uso de la sentencia CREATE PROFILE para crear nuevos perles.
CREATE PROFILE perfil recursos
LIMIT recursos
...
= recurso
{cantidad
I UNLIMITED
I DEFAULT
}
I password recurso
=
SESSIONS_PER_USER
I CPU_PER_SESSION I CPU_PER_CALL
I CONNECT_TIME I IDLE_TIME
I LOGICAL_READS_PER_SESSION Í LÜGICAL_READS_PER_CALL I COMPOSITE_LIMIT I PRIVATE_SGA password =
parametro
{cantidad
I UNLIMITED I DEFAULT }
I PASSw0RD_VERIFY_FUNCTIDN {función
I NULL
I DEFAULT }
217
Bases de
Datos
parametro
=
FAILED_LÜGIN_ATTEMPTS PASSWORD_LIFE_TIME I I PASSWÜRD_REUSE_TIME l PASSWÜRD_REUSE_MAX
| I PASSWORD_LOCK_TIME PASSWORD_GRACE_TIME
Los diferentes límites que se pueden utilizar están denidos en la siguiente tabla:
Límite SESSIONS_PER_USER Flmción
Número máximo
de sesiones
abiertas a
la vez
por un usuario CPU.PER_SESSION
CPU_PER_CALL
CONNECT_TIME
IDLE_TIME
LOGICALBEADS_PER_SESSION
Tiempo límite para una sesión expresado en centésimas de segundos Tiempo límite de respuesta.para una. llamada (parse. fetch o ejecución) en centésimas de segundos Tiempo límite total de una sesión, expresado en minutos Tiempo máximo de inactividad de una sesión expresa.dos enminutos Número máximo de bloques de datos leidos en una
LOGICALBEADS-PER-CALL
Número máximo de bloques de datos leidos en una
PRIVATELSGA
COMPOSITELLIMIT
sesión
llamada
Tamaño de memoria que una sesión puede reservar del espacio privado de memoria del SGA Coste total en recursos de una sesión, expresado mediante el promedio de ciertos parámetros Cuadro 5.6: Tipos de recursos.
Por ejemplo, se puede crear el perl OPERADOR
CREATE PROFILE
OPERADOR LIMIT
con los siguientes límites:
Capítulo 5. Tratamiento de Ios datos CONNECT_TIME 120
-- 2
horas totales
de conexion
J
También es posible alterar un perl --modificar el alter profile
perfil DEFAULT para que la password no caduque DEFAULTLIMIT PASSWORD\_LIFE\_TIME Unlimited;
--modificar el --y un máximo alter profile
Un perl ejemplo:
mediante la sentencia ALTER PROFILE:
perfil OPERADOR para que de 10 sesiones concurrentes OPERADORLIMIT CONNECT_TIME
su limite
de sesión
sea de
60 SESSIONS_PER_USER 10;
se puede asignar en el momento de crear o modicar
-- creación
de un
CREATE USER
Francisco IDENTIFIED
usuario con
QUOTA UNLIMITED
el perfil
1hora
el usuario, por
OPERADOR
BY FrancisPwd
ON Users
PROFILE OPERADOR;
5.14.3. El
sistema de
privilegios de
DB2
Desde el punto de vista de la seguridad, se puede decir que en DB2 existen tres grandes puntos de gestión de los privilegios de acceso: 1. Autenticación
2. Autorización
3. Privilegio La autenticación busca responder a las siguientes preguntas: ¿quién puede acceder a la instancia o base de datosï, ¿dónde severicará la password de usuario? En DB2 los usuarios de autenticación deben estar dados de alta en el sistema operativo, es decir, que para resolver la primera pregunta, bastaría con decir que solo los usuarios del sistema pueden acceder a la instancia o base de datos, pero ¡ojo!, los usuarios pueden serlo del sistema local o de un sistema cliente remoto que esté intentando la conexión, esto sería así en función de cómo se dena la variada política de autenticación que dará respuesta a la segunda pregunta. La política de autenticación no solo permite o no la conexión desde clientes, sino que, entre otras cosas, indica si habrá encriptación o no del usuario y password, e incluso de los datos intercambiados durante
la comunicación
con el servidor. 219
Bases de
Datos
La autorización hace referencia al nivel de permisos con que un usuario materializa el acceso a la instancia o base de datos. También determina los comandos que el usuario puede ejecutar, los datos que puede leer o modicar, o los tipos de objetos de base dedatos que se le permite crear, modicar o borrar. Todas estas consideraciones están preprogramadas en siete grupos de autorizaciones que pueden ser concedidos, en función del caso, aun grupo de usuarios o a un usuario determinado. ISYSADM: es el único al que se le permite modicar los parámetros de la instancia. Comparable a la autoridad del usuario root en Unix, puede ejecutar cualquier comando contra la instancia, contra todas las bases de datos de la instancia y contra todos los objetos de cualquier base de datos. ISYSCTRL: puede hacer todas las actividades de administración (crear y borrar bases de datos y tablespaces) y mantenimiento (hacer backups, pasar
estadísticas, actualizarparámetros de la base de datos), pero no podrá acceder a ningún dato de las bases de datos a no ser que le sean concedidos explícitamente los privilegios adecuados. nSYSMAINT: solo puede ejecutar labores de mantenimiento (hacer backups, pasar estadísticas, actualizar parámetros de la base de datos). ISYSMON: pueden obtener fotos estáticas de monitorización (en inglés database system monitor snapshots) de la instancia o sus bases de datos. IDBADM: solo existe en el contexto de una base de datos concreta. Le está permitido crear y borrar tablas, ejecutar estadísticas, y conceder o quitar privilegios, pero en ningún caso podrá borrar la base de datos, ni crear tablespaces, ni hacer backups, o modicar parámetros de conguración. ILOAD: permite ejecutar cargas de datos sobre las tablas y pasar estadísticas. Es un permiso a nivel de usuario. ISECADM: es la autorización encargada de gestionar toda la implementación de las LBAC (del inglés label-based access control=LBA C ), esto es el control de acceso basado en etiquetas. Los privilegios propiamente dichos pueden ser a nivel de toda la base de datos o solo estar referidos a un objeto concreto. En esencia son prá.cticamente iguales que los permisos de Oracle, se conceden con el comando GRAN T y se revocan con
el RE VOKE. Van
desde el simple CONNECT, pasando por los DML (SELECT,
INSERT, DELETE, UPDATE), hasta
220
los típicos ALTER, DROP. . .
Capítulo 5.
5.15. Prácticas
Práctica 5.1:
Resueltas
Inserciones, Actualizaciones y Borrados
Con la base de datos Jardinería, las siguientes acciones: 1. Inserta
Tratamiento de los datos
una ocina
con sede
crea y ejecuta un script "actualiza.sql que realice
en Fuenlabrada.
2. Inserta un empleado para la ocina de
Fuenlabrada que sea representante de
ventas.
3. Inserta un cliente del representante de ventas insertado en el punto 2.
4. Inserta.un pedido del cliente anterior (con su detalle) de al menos 2productos con una
transacción.
5. Actualiza el código del cliente insertado yaverigua
si hubo cambios en las
tablas relacionadas.
6. Borra el cliente y verifica si hubo cambios. actua1iza.sq1 #1 INSERT
INTO Oficinas
VALUES
(FUE-ES,Fuen1abrada,España,Madrid, 28941,918837627,C/Las suertes,27,Bajo A); #2 INSERT INTO Empleados (CodigoEmp1eado,Nombre, Apellidol,Email,Codigo0ficina,Puesto) VALUES (400,Ismae1,Sánchez,isanchezQjardineria.com,FUE-ES,Rep.Ventas); #3
INSERT INTO C1ientes(CodigoC1iente, Nombrecliente, Telefono, CodigoEmp1eadoRepVentas) VALUES (288,Riegos Pérez,918882763,400); #4 START TRANSACTION;
INSERT INTO Pedidos
(CodigoPedido, FechaPedido,
Estado, CodigoC1iente)
VALUES (1900,2010-O6-03,Pendiente,288);
INSERT INTO DetallePedidos PrecioUnidad,NumeroLinea)
INSERT INTO Detal1ePedidos PrecioUnidad,NumeroLinea) COMIT
(CodigoPedido, CodigoProducto,Cantidad, VALUES (1900,OR-99,1,15.99,1);
(CodigoPedido, CodigoProducto
,Cantidad,
VALUES (1900,OR-251,3,168,2);
WORK;
#5
UPDATE Clientes #no permite
SET CodigoC1iente=290 WHERE CodigoC1iente=288; la modificación, deberia tener la FK con ON UPDATE CASCADE
221
Bases de
Datos
#6
DELETE FROM Clientes WHERE #tampoco permite el borrado,
Práctica 5.2:
CodigoCliente=288; debería tener
la FK
con ON DELETE CASCADE
Actualizaciones yborrados consubconsultas
Usa subconsultas en los ltros y
realiza las siguientes actualizaciones yborrados:
1. Borra los clientes que no tengan pedidos.
2. Incrementa en un
20 (7o el precio de los productos queno tengan pedidos.
3. Borra los pagos del cliente con menor límite de crédito. 4. Establece a Oel límite de crédito del cliente que menos unidades pedidas tenga del producto OR-179.
#1
delete from
Clientes
(Select distinct
where CodigoCliente
Codigocliente from
not in
Pedidos);
#2
update Productos
set PrecioVenta=PrecioVenta*1.2
where not
exists
(Select distinct CodigoProducto from DetallePedidos where DetallePedidos.CodigoProducto=Productos.CodigoProducto); #3
delete from
Pagos where CodigoCliente=
(Select Codigocliente
from Clientes
(Select min(LimiteCredito)
where LimiteCredito
=
from Clientes)
); #4
update Clientes
set LimiteCredito=0
(Select Codigocliente where Cantidad
from Pedidos
=(Select
where CodigoCliente=
natural join
Min(Cantidad) From
CodigoProducto=0R-179) AND );
222
Deta11ePedidos Deta11ePedidos
where
CodigoProducto=ÜR-179
Capítulo 5.
5.16. Prácticas
Tratamiento de los datos
Propuestas
Práctica 5.3: Vincular tablas a través de Access/ODBC Mediante el driver ODBC para MySQL, enlaza a una BBDD Access las tablas de la NBA y las tablas de la BBDD jardineria. A continuación, realiza las siguientes acciones:
1. Exporta a Excel la tabla jugadores de la NBA. 2. Con Word, crea
una carta
modelo de felicitación de
navidad a los clientes de
la base de datos y combina la correspondencia para que, automáticamente, se genere una carta para cada cliente. 3. Inserta dos registros en la tabla Empleados de jardineria mediante un formulario creado en Access. y después, inserta dos jugadores de la NBA siguiendo el mismo procedimiento. Hay que asegurarse de que, efectivamente, están los registros insertados. Se puede repetir esta misma operación con el driver ODBC para Oracle, pero hay que tener en cuenta que junto al driver, se debe instalar el software cliente de Oracle
(sqlplus, tnsnames,etc.) para que funcione.
Práctica 5.4:
Actualizaciones yborrados variados
1. Modica la tabla DetallePedido para insertar un campo numérico llamado IVA. Mediante una transacción, establece el valor de ese campo al 18 para aquellos registros cuyo pedido tenga fecha a partir de Julio de 2010. A continuación actualiza el
resto de
Pedidos estableciendo
al 16
el IVA.
2. Modica la tabla DetallePedido para incorporar un campo numérico llamado TotalLinea, y actualiza todos sus registros para calcular su valor con la fórmula
TotalLineazPrecioUnidad*Cantidad*IVA/ 100. 3. Borra el cliente que menor límite de crédito tenga. ¿Es posible borrarlo solo con una consulta? ¿Por qué? 4. A través de phpMyAdmin o, mediante Access (vinculado vía ODBC), inserta dos clientes nuevos para un empleado a tu elección. A continuación, inserta un pedido con al menos 3 líneas de detalle. Después, ejecuta una consulta para
rebajarun en% 5el preciolos deproductos que sean Inás caros de 200 euros.
223
Bases de
Datos
Práctica 5.5:
Inserciones, Actualizaciones y Borrados
En Oracle, con la BBDD Jardinería,
codica en SQL las siguientes acciones:
1.
Inserta una ocina con sede en Leganés y dos empleados.
2.
Inserta un cliente de cada empleado insertado.
3.
Inserta dos pedidos de los clientes anteriores (con su detalle) de al menos 2 productos con una transacción.
.Borra uno de los clientes y comprueba si hubo cambios en las tablas relacionadas. Si no hubo cambios, modica las tablas necesarias estableciendo la clave foránea con
la cláusula
ON DELETE
CASCADE.
.Ejecuta el siguiente código para simular el ON UPDATE CASCADE de la tabla Pedidos y modica el código de algún pedido. Comprueba que haya modicado los registros relacionados en la tabla DetallePedidoz
CREATE OR
REPLACE TRIGGER
Actua1izaPedidos
AFTER UPDATEUN Pedidos FUR EACHROW 3 BEGIN
UPDATE Deta11ePedidos SET CodigoPedido WHERE CodigoPedido= :o1d.CodigoPedido;
= :new.CodigoPedido
END Actualizaclientes;
6.
Crea ahora el siguiente disparador y prueba a cambiarle el código a un Empleado. ¿Qué sucede? Busca el concepto de tabla mutante y estudia el problema.
CREATE OR
REPLACE TRIGGER
AFTER UPDATE ON Empleados
Actualizaclientes
FOR EACH RDW
BEGIN
UPDATE ClientesCodigoEmp1eadoRepVentas SET :new.CodígoEmp1ead = WHERE CodigoEmp1eadoRepVentas
=:o1d.CodigoEmp1eado;
UPDATE Empleados SET CodigoJefe =:new.CodigoEmp1eado WHERE CodigoJefe = :old.CodigoEmp1eado; END Actualizaclientes; /
224
Capítulo 5.
Práctica 5.6:
Tratamiento de los datos
MySQL: Crear usuarios y asignar permisosen
local Realiza las siguientes operaciones y almacena los comandos y los resultados en un chero:
1. Crea un usuario llamado paco@localhost con la sintaxis create user con permisos de solo conexión y comprueba que se pueda conectar. 2. Crea un usuario llamado juan@localhost con la sintaxis grant con permisos de solo conexión y comprueba que se pueda conectar. 3. Otorga al usuario paco@localhost permisosde selecten la tabla jardineria.Clientes y comprueba que se pueda consultar la tabla. 4. Otorga al usuario juan@localhost permisos de select, insert y update en las tablas de la base de datos jardineria con opcion GRANT. 5. Conéctate con el usuario juan y otorga permisos a paco de selección enla tabla jardineriaEmpleados. 6. Quítale ahora los permisos a paco de selección sobrela tabla jardineria.Clientes. 7. Conéctate con root y elimina todos los permisos que has concedido a Paco y Juan.
8. Otorga a juan los permisos de SELECT sobre las columnas CodigoOcina Ciudad de la tabla Ocinas de la base de datos jardineria. 9. Conéctate con juan y ejecuta la query SELECT * ¿Qué sucede?.
y
from jardineriaOcinas
10. Borra el usuario paco@localhost.
225
Bases de
Datos
Práctica 5.7:
MySQL: Crear usuarios y asignar permisosen
remoto
Realiza las siguientes operaciones y almacena los comandos y los resultados en un chero: 1.
Crea un nuevo usuario llamado usuarioíldireccionip donde direccion_ip es una máquina de un compañero tuyo y usuario su nombre.
.Otórgale permisos de seleccion en todas las tablas de la base de datos jardineria. Ten cuidado, es posible que tu servidor solo permita conexiones desde el ordenador local, para permitir conexiones remotas debes comentar la linea bind-adress de tu chero mycnf que impide conexiones desde otros sitios que
no seael especicado (127.0.0.1). Asegúratede reiniciar el servidor. .Pide a tu compañero que se conecte desde su máquina y que averigue qué permisos le has otorgado. El a tí te pedirá lo mismo, es decir, que te conectes a su máquina, indica qué instrucción sql ejecutas para conocer los permisos que tienes.
Revócale los permisos concedidos al usuario usuario@direccion_ip. .Concédele ahora permisos de creación de tablas en una nueva base de datos que has creado. .Solicítale que se conecte y que pruebe a crear una tabla. ¿Puede consular la informaciónï.
. Borra ahora el usuario usuario@direccion_ip. .Con la bbdd mysql consulta qué privilegios tiene el usuario juan@localhost a nivel de servidor, a nivel de base de datos, a nivel de tablas y a nivel de columnas. Utiliza el comando show grants for usuario.
226
Capítulo 5.
Tratamiento de los datos
Práctica 5.8: Oracle: Creación de usuarios,roles yperfiles 1.
Crea dos roles, uno llamado ADMINISTRACION con todos los privilegios sobre la tabla CLIENTES y PEDIDOS del esquema JARDINERIA yotro llamado CONTABILIDAD con todos los privilegios sobre la tabla PAGOS del mismo esquema. El rol CONTABILIDAD estará identicado por contraseña,
.A continuación, crea un usuario Fernando en Oracle con las siguientes opciones: DEFAULT TABLESPACE Users, TEMPORARY TABLESPACE Temp, QUOTA 100 Megabytes en Users yotorga el rol CONNECT yRESOURCE. . Otorga como Rol por defecto ADMINISTRACION al
usuario Fernando.
.Con el usuario Fernando, prueba a ejecutar una consulta sobre la tabla Clientes y otra sobre la tabla PAGOS. .A continuación, activa el Rol CONTABILIDAD y tabla PAGOS
repite la consulta sobre la
con el usuario Fernando.
.Desactiva todos los roles del usuario Fernando, incluyendo el rol por defecto. .Consulta
la tabla
Clientes.
227
Bases de
Datos
5.17.
Resumen
Los conceptos clave de este capítulo son los siguientes: La sentencia INSERT se utiliza para insertar una la o registro en una tabla. Algunos SGBD, como MySQL, permiten la inserción de más de una la mediante la sintaxis extended-insert. Con INSERT se pueden insertar valores para todas las columnas o solo para algunas de ellas. La sentencia UPDATE se utiliza para actualizar uno o varios registros de una tabla. DELETE sirve para eliminar registros de una tabla. Se puede ltrar la información a modicar o borrar mediante un ltro WHERE. El ltro, puede tener todas las características del ltro de la SELECT. Si no se especíca ltro, se actualizan o borran todas las las de la tabla. También se pueden actualizar o borrar las con UPDATE yDELETE ltrando a través de una subconsulta. En este caso, la limitación consiste en no poder modicar o borrar registros de una tabla a la que se accedeen la subconsulta. Se puede realizar la inserción de múltiples registros en una tabla con los resultados devueltos por una SELECT. La SELECT debe devolver tantas columnas como se especiquen en la sentencia INSERT. No siempre es posible actualizar o borrar información de tablas puesto que existen restricciones. Además, algunas restricciones provocan cambios en cascada en
tablas relacionadas.
Las transacciones son conjuntos de operaciones SQL que se ejecutan de forma atómica. Una vez iniciadas, se pueden acometer (COMMIT) o cancelar ROLLBACK.
El tratamiento de transacciones, produce problemas de concurrencia, es decir. problemas que se presentan al haber varios usuarios actualizando, borrando y consultando un conjunto de datos. Estos problemas están clasicados por
ANSI/ISO en 3 problemas típicos. Los SGBD permiten que ocurran o no. dependiendo del nivel de aislamiento que se seleccione. El comando CREATE VIEW sirve para crear vistas, personalizando la forma en la que el usuario obtiene la. información. Se puede crear usuarios mediante el comando CREATE USER al cual se le puede asignar un perl y varios roles. Mediante los comandos GRANT y REVOKE se otorgar y deniegan permisos. 228
Test de repaso
5.18. 1. En
la sentencia
Capítulo 5.
INSERT
Tratamiento de los datos
a) No se puedenomitir valores de columnas b) Se pueden especicar un número distinto de valores y columnas
c) Se pueden omitir los nombresde columnas d) Ninguna
de las anteriores 6. En
2. Con
GRANT
yREVOKE
sentencia UPDATE
a) Sólo se puede modicar un campo de un
a) Se pueden otorgar permisos de select a una o varias
una sola
registros
tablas
b) Se pueden otorgar permisos para borrar
b) Sólo se puede modicar un registros
campo de varios
una tabla
c) Sólo se pueden modicar varios
c) Se puede otorgar permisos para ejecutar comandos DDL
d) Se pueden modicar varios camposde va-
d) Todas las anteriores 3. Para
poner una
campos de
un registro
rios registros
columna al
valor por
defecto
7. Una
transacción
a) Puede tener sentencias SELECT
a) Se tiene que poner NULL
b) No puede tener sentencias INSERT
b) Se tiene que poner DEFAULT
c) No puede tener sentencias SELECT
c) No es posiblehacerlo
d) Sólo puede tener sentencias UPDATE
d) Ninguna de las anteriores 8. Para
4. En sentencias UPDATE
yDELETE
a) Se puede especicar el mismo tipo de ltro que para WHERE
b) Se puede especicar el mismotipo de ltro que para HAVING
comenzar una
transacción se
usa
a) START WORK b) START
TRANSACTION
)
c) Se puede ltrar mediante unasubconsulta d) Todas las anteriores 5. Si
se especica
ON DELETE
c SET
CAS-
CADE
d Todas
)
AUTOCOMMIT=OFF las anteriores
9. Los perles en a) Al
Oracle
igual que los roles, sirven para limitar
los recursos
b) No se pueden limitar recursos perles
Noa) puede se el borrar registro referenciado b) Se borra encascada elregistro referenciado c) No se puedeborrar el registro quereferen-
mediante
c) Sirven para agrupar conjunto de permisos
d) Ninguna de las anteriores
cia
d) Se borra en cascada elregistro quereferencia
'P6P'89'¿'P9'q'9P?'q'¬'P
Bases de
Datos
Comprueba tu
5.19.
.Escribe
el formato
de la
aprendizaje
. Imagina una situación, y pon un ejemplo de borrado en cascada de
sentencia
INSERT y, ejemplica su funcionamiento mediante dos inserciones, una especicando la lista. de campos y otra indicando todos los valores para todas las columnas. .Transforma
las dos
SERT anteriores SERT con
registros.
.Imagina otra situación distinta, y pon un ejemplo de actualización en cascada tanto en Oracle, como en 1\IySQL.
sentencias IN-
en un
único IN-
sintaxis extendida.
.¿Qué quiere decir que una actualización o
. Escribe
el formato
de la
sentencia
UPDATE y, ejemplica su funcionamiento mediante tres querys, una que actualice una columna de una la, una que actualice dos columnas de varias las, y otra que actualice todas las .Escribe
las de
una tabla.
el formato
de la
10.
Dene el concepto de transacción indicando en qué situaciones son útiles y qué problemas puede ocasionar.
sentencia
11.
Dene los tipos de problemas ocasionados por la concurrencia en el acceso a
los datos:
a) Dirty
bla.
Read o Lectura Sucia
b) N onrepeateable Read o Lectura No Repetible
. ¿En qué consiste un INSERTSELECT? Pon un ejemplo de su
c) Phantom Read o Lectura Fan-
funcionamiento.
tasma
.¿Qué condiciones deben darse para que al hacer una modicación en una tabla, sus cambios se propaguen a la tabla. que la. referencia
230
ltra mediante
una consulta? ¿Existe alguna restricción al respecto?
DELETE y, ejemplica su funcionamiento mediante dos querys, una que borre una sola la y otra que borre todos los registros de una ta-
mediante una
borrado se
clave foránea?
12.
¿Qué signica que un SGBD tenga una política de aislamiento?
13.
Enumera. los tipos de aislamiento estándar.
CAPÍTULO 6
Programación de
bases de datos Objetivos
Contenidos ,
Introducir
Introducción a loslenguajes de programación de bases dedatos
Tipos dedatos, identicadores yvariables
graïnacïón de 133595 datos de Aprender los Inecanismos bási-
C05 de la P1 ogïalïïaCïólï de bases de datos
operadores yexpresiones Diseñar
Estructuras control de
y codicar scripts para tareas complejas
Incorporar Gestión de BTTOTGS transacciones
._.
Transacciones en scripts
el Concepto de pro-
el usode las en tareas
com-
plej as Manejar cursores
En este tema e] alumno aprenderá a programar una base de datos, desarroIlando programas yguiones utilizando las técnicas apropiadas.
231
Bases de
Datos
6.1. Introducción
a la programación de
bases de
datos Programar una base de datos es la forma en la que el desarrollador o administrador de
la base
de datos
interactúa con
ella.
Hay muchas maneras de programar una base de datos, la elección del modo más
adecuado dependede con qué tecnologíade basede datos se estátrabajando (por ejemplo, Oracle),de quécompiladores setengan instaladosen la máquina objeto de ejecución (por ejemplo, C++), de qué ventajas e inconvenientes se persigan, o de la naturaleza de la aplicación de base de datos que se va a desarrollar. La aplicación de base de datos puede ser de tres tipos distintos: n Codicación en el lado del servidor: La lógica de la aplicación reside enteramente en la base de datos. La aplicación está basada en la implementación de disparadores que se ejecutan automáticamente cuando ocurre algún cambio en los datos almacenados. y en el almacenamiento de procedimientos y funciones que son llamados explícitamente. Una ventaja importante es que, de esta forma, se puede reutilizar el mismo código para muchos clientes.
n Modelo cliente/servidor (también
llamado modelo
en dos niveles):
El código de la aplicación corre en otra máquina distinta del servidor donde se encuentra la
base de
datos. Las
llamadas a
la base
de datos
son transmitidas
desde la máquina cliente al servidor. Los datos son transmitidos desde elcliente al servidor para las operaciones deinserción y actualización, y desde elservidor al cliente durante las consultas. Los datos son procesados enla máquina c1ient.e. Normalmente, estas aplicaciones se escriben usando precompiladores con las sentencias SQL embebidas en el código. IModelo
en tres
niveles: Al
modelo en
dos niveles
se le añade un
servidor de
aplicación separado que procesa las peticiones. Este podría ser, por ejemplo. un servidor Web básico, o un servidor que realizara funciones de cacheo de datos y balanceo de carga. Aumentar la potencia de procesamiento de esta capa intermedia permite disminuir los recursos necesarios para los clientes. pudiendo estos llegar a ser simples navegadores Web. Para el desarrollo de aplicaciones. ademásde necesitar un interfaz de programación donde hacer el desarrollo. se precisa de un software de cliente que enlace el código desarrollado con
la base
de datos.
Los interfaces
más comunes
son:
- SQL incorporado: Las aplicaciones de bases de datos de SQL incorporado se conectan a. las bases de datos y ejecutan directamente sentencias de SQL 232
Capítulo 6. Programación de bases de
datos
incorporado que se encuentran insertadas dentro de una aplicación escrita en un lenguaje principal (típicamente C, C++ o COBOL). Las sentencias SQL se pueden ejecutar estática o dinámicamente. IODBC: Microsoft desarrolló una interfaz SQL denominada Open Database Connectivity (ODBC) para los sistemas operativos de Microsoft. Los controladores ODBC especícos de la BBDD se cargan dinámicamente en el tiempo de ejecución, mediante un gestor de controladores basado en la fuente de da-
tos (nombre de la base de datos) proporcionada en la petición de conexión. La aplicación se enlaza directamente con una única biblioteca del gestor de controladores, en lugar de con la biblioteca de cada motor de base de datos. El gestor de controladores media entre las llamadas de función de la aplicación en el momento de la ejecución y asegura que estas se dirijan hasta el controlador ODBC adecuado que sea especíco para el motor. Dado que el gestor del controlador ODBC solo conoce las funciones especícas de ODBC, no se podrá acceder a las funciones especícas del motor de base de datos. ODBC no está limitado a los sistemas operativos de Microsoft; otras implementaciones están disponibles en varias plataformas. Para el desarrollo de aplicaciones
ODBC, debe instalarse un ODBC Software Development Kitl. ICLI: Call Level Interface (intefaz a nivel de llamada). Es una interfaz de programación de aplicaciones C y C++ para el acceso a bases de datos relacionales, que utiliza llamadas de función para pasar sentencias de SQL dinámico como argumentos de función. Es una alternativa al SQL dinámico incorporado, pero a diferencia de SQL incorporado, CLI de DB2 no necesita variables del sistema principal o precompilador. Se basa en la especicación ODBC 3,51 y en la Norma Internacional para SQL /CLI. Estas especicaciones se escogieron como la base para proporcionar una curva de aprendizaje más corta para aquellos programadores de aplicaciones, ya familiarizados con cualquiera de estas interfaces
de bases de datos.
u JDBC: Java Database Connectivity es un API (Applications Programming Interface, interfaz de programación de aplicaciones) que permite enviar sentencias SQL a una base de datos relacional. ISQLJ: Es un estándar ANSI SQL-1999 para incorporar sentencias SQL en código fuente Java. Proporciona una alternativa al JDBC para el acceso a datos desde Java tanto en el lado cliente como en el lado servidor. Un código fuente SQLJ es más breve que su equivalente en código fuente JDBC. lPara la plataforma Windows, el SDK de ODBC es parte del SDK de Microsoft Data Access Components (MDAC), disponible para descarga enhttpz/ /mm.microsoft .com/data. 233
Bases de
Datos
n OCI yOCCI: Oracle Call Interface (OCI) y Oracle C++ Call Interface (OCCI) son APIs que permiten crear aplicaciones que invocan procedimientos y funciones nativas para acceder y controlar todas las fases de ejecución de sentencias SQL en bases de datos Oracle. Permite desarrollar aplicaciones combinando la potencia de acceso a los datos del SQL, con la capacidad de hacer bucles, crear estructuras
de control. ..
Interfaz de base de datos Perl: Combina la potencia del lenguaje interpretado Perl y el SQL dinámico. Estas propiedades convierten a Perl en un lenguaje perfecto para crear y revisar rápidamente aplicaciones de bases de datos (DB2). El Módulo DBI de Perl utiliza una interfaz que es muy parecida a las interfaces CLI y JDBC, lo cual facilita la traducción de las aplicaciones Perl a aplicaciones CLI y JDBC, y viceversa.
Hypertext Preprocessor
(PHP): Es un lenguaje de programacióninter-
pretado. La primera versión de PHP fue creada por Rasmus Lerdorf y recibió contribuciones bajo una licencia de código abierto en 1995. Principalmente pensado para el desarrollo de aplicaciones Web, inicialmente era un motor de plantillas HTML muy sencillo, pero con el tiempo los desarrolladores de PHP han ido añadiendo funciones de acceso a bases de datos, han reescrito el intérprete, han incorporado soporte orientado a objetos y han mejorado el rendimiento. Actualmente, PHP se ha convertido en un lenguaje muy utilizado para el desarrollo de aplicaciones Web porque se centra en soluciones prácticas
y da soporte a las funcionesmás utilizadas en aplicacionesWeb? OLE DB:
Microsoft OLE DB es un conjunto de interfaces OLE/ COM que
proporciona a las aplicaciones un acceso uniforme a datos almacenados en distintas fuentes de información. La arquitectura OLE DB dene a los consumidores de OLE DB y a los proveedores de OLE DB. Un consumidor de OLE DB puede ser cualquier sistema o aplicación que utiliza interfaces OLE DB: un proveedor de OLE DB es un componente que expone las interfaces OLE DB.
El consejo del buen administrador. . . Toda programación debe ir acompañada de su correspondiente depuración de
errores. Hay estudios queconcluyen quese dedicaun 60-80% del
tiempo in-
vertido en fabricar un programa a 1a detección y corrección de errores.
¿Para Windows, se pueden encontrar versiones binarias precompiladas de PHPen http : //php. net.
234
Capítulo 6. Programación de bases dedatos
6.2. Los
lenguajes de
programación de
bases de
datos Se puede programar una base de datos en multitud de lenguajes, desde el C, pasando por el Java, hasta el nuevo e innovador XQuery, pero todos, en mayor o menor medida, terminarán recurriendo a sentencias SQL para extraer o insertar datos de la base de datos, por lo que es imprescindible y fundamental conocer y desenvolverse adecuadamentecon SQL. Para añadir más potencia de ejecución a las sentencias SQL, Oracle desarrolló un lenguaje propio llamado PL/ SQL, con él, es posible denir variables, crear estructuras de control de ujo y toma de decisiones, crear funciones, procedimientos, paquetes. . . .
Con el mismo objetivo, en DB2 viene incorporadoel lenguaje SQL/PL que, al contrario que el de Oracle, respeta la totalidad del estándar de SQL, pero además, DB2, desde su versión 9.7, ofrece la posibilidad de desarrollar directamente en
PL /SQL, existiendo compatibilidadplena conOracle, lo cual haceque lasmigraciones de la lógica de la aplicación de una base de datos Oracle a DB2 9.7 sean prácticamente transparentes para el desarrollador, facilitando además la reutilización del conocimiento y evitando la necesidad de tener que aprender las características del nuevo gestor (el equipo de trabajo sigue siendo productivo desde el mismo día de la
migración). Los programasPL /SQL, pueden ejecutarsehaciendo usodel SQL*Plus; los tipos básicos deun programaPL/SQL son: procedimientos,funciones ybloques anónimos. Todos ellos están compuestos de tres bloques bien diferenciados:
Partes de
un programa
DECLARE --declaración de variables que usarán se laen sección de ejecución --es opcional, --realizar precisa
ya que no siempre la complejidad del programa del uso de variables y constantes
a
BEGIN --sentencias a ejecutar, bloque ejecución de propiamente dicho. EXCEPTION --chequeo de errores de interés ocurridos durante todoejecución la --y acciones
--Bs opcional,
END;
a tomar
pero si
en consecuencia
existe, está
ubicado junto
antes de
END
Bases
de Datos
El consejo del buen administrador. .. Cuantos más comentarios se pongan en un programa, más fácil será su mantenimiento y posterior modicación, sobre todo si 1a persona encargada de retocarlo no es la misma que la persona que creó el programa originalmente. Los bloques anónimos solo se pueden utilizar en el momento de su creación. ya que al no tener nombre que los identique, no pueden ser referenciados. Si lo que se pretende es reutilizar el código, habrá que guardar el programa PL/ SQL en el catálogo de la base de datos, ya sea como procedimiento almacenado o función almacenada, de modo que quede identicado unívocamente con un nombre y un tipo. Tanto el procedimiento como la función podrán aceptar parámetros de entrada, pero solo la función devolverá a su vez un valor al término de su ejecución. En caso de querer crear un procedimiento, se sustituirá la palabra DECLARE por la sentencia CREATE
PROCED URE.
CREATE UR
REPLACE PROCEDURE nombre_de1_procedimiento
(lista_de_parámetros)
AS
Y si lo que se desea es crear una función, se sustituirá la palabra DECLARE por la sentencia CREATE
F UN CTI ON.
CREATE DR REPLACEFUNCTIÜNnombre_de_la_funcion(1ista_de_parámetros) RETURNtipo_de_dato_devuelto IS
En ambos casos, la lista de parámetros es opcional, de modo que si no se precisa
pasar parámetro alguno, basta con omitir la lista (incluyendo los paréntesis). Para hacer uso de un procedimiento basta con invocar la instrucción CALL. CALL nombre_de1_procedimiento(lista_de_va1ores);
En el caso de las funciones, puesto que estas tienen necesariamente que devolver un valor, para hacer uso de ellas es obligatorio recoger dicho valor. Una forma fácil sería asignándoselo a una variable que fuese del mismo tipo que el valor devuelto por la función, o también. invocarla desde una sentencia SELECT. SELECT
nombre_de_1a_función(1ista_de_va1ores) DUAL; FROM 236
Capítulo 6. Programación de bases de datos También se pueden agrupar procedimientos y funciones en objetos más grandes llamados paquetes, los cuales están compuestos por dos componentes: ILa
cabecera: encargada de almacenar la denición de todos los subprogramas
(procedimientos yfunciones) queincluye el paquete, asícomo la declaración de las variables y constantes globales al paquete (que podrán usarse en todos los subprogramas que lo componen). I El cuerpo:
que contiene el código de todos los subprogramas. cabecera del
CREATE DR REPLACE PACKAGE
paquete
nombre_de1_paquete AS
PROCEDURE nombre_de1_procedimiento_1 PROCEDURE nombre_de1_procedimiento_2 FUNCTION nombre_de_1a_función_1
(1ista_de_sus_parámetros); (lista_de_sus_parámetros); (1ista_de_sus_parámetros) RETURN
tipo_de_dato_devue1to;
--declaración de
variables y
constantes globales
al paquete
END nombre_de_paquete; /
Cuerpo del
paquete
CREATE OR REPLACE PACKAGE BODY nombre_del_paquete
PRÜCEDURE nombre_del_procedimiento_1 --declaración de
AS
(lista_de_sus_parámetros) IS variables y
constantes locales
al procedimiento
BEGIN
--código del nombre_del_procedimiento_1 END nombre_de1_procedimiento_1;
PRÜCEDURE nombre_del_procedimiento_2 --declaración de
(lista_de_sus_parámetros) IS variables y
constantes locales
al procedimiento
BEGIN
--código del nombre_de1_procedimiento_2 END nombre_del_procedimiento_2;
FUNCTION nombre_de_la_funcion_1 tipo_de_dato_devue1to IS --declaración de
(lista_de_sus_parámetros) RETURN
variables y
constantes locales
a la
función
BEGIN --código del nombre_de_1a_funcion_1 END nombre_de_la_funcion_1;
END nombre_del_paquete; /
237
Bases de
Datos
Recuerda. En Oracle, latabla DUAL es unatabla auxiliar muy útil para ejecutar todo tipo de funciones. Concretamente las que proporciona el gestor para por ejemplo, extraer el DDL de un objeto de la base de datos, o para conocer qué fecha es: SELECT SYSDATE
FROM DUAL;
En DB2, la tabla auxiliar se llama SYSIBALS YSD UMM Yl. El mismo ejemplo para obtener la fecha actual se haría con la sentencia: SELECT CURRENT. TIMESTAAÍP FROM SYSIBALSYSD UMMYI;
Los procedimientos y funciones que están dentro de paquetes, también pueden ser invocados individualmente y, de la misma manera que los procedimientos y funciones independientes, basta con calicarlos por delante con el nombre del paquete al que pertenecen, ya que esta es la.única forma de identicarlos unívocamente respecto de la totalidad de objetos que tiene la base de datos. Llamada dentro --llamada a
de un
paquete
procedimiento
CALL nombre_de1_paquete.nombre_de1_procedimiento(1ista_de_va1ores); --llamada a
función
SELECT nombre_del_paquete.nombre_de_1a_función(1ista_de_va1ores) FROM dual;
Actividad
6.1: Crea dos tablasque sellamen igualpero endistintos esquemas.
Crear, en el mismo esquema. dos objetos que se llamen exactamente igual, por ejemplo, una tabla y un procedimiento. Aparte de los programas mencionados (procedimientos, funciones y paquetes). también se puede codicar lógica de negocio en los dispara.dores o TRIGGERS asociados a tablas, vistas o eventos. que podrán ejecutarse una. vez (por ejemplo al intentar un usuario conectarse a la base de datos). o tantas veces como las de una tabla se vayan a insertar, borrar o actualizar. El disparador podrá programarse para que se active inmediatamente antes o después del evento. Para dar de alta o recrear un disparador basta con sustituir la palabra DECLARE por la sentencia de denición del disparador. Un ejemplo para denir un disparador de tabla que se ejecute en cada la antes de ser insertada. es el siguiente: 238
Capítulo 6. Programación de bases de datos
Creación o
recreación de
CREATE DR REPLACE TRIGGER nombre_de1_disparador DN nombre_de_1a_tab1a
En ese
FOR EACH
un disparador BEFORE INSERT
RÜW
caso, elmomento enel que se ejecutael disparadores BEFORE (antes),
y el evento que lo dispara es la instrucción DML INSERT (inserción en la tabla destino del disparador). Otro momento de ejecución podría ser AFTER (después), y otros eventos, además de la inserción, podrían ser el borrado (DELE TE) y la
actualización (UPDATE OF lista_de_columnas), o incluso varios a la vez (INSERT OR DELETE OR
(WHEN Por
UPDATE). Además.
también se podría añadir una condición
ejemplo, sepodría crear un disparadorllamado actualizaSueldoMini-
mo denido antes (BEFORE) de la actualización (UPDATE OF) del campo sueldo de la tabla nominas del esquema contratados. que se activara solo cuando se cumpliese la condición de que el valor del campo que se quiere actualizar fuese menor de 1000 euros, de modo que impidiese que se pudieran asignar sueldos por debajo de los
1000 euros.
CREATE OR sueldo
REPLACE TRIGGER
contratados.actua1izaSue1doMinimo
ON contratados.nominas
WHEN (new.sue1do
FOR EACH
BEFORE UPDATE
OF
ROW
< 1000)
BEGIN :new.sue1do :=
1000;
END; / ¿Sabías que .. . 7Se puede denir más deun disparadorpara la misma tabla y para la misma combinación de momento y evento, pero el orden en el que Oracle los ejecutará. será indeterminado. por ello es mejor opción agrupar la lógica de negocio en un solo disparador. DB2, en cambio, los ejecutaría según el orden en el que fueron creados. Dentro de la programación del disparador, :old.nombre_del_campo haráreferencia al valor antiguo del campo llamado nombre_del_campo.mientras que :new.nombre_del_campo seráel nuevo valor que pretende asignársele al campo llamado nombre_del_campo,pudiendo este valor new ser modicado en el bloque de ejecución del disparador. Nótese que en la cláusula WHEN. las variables :old y mew no deben ir precedidas de los dos puntos (z). 239
Bases de
Datos
Recuerda. En una basede datostodos losobjetos sonúnicos, esdecir, que estan perfectamente identicados por su nombre y por su tipo y no pueden repetirse. Por ejemplo. un mismo usuario o esquema de base de datos no podría tener dos tablas que se llamen exactamente igual. pero sí podría existir una tabla llamada nominas en dos esquemas distintos (contratados y subcontra-
tados), ya que la base de datos las conocería como contratadosnominas y subcontmtadosmominas.
En el caso delos procedimientos y funciones, existe además el nivel de paquetes, es decir, que podría existir un procedimiento independiente que se llamara calculaNominas que perteneciera al usuario pepito, pero además podría también haber otro procedimiento calculaNominas dentro de un paquete paqueteDeContabilidad del mismo esquema contratados. Se referenciarían por contratadoscalculaNominas, contratadospaqueteDeContabilidad.calculaNominas, respectivamente. Incluso podría existir una función que se llamara también contratados. calculaNominas, pues al ser objetos de distinto tipo, en una sentencia SQL determinada, la base de datos los distinguiría por el contexto.
6.3. Tipos
de datos,
identicadores y
variables
En Oracle existen varios juegos de datos soportados, unos especícos de Oracle. otros compatibles con el estándar ANSI y los tipos de datos del DB2 de IBM, otros denidos por el usuario a partir de los dos tipos anteriores mediante el uso de la instrucción CREA TE TYPE, y otros como los tipos de datos XML (para la consulta
y tratamiento de documentosXML) o los tipos de datos espa.ciales (para tratar la información geográca).
ICHAR(tamaño):
Aquí solo se tratarán los tipos básicos del primer juego:
cadena detamaño jo. El número máximo de caracteres
es 2000. Los valores de tipo cadena deberán ir entrecomillados con comilla simple.
IVARCHAR2(tamaño):
cadena delongitud variable. El tamaño máximo es
4000 caracteres. Los valores de tipo cadena deberán ir entrecomillados con comilla simple.
INUMBER(precisión,escala):
número decimal. La precisión puede tomar
valores entre 1 y 38. La escala puede estar entre 84 y 127. Un número de escala positivo indica cuántos dígitos signicativos de entre el total de la precisión se guardarán a la derecha de la coma decimal. Un número de escala 240
Capítulo 6. Programación de bases de datos negativo indica el número de dígitos que se redondearán del número a la izquierda de la coma. Tanto la precisión como la escala son opcionales, pero si hubiera escala, necesariamente tendría que haberse indicado la precisión. Por ejemplo, para crear una Variable que pueda albergar valores del 999999
hasta el 999999, bastacon denir una de tipo NUl\IBERl(6). Una variable de tipo NUMBER(6,2) aceptará valores de hasta seis cifras, pero las unidades y las decenas se redondearán, por ejemplo, el número 123456,44 se almacenará como 123500. En cambio, NUMBER(6,2) guardará cuatro dígitos a la izquierda de la. coma y redondeará los dígitos a la derecha de la coma dejando solo dos. Los subtipos INTEGER, IN T, y SMALLIN T también pueden usarse para denir números enteros con un máximo de 38 dígitos de precisión. - BINARYILOAT:
número de coma otante
de 32 bits de precisión. Los
valores positivosestán enel intervalo (1. 17549E-38, 3, 40282E+38). IBINARYDOUBLE: número de coma otante valores positivos están en el intervalo
de 64 bits de precisión. Los
(2, 22507485850720E308,1, 79769313486231E+308). - DATE: fecha y hora. La función TO_DA TE es muy útil para insertar datos tipo fecha o comparar dos fechas: TO_DA TE (31-01-2010 , DD-MM- YYYY). - TIMESTAMP: es una extensión del tipo DA TE nes de segundo.
IBLOB,CLOB,BFILE
que guarda además fraccio-
3: datosmuy grandesy desestructurados,por ejemplo
texto, imágenes, vídeos o datos espaciales. Pueden guardarse en tablespaces diferentes al resto de la tabla, a la
base de
o en el caso de los BFILE, en
cheros externos
datos.
IROWID: es el tipo de la pseudocolumna ROWID, una. columna interna de la tabla que almacena la dirección física de cada la. Mediante esta dirección se puede localizar el número de objeto, chero de datos, tablespace donde se encuentra y la posición dentro del bloque de datos respecto del chero de datos, formando accesos a
los datos
con todo a través
ello un valor único de la
localización de
en toda la base de datos. Los un valor
en esta
columna son
rapidísimos. Además de estos tipos, existen otros no soportados por el estándar SQL, que no
pueden usarsepara denir columnas, perosí en la programación de PL/ SQL, por ejemplo el tipo BOOLEAN,
ro), FALSE (falso)
que puede albergar los valores lógicos TR UE (verdade-
o NULL (nulo)
muy útiles en comparaciones.
3Oracle recomiendasustituir los datos tipo LONG, LONG RAW y RAW por estos tipo LOB. 241
Bases de
Datos
Basándose en estos tipos de datos, se podrá proceder a la definición de variables y constantes en los bloques DECLARE. y en la denición de los procedimientos y funciones. Sintaxis para
la definición
nombre_de_la_variable tipo_de_dato
de variables.
;
o
nombre_de_1a_variab1e tipo_de_dato
Sintaxis para nombre_de_la_constante CONSTANT
:= va1or_de_inicia1ización;
la definición tipo_de_dato :=
de constantes va1or_de_inicia1ización;
¿Sabías que . . . ?Los valores detipo cadenavan entrecomillados con comilla simple.
En PL/SQL, la asignación del valor a una variable o constante siempreva precedida de los signos :=. En la asignación u operación con valores, PL / SQL puede convertir implícitamente el tipo de dato para adecuarlo al tipo de la variable al que se asigna el valor o al tipo necesario en la operación. En el siguiente ejemplo, se puede hacer la resta gracias a la conversión implícita de los meses.En caso de que los mesestuvieran alguna letra, la opera.ción arroj aria un error.
DECLARE mesInicio CHAR(2) 6; := mesFin CHAR(2) := '10; mesesTranscurridos NUMBER(2);
BEGIN mesesTranscurridos := mesFin -meslnicio; END; /
Cuando se desee declararuna variable con el mismo tipo que otra variable conocida del mismo programa o el tipo de una columna de una tabla concreta. o incluso como una la. completa de una tabla, existen dos atributos que facilitan la denición y cor. ello el mantenimiento del programa PL /SQL. ya que la modicación del tipo original se extenderá. al resto de variables derivadas sin necesidad de tener que cambiar ninguna línea de código. Esos atributos son el % TYPE y el %ROWTYPE.
Capítulo 6. Programación de bases de datos
Atributos%TYPE y%ROWTYPE nombre_de_1a_variab1e nombre_de_1a_otra_variableZTYPE;
nombre_de_1a_variable esquema.tab1a.co1umna%TYPE; nombre_de_1a_variable_tipo_registro esquema.tab1a%TYPE;
En el caso de los procedimientos y funciones, las variables de su lista de paráme-
tros pueden ser de tres tipos: IN (parámetro de entrada), OUT (parámetro de salida) e IN OUT (parámetro de entrada y de salida). Si no se especica nada, el parámetro en cuestión sería IN. Hacer que un procedimiento tenga parámetros OUT es un truco muy bueno para conseguir que el procedimiento devuelva datos. Procedimiento con CREATE OR
REPLACE PROCEDURE
(sueldoMinimo OUT
parámetro de
salida
contratados.dameSue1doMinimo
contratados.nominas.sue1do%TYPE) AS
BEGIN sue1doMinimo:=1000;
END; /
¿Sabías que
. .. 7La
función SUBSTR( cadenaxzrgumento,
posi-
cióminicial, longitud_de_la_subcadena) sirve para extraer trozos de la cadenanrgumento, de modo que se devolverán un total de longitud_de_la_subcadena caracteres comenzando por los que van desde la posiciónjnicial. En caso de omitir el parámetro longitud_de_la-subcadena,la función devolverá la subcadena desde la posiciónjnicial hasta el nal de la cadencuzrgumento.
6.4. Operadores
y expresiones
Para relacionar variables y constantes entre sí. se usan los operadores, que combinándolas con aquéllas darán lugar a expresiones cuyos resultados serán el fundamento de la lógica de programación de la base de datos.
Las operaciones que se pueden realizar y el orden en el que se ejecutarían (en ausencia de paréntesis) son: 243
Bases de
Datos
ÍHHHHHIÍÍÍÍIÑHÜHÍÍÍÍÍÍÍ""""III"lI'||"'I||
Í¡l"""'HÑHMHIlÍl'll'l'l& Signo positivo negativo o *nmltiplicación
/ división
+suma resta
concatenación. Muy para útil varias juntar encaden una comparaciones: igual, menor, mayor, menor o igual .mayor o igual, distinto, distinto IS NULL, LIKE es nulo, como BETWEEN, IN
entre, en
negación lógica de un tipo boolean operador AND lógico entre tipos de dato boolean operador OR lógico entre tipos de dato boolean Teniendo en cuenta esto, se podría decir que las siguientes expresiones son todas verdaderas (TRUE):
(6+8)/2=7 6+8/2=1O 7 !=
10 O
0 IS NOT NULL
6a2='6"||a2 NULL
=TRUE
6a2 LIKE 6% 6 b NOT IN (b,a)
6 BETWEEN
2AND
IN (6,82) (3 = 5
O IS NULL =
FALSE
86a2
LIKE %24
) (3
a IN (b ,a) = 6
AND Nota
= 7
AND Nota
= 9AND
Nota = O DBMS_OUTPUT. WHEN Nota >= 5 DBMS_OUTPUT. AND Nota < 5 THEN WHEN Nota >= 6 PUT_LINE(Suspenso); DBMS_OUTPUT. AND Nota = 7 PUT_LINE(Suficiente); DBMS_OUTPUT. AND Nota = 9 PUT_LINE( DBMS_OUTPUT. AND Nota
THEN
Bien);
j
< 9 THEN
PUT_LINE(Notab1e);i END CASE;
AND Nota
99; contador +
1;
END LOOP;
DBMS_OUTPUT.PUT_LINE (E1
END; /
valor de
salida deberia
ser 100:
||
contador);
Bases de Datos
Ejemplo SET SERVERÜUTPUT
equivalente
de LOOP-EXIT WHEN-END LÜÜP
DN
DECLARE contador NUMBERCS); BEGIN contador :=1; LOOP IFcontador >99THEN EXIT; END IF; contador
:=
contador +
1;
END LOOP;
DBMS_0UTPUT.PUT_LINE (E1
valor
de salida
deberia
ser
100:
II
contador);
END; /
6.5.4.
WHILE..LOOP-END
LOOP
Esta sentenciaiterativa es otro tipo de bucle. Se diferencia del anterior en que la ejecución del programa tiene que evaluar la condiciónantes de ejecutar el bloque de sentencias
del bucle. Ejemplo
SET SERVERDUTPUT
de WHILE..LDDP-END
LOOP
ON
DECLARE contador NUMBER(3); BEGIN contador :=1; WHILE
contador <
contador
100 :=
LOOP
contador +
1;
END LOOP;
DBMS_OUTPUT.PUT_LINE (E1
END; /
valor
de salida
deberia
ser
100:
II
contador);
Capítulo 6. Programación de bases de
datos
Usando en vez de IN, la opción IN RE VERSE, se conseguiría que el bucle fuera contando de manera descendente, de mayor a menor. En el siguiente ejemplo, el contenido del bucle se ejecuta 100 veces, desde el 1 hasta el 100. Si el límite inferior del contador coincide con el superior (FOR z" IN
100..100 LOOP), el cuerpo del bucle se ejecutaríauna sola vez, otorgandoel valor 100 a la variable
i. Ejemplo de
SET SERVERÜUTPUT
FOR. .IN. .LDOP-END LODP
ON
DECLARE
contador NUMBER(3); BEGIN FOR contador
IN 1..100
LOÜP
DBMS_OUTPUT.PUT_LINE (El
valor del
contador es:
II
contador);
END LODP;
END; / Es posible interrumpir la ejecución del bucle y salir de él. Como en el caso de los bucles simples, pueden usarse en cualquier momento dentro de la programación del bucle FOR las cláusulas EXI Ty EXI TWHEN. Los bucles FOR son ideales para recorrer los registros resultantes de una consulta
(sentencia SELECT),ya seamediante eluso decursores5o directamente incluyendo la sentencia en la cláusula IN. Véase los ejemplos. Ejemplo de SET SERVEROUTPUT
FOR. .IN. ¿DOP-END LOÜP
con consulta
ON
DECLARE
BEGIN DBMS_0UTPUT.PUT_LINE (Los sueldos ordenados menor de mayor a );son: FOR i
IN (SELECT
sueldo
FROM contratadosmominas ORDER BY
sueldo) LÜDP
DBMS_0UTPUT.PUT_LINE (i.sue1do); END LDÜP;
END; / 5Un cursor es una estructura de datos concebida para recorrer el resultado de una consulta (sentencia SELECT). Mediante el uso de la instrucción FETCH nombre_del_cursorINTO lista_de_var¿ables, elregistro objeto de la consulta se extrae del cursor yse introduce dentro de una variable, listo para ser referenciado.
Bases de
Datos
Ejemplo
de FDR..IN..LOOP-END
LOOP con
cursor
SET SERVEROUTPUT DN
DECLARE vSue1do contratados.nominas.sue1do%TYPE; CURSOR curSueldo
IS
SELECT sueldo
ORDER BY
FROM contratados.nominas sueldo
DESC;
BEGIN OPEN curSue1do; DBMS_OUTPUT.PUT_LINE (Los FOR i
IN
1..10
diez sueldos
más altos
(de mayor a menor):);
LOOP
FETCH curSueldo
INTO vSue1do;
DBMS_OUTPUT.PUT_LINE (vSue1do); END LOOP; CLOSE cursueldo;
END; /
Pero, ¿qué pasaría si en el ejemplo del bucle FOR con cursor no hubiera más de 3 registros en la tabla contratadosnominas? Al intentar imprimir el dato del sueldo tras hacer el FE TCH cuando i fuese >= 4, aparecería repetido el valor del último sueldo recuperado, esto es debido a que, como la tabla no tiene más registros, el FE TCH no consigue volver a inicializar la variable vSueldo. Para evitar ese mal funcionamiento se podría optar por incluir una cláusula EXI T WHEN que obligara a abandonar el lazo al llegar al nal del cursor (atributo N OTF O UND del cursor). Ejemplo de
FOR..IN..LOOP-END LOOP con
cursor y
EXIT WHEN ___________¡
SET SERVEROUTPUT ON
DECLARE vSue1do contratados.nominas.sue1do%TYPE; CURSOR cursueldo
IS
SELECT sueldo
ORDER BY
FROM contratados.nominas sueldo
DESC;
BEGIN OPEN cursueldo; DBMS_OUTPUT.PUT_LINE (Los FOR i
IN 1..10
FETCH cursueldo
diez sueldos
LOOP INTD vsueldo;
EXIT WHEN curSue1do%NOTFOUND; DBMS_OUTPUT.PUT_LINE (vsueldo);
más altos
(de mayor
a menor):);
Capítulo 6. Programación de bases de datos
Gestión de
6.6.
errores
Algo imprescindible en toda programación es la codicación de una sección para interceptar posibles errores que pudieran ocurrir durante la ejecución del programa
(ya seanerrores conocidoso desconocidos,previstos oimprevistos), y en consecuencia, tomar las medidas oportunas o escribir un mensaje apropiado. Para ello se usa el bloque EX CEPTI ON con la cláusula WHEN THEN que sirve para ltrar el tipo de error
deseado.
Algunos de los errores predenidos que pueden interceptarse son: CASE_NOT.FOUND: ninguno
de datos con un usuario o password
de las
incorrectos.
condiciones de
WHEN en
la sentencia
1a estructura
CASE se
corresponde con el valor evaluado y no existe
cláusula
ELSE.
NOT_LOGGED_ON: un programa está intentando ejecutar algo en la base
CURSOR_ALREADY_OPEN:
el cursor
que intenta
de datos
sin haber
formali-
zado previamente la conexión. abrirse ya
está abierto.
NO_DATA_FOUND: una
INVALID_CURSOR: la operación que está intentando realizarse con el cursor no es válida, por ejemplo, porque quiera cerrarse un cursor que no se ha abierto previa-
tencia SELECT
sen-
IN T0 no
devuelve
ningún registro. TOO_MANY_ROWS: una tencia
SELECT
sen-
INTO devuelve
más de un registro.
mente.
INVALID_NUMBER o
VA-
LUE_ERROR: la una cadena
conversión de
a valor
numérico no
es
posible porque la cadena no representa un
valor numérico
válido.
VALUEERROR: error
ocurrido
en alguna operación aritmética, de conversión o truncado, por ejemplo, cuando se
intenta insertar
variable un
valor de
más tamaño.
LOGIN_DENIED: un está intentando
en una
acceder a
programa la base
TIMEOUT_ON_RESOURCE:
se ha acabado el tiempo que el SGBD puede esperar por algún recurso.
ZERODIVIDE: algún intenta hacer número entre
programa
una división
de un
cero.
OTHERS: es la opción por defecto. Interceptará todos los errores no tenidos en
nes WHEN de TI ON donde
cuenta en
las condicio-
la cláusula
EXCEP-
se encuentre.
251
Bases de
Datos
Ejemplo de SET SERVERDUTPUT
gestión de
errores
ON
DECLARE meslnicio CHAR(2) 6a; := mesFin CHAR(2) := 10; mesesTranscurridos NUMBER(2);
BEGIN mesesTranscurridos := mesFin -meslnicio; EXCEPTIDN WHEN INVALID_NUMBER THEN DBMS_OUTPUT.PUT_LINE(Error INVALID_NUMBER interceptado.); WHEN VALUE_ERRDR
THEN
DBMS_OUTPUT.PUT_LINE(Error VALUE_ERRORinterceptado.);
END; / Ejemplo de
CASE-WHEN..THEN-END CASE
SET SERVERÜUTPUT CREATE OR
sin
ELSE y
DN
REPLACE PROCEDURE
Nota(Calificacion VARCHAR)
BEGIN CASE Calificacion WHEN Suspenso THEN DBMS_0UTPUT.PUT_LINE(Nota >=0 y =5 y =6 y =7y =9 y 9999 codigoError textoError
NUMBER; VARCHAR2(64);
BEGIN SELECT MAX(sue1do) INTO sue1doMaximo FROM contratados.nominas; DBMS_0UTPUT.PUT_LINE(E1
sueldo
más alto
es:|Isue1doMaximo);
EXCEPTIDN WHEN ÜTHERS THEN codigoError textoError
:= SQLCDDE; := SUBSTR(SQLERRM, 1, 64);
DBMS_ÜUTPUT.PUT_LINE(E1código del error interceptado codigoError II y su texto: II textoError);
es:
II
La variable sueldoMazrimoestá denida como NUMBER(4) y solo admitirá valores entre -9999 y 9999. Si en la tabla de nóminashay algún empleadoque gane más de 9999 euros,la sentencia SELECT Max(sueldo) retornará un valor que no puede ser almacenadadentro de la variable sueldoMazimogenerándoseasí una excepción: El código del error interceptado es: -6502 y su texto: PL/SQL: error: precision de numero demasiado grande
6.7.
ÜRA-O6502:
Transacciones en scripts
Cuando en los programas además de consultar los objetos de la base de datos también se hacen modicaciones en los mismos,resulta de vital importancia conocer qué es una transacción. Es la herramienta que tienen las basesde datos para garantizar la integridad de los datos. Tal y como se introdujo en el capítulo 5, una transacciónes una serie de instruccionesde manipulaciónde datos (DML) que constituyenuna unidad de trabajo completa. Si el programa fallara en mitad de una transacción,debería ser capaz de deshacertodos los cambioshechoshasta ese momento en la transacciónpara dejar las tablas de la base de datos tal y como estaban originalmente. Por ejemplo, en cualquier operaciónde transferenciabancaria, una unidad completa de trabajo sería sumar el dinero a la cuenta destino y restarlo de la cuenta origen. Si despuésde sumar el dinero a la cuenta destino, la transacciónfallara a1 restarlo de la cuenta origen, el programa debería deshacer1a suma del dinero a la
Bases de
Datos
cuenta destino, de otro modo. el banco origen perdería el dinero de la transferencia.
Recuerda. A la operaciónde deshacer se laconoce como hacer ROLLBA CK, mientras que la operación de validar el total de la transacción es hacer COJMMI T.Explícitamente. se pueden escribir esos comandos (ROLLBA CK y
COMMI T)
en el programa para terminar la transacción, no obstante, debe
tenerse en cuenta que existen operaciones que implican un commit implícito. Tal es el caso de las sentencias de denición de datos (DDL), es decir, si en medio de una transacción se creara una nueva tabla. implícitamente se estaría haciendo un commit, con lo que quedarían validadas todos las operaciones anteriores y se pondría n a la transacción. Otras formas de hacer commit implícito es ejecutar un simple DISCONNECT para cerrar la conexión del usuario actual a la base de datos. o ejecutar EXIT o QUIT para salir de la sesión actual del SQL*Plus: en cambio, si en vez de sa.lir ordenadamente del SQL*Plus se abortara su sesión, la base de datos haría un rollback implícito.
Actividad 5.2: Para comprobar elcommit orollback implícitoen Oracle,crea con SQL*Plus una tabla y haz pruebas con ella: insértale un registro, valídalo con COMMI T, inserta otro y aborta la sesión del SQL*Plus, vuelve a abrir una sesión de SQL*Plus, comprueba que el número de registros que hay en la tabla. es solo uno. inserta otro, crea otra tabla (se hará commit implícito de la sesión), aborta la sesión de SQL*Plus y comprueba que esta vez sí que hay dos registros en la tabla original.
¿Sabías que . . . 7En muchos SGBD también esmuy usadolo quese conoce como TWO_PHASE-COMI\IIT. que es una forma de denir transacciones en dos partes. de modo que una parte pertenecería a una base de datos y otra a otra. Esto es muy corriente en sistemas que están distribuidos en varias bases de datos, por ejemplo. los datos de banca tradicionalmente se han encontrado almacenados en bases de datos residentes en máquinas HOST. a las que tiene que accedersedesde basesde datos localizadas en máquinas UNIX para hacer determinadas operaciones, las cuales solo podrán quedar validadas si las operaciones hechas en las bases de datos del HOST han tenido éxito, por lo que la transacción completa está dividida en dos partes, una en HOST y otra en UNIX, pero solo podrá ser validada si tuvo éxito en ambos entornos.
254
Capitulo 6. Programación de bases de datos A continuación se ofrece un ejemplo en el que se actualiza el sueldo a todos los empleados contratados. La actualización consiste en subirles el IPC, pero solo deberá validarse en el caso de que todas las actualizaciones hayan tenido éxito.
Ejemplo de SET SERVERÜUTPUT
subida de
sueldo
ON
DECLARE ipc NUMBER(2,1) 3.2; := codigoError NUMBER; textoError VARCHAR2(64);
BEGIN FOR i IN(SELECTnif sueldo, FROM contratados.nominas)
UPDATE contratados.nominas WHERE nif
LOOP
SET sueldo
=sueldo
+ sueldo
*ipc
/100
=i.nif;
END LÜOP; CÜMMIT; EXCEPTIDN WHEN ÜTHERS
THEN
codigoError textoError :=
:= SQLCDDE; SUBSTR(SQLERRM, 1,
64);
DBMS_0UTPUT.PUT_LINE(E1 código del error interceptado es: codigoError II ysu texto: II textoError);
II
ROLLBACK;
Otro ejemplo servirá para ilustrar el mismo caso anterior de subida de sueldo masiva, pero en esta ocasión, en vez de validar la transacción solo si todas las actualizaciones han
ido bien, se irá haciendo commit
cada mil sueldos modicados,
de modo que se minimice el espacio necesario en el tablespace de UNDO de la base de datos.
El consejo del buen administrador. .. En actualizaciones, inserciones o borrados masivos, hay que tener presente e]
espacio paradeshacer loscambios deque sedispone (espaciodel tablespacede UNDO).
255
13ases de [Datos
SET SERVERDUTPUT
ON
DECLARE ipc contador codigoError
textoError contadorErrores BEGIN FOR i IN(SELECT BEGIN
Ejemplo
de subida
de sueldo
cada 1000 actualizaciones
EXCEPTION WHEN DTHERS CÜNSTANT NUMBER(2,1) NUMBER(4) := 0; 1 J
:=
NUMBER;
FROM contratados.nominas)
LDOP
END;
UPDATE contratados.nominas SET
sueldo
"
WHERE nif
contador := VARCHAR2(64); --Se --en
IF
pone un bloque de excepción la sentencia de actualización
--el bucle continuaría contador >=
actualizando
aqui para evitar que en caso de error el programa se acabe, de este modo, el resto 3.2;
de sueldos
CDMMIT;
NUMBER(38) := textoError contador := codigoError
0:
END IF;
sueldo,
nif
DBMS_DUTPUT.PUT_LINE(Error enel UPDATE: II codigoError II
END LODP;
--
(que no hayanII textoError); contadorErrores
:=
sueldo +
sueldo *
ipc / 100
Capítulo 6. Programación de bases de datos
6.8. Las
secuencias
En Oracle, al contrario que en I\IySQL no existe el tipo AUTOJNCREh/IENT. En su lugar, hay un objeto especial llamado secuencia que sirve para obtener valores secuenciales autoincrementados.Es más manual que el campo AUTOJNCREMENT de MySQL, pero también es muchomás versátil, pudiendo ser utilizado en otros sitios aparte de la clave primaria de una t.ab1a. La sintaxis para la creación de estos objetos es:
CREATE SEQUENCE
secuencia
INCREMENT BY
n
START WITH
n
{MAX VALUE {MIN VALUE {CACHE NI
n I NÜMAXVALUE} NI NÜMINVALUE} NÜCACHE};
Por ejemplo:
CREATE SEQUENCE NÜMAXVALUE CACHE
NumFactura INCREMENT
BY 1 START WITH
20
40;
Con este comando se obtiene un objeto secuencia llamado N umFactura que comenzará en 20 y se incrementará de uno en uno sin valor máximo. Además, en la memoria caché del SGBD se almacenarán los 40 números siguientes por lo que el acceso a la secuencia será muy rápido. Se puede utilizar este tipo de objetos mediante una SELECT de forma muy sencilla haciendo uso de las funciones CURRVAL (valor actual) y NEXTVAL (valor
siguiente).
-para incrementar
la secuencia
y devolver
SELECT NumFactura.NEXTVAL
from DUAL;
--para devolver
de factura
el número
SELECT NumFactura.CURRVAL
el número
siguiente
actual
from DUAL;
257
Bases de
Datos
6.9. Prácticas
Resueltas
Práctica 6.1: Bajada desueldo un5 % Con motivo de una crisis económica se tiene que proceder a bajar el sueldo a todos los funcionarios un 5%. Implementar un procedimiento en PL-SQL de Oracle que, basándose en una tabla inventada, simule
cómo se haría esa disminución masiva
del
sueldo, para ello: 1. Crea el esquema funcionarios al que pertenecerán todos los objetos del problema, otorgarle permiso de DBA y abrir una sesión con él. solución
CREATE USER funcionarios IDENTIFIED BY passfun DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp; ALTER USER GRANT DBA
funcionarios QUÜTA
UNLIMITED ON
users;
TU funcionarios;
conn funcionarios/passfun
2. Crea la tabla nominas con un campo llamado sueldo tipo NUMBER(8,2) otro llamado nif tipo VARCHAR2(9).
y
solución
--La tabla
se creará
CREATE TABLE
en el
tablespace por
defecto
nominas
(nif VARCHAR2(9) sueldo NUMBER(8,2)
NOT NULL, NOT NULL);
3. Crea una tabla donde se registren los errores en la actualización del sueldo. La tabla se llamará erroresBajadaSue1do y tendrá tres campos: nif, codigoError y tezrtoError. solución
--La tabla se creará en el tablespace por CREATE TABLE erroresBajadaSue1do (nif VARCHAR2(9) NOT NULL,
defecto
codigoError NUMBER, textoError VARCHAR2(64));
4. Crea un paquete que se llame paq_bajada_sueldoque será el que contenga todas las funciones y procedimientos para llevar a cabo el problema. Dene una 258
Capítulo 6. Programación de bases de datos constante para el porcentaje de bajada de sueldo. El paquete
deberá tener
además:
a) Un procedimiento paq_bajada_sueldo.bajmsueldos queabrirá un cursor para recorrer todos los sueldos de los funcionarios y proceder a su disminución. Además, el procedimiento será capaz de ir rellenando la tabla erroresBajadaSuveldo conlos errores encontrados en la actualización del sueldo.
b) Una función llamada paq_bajada_sueldo.hubo-erroresjajandmsueldos que evalúe la tabla de errores y determine si ha habido algún error o no. La función tendrá como parámetro de salida un booleano que indicará si hubo algún error o no. solución
CREATE OR REPLACE PACKAGE paq_bajada_sue1do AS
PRDCEDURE baja_sue1dos; FUNCTIÜN hubo_errores_bajando_sue1dos --El porcentaje de bajada --una constante global al porcentaje CDNSTANT NUMBER END paq_bajada_sue1do;
RETURN BOOLEAN;
se define paquete := 5;
como
/
CREATE OR REPLACE PACKAGE BODY paq_bajada_sue1do PROCEDURE baja_sue1dos IS
AS
codigoE NUMBER; textoE VARCHAR2(64); BEGIN
FOR i
IN (SELECT
nif, sueldo
FROM nominas)
LOOP
BEGIN UPDATE nominas SET sueldo-i.sueldo -i.sueldo *porcentaje / 100 WHERE nif
=i.nif;
--Se pone
un bloque
--en caso
de error
--programa se --actualizando el
de excepción en la
acabe, de resto de
aqui para
sentencia de
este modo,
evitar que
actualización el
el bucle
continuaría
sueldos
EXCEPTION WHEN ÜTHERS THEN codigoE textoE :=
:= SQLCODE; SUBSTR(SQLERRM, 1,
64);
INSERT INTO erroresBajadaSue1do (nif, codigoError, VALUES (i.nif, codigoE, textoE);
END;
COMMIT; END LÜOP;
END baja_sue1dos;
textoError)
Bases
de Datos
FUNCTION hubo_errores_bajando_sue1dos res BDOLEAN
RETURN BÜOLEAN IS
:= FALSE;
numErrores
NUMBER;
BEGIN SELECT COUNT(*) into numErrores from erroresBajadaSue1do; IF
numErrores res
>O
THEN
:= TRUE;
END IF; RETURN res;
END hubo_errores_bajando_sue1dos; END paq_bajada_sueldo; /
5. Escribe cómo se invocaría la operativa completa: borrado del contenidode la tabla de errores,llamada al procedimientobajmsueldos y llamada a la función hubo-erroreabajandmsueldos. solución SET SERVERDUTPUT
DN
--Se borra el contenido antiguo de la tabla de errores DELETE FROM erroresBajadaSue1do; --Se invoca el procedimiento de bajada de sueldos
CALL paq_bajada_sueldo.baja_sueldos(); --Se
comprueba si
hubo algún
error
BEGIN
IF paq_bajada_sueldo.hubo_errores_bajando_sue1dos THEN --Hubo errores. Se presentan por pantalla. FOR iIN
(SELECT
*
FROMerroresBajadaSue1do) DBMS_0UTPUT PUT_LINE(Error
al
funcionario con NIF II i.nif y su texto: II i.textoError);
LOÜP actualizar
II.
el
sueldo
Código II
del
II
i.codigoError Il
END LOOP; END IF; END; /
0
Práctica 6.2: Procedimientos almacenados en MySQL Crea una tabla innodb en la BBDD 260
jardineria llamada ActualizacionLímíteCredito con tres
Capítulo 6. Programación de bases de datos campos: Fecha, CodigoCliente, Incremento. Crea un procedimiento almacenado para actualizar los límites de crédito de los clientes en un°7o del total pedido entre 2008 y 2010 registrando el incremento en la tabla creada. Al terminar, invoca al
procedimiento paraactualizar el límite de Crédito enun 15 (7o. solución CREATE TABLE
ActualizacionLimiteCredito(
Fecha DATETIME, CodigoC1iente ) engine=innodb;
INTEGER, Incremento
NUMERIC(15,2)
delimiter //
CREATEPROCEDURE IncrementaLimCredito
(IN porcentaje
INTEGER)
BEGIN
DECLARE Tota1Pedidos,Credito,Incremento DECLARE C1iente,Terminado
#cursor para
NUMERIC(15,2); INTEGER
DEFAULT O;
recorrer clientes
DECLARE curclientes
CURSOR FOR
SELECT Limitecredito,CodigoC1iente #A1 terminar
FROM Clientes;
de recorrerse,
se activará
DECLARE CONTINUE HANDLER FOR #Si ocurre
la variable
SQLSTATE O2000
alguna excepción
se producirá
DECLARE EXIT
HANDLER FOR
DECLARE EXIT
HANDLER FOR SQLEXCEPTION rollback;
terminado
SET Terminado
=1;
un rollback
NOT FOUND rollback;
OPEN curC1ientes; START TRANSACTION;
FETCH curC1ientes WHILE NOT
INTO Credito,C1iente;
#primer cliente
Terminado DO
SELECT SUM(Cantidad*PrecioUnidad)
INTO Tota1Pedidos
#Tota1 de
pedidos?
FROM Deta11ePedidos NATURAL JOIN Pedidos
BETWEEN 2008 IF Tota1Pedidos
WHERE YEAR(FechaPedido)
AND 2010 AND Pedidos.CodigoCliente=Cliente; IS NOT NULL THEN #Si hay pedidos
SET Incremento=Tota1Pedidos*Porcentaje/100; UPDATE Clientes
SET LimiteCredito=LimiteCredito+Incremento
WHERE CodigoC1iente=C1iente; INSERT INTO ActualizacionLimiteCredito
VALUES(now(),C1iente,Incremento);
END IF;
FETCH curC1ientes
INTO Credito,C1iente;
#siguiente cliente
END WHILE; COMMIT; END; // delimiter
;
call IncrementaLimCredito(15);
#Invocar al
procedimiento
261
Bases de
Datos
6.10. Prácticas
Práctica 6.3:
Propuestas
Bajada de sueldo v.2.0
Se vaa efectuar una segunda versión del procedimiento de bajada de sueldo. Consiste en bajar el sueldo a todos los funcionarios, esta vez en base a un determinado porcentaje en función de su escala salarial. Extrapolar los objetos de la actividad anterior para contemplar esta nueva situación, para ello: 1. Añade a la tabla funcionaosmominas un campo que represente la escala salarial. El campo se llamará grupo yserá. de tipo CHAR 2. Crea una función llamada dame_porcentaje_segun_escaladentro del paquete paq_bajada_sueldo queacepte como parámetro la escala salarial y devuelva el porcentaje de disminución a aplicar. La equivalencia entre uno y otro se hará mediante constantes globales al paquete: grupo A-10 7o, grupo B-8 (7o, grupo C-5%, grupo D-3%. 3. Modica la función baja_sueldos de la práctica anterior para que llame a la nueva damaporcentajasegun-escala para extraer el porcentaje. 4. Escribe cómo se invocaría la operativa completa: borrado del contenido de la tabla de errores, llamada al procedimiento baja_sueldos yllamada a la función hubmerrores-bajandmsueldos.
Práctica 6.4:
Bajada de sueldo v.3.0
Modica la función damaporcentajejegun_escala para que en vez de extraer la información a través de constantes, la extraiga de una tabla creada a tal efecto. La tabla deberá tener dos campos, uno con la escala (A,B. ..) yotro campo con el porcentaje a descontar. Sustituye el último punto de la práctica anterior por un procedimiento que también esté almacenado en el paquete funcionarios. paq_bajada_sueldo.
262
Capítulo 6. Programación de bases de
Práctica
datos
Facturación Sedesea codicar un programa en PL-SQL para
poder lanzar el proceso de facturación de la BBDD jardineria. crear tres tablas con los siguientes comandos DDL:
Para ello, se deberán
solución
CREATE TABLE Facturas
(
Codigocliente integer, Baselmponible Numeric(15,2), IVA Numeric(15,2), Total Numeric(15,2),
CodigoFactura INTEGER); CREATE TABLE
Comisiones(
CodigoEmp1eado integer, Comision Numeric(15,2),
CodigoFactura integer); CREATE TABLE
AsientoContab1e(
Codigocliente integer, DEBE Numeric(15,2), HABER Numeric(15,2));
A continuación programar, en un paquete llamado Facturación: 1. Una función llamada UltimaFactura que devuelva el último código de factura generado. Si no hay ningún registro en la tabla Facturas, devolverá un 1. 2. Procedimiento Facturar: Este procedimiento grabará un registro en la tabla de facturas por cada uno de los pedidos de la BBDD. Al mismo tiempo guardará en la tabla de comisiones una comisión del 5 % del total del pedido para. el emplea.do que haya generado la factura. 3. Procedimiento GenerarContabilidad: Este procedimiento guardará en la tabla AsientoContable un registro por cada grupo de facturas, almacenando en el campo DEBE la suma de las facturas que han sido generadas.
263
Bases de
6.11.
Datos
Resumen
Los conceptos clave de este capítulo son los siguientes: Las aplicaciones de base de datos pueden ser de tres tipos distintos: codicada
en el lado del servidor, modelocliente/ servidory modelo en tres niveles. Las sentencias SQL se pueden ejecutar de forma estática o dinámica. Una sentencia estática debe precompilarse, vincularse y compilarse antes de ser ejecutada en la aplicación. Una sentencia dinámica. es creada en el momento de la ejecución.
El lenguaje PL/SQL fue desarrollado por Oracle para añadir más potencia de ejecución a las sentencias SQL, con él es posible denir variables, estructuras de control de ujo y toma de decisiones. . .
crear
Las partes de un programa PL/ SQL sonel bloque DECLARE, el bloque BEGIN..END y el subbloque EX CEPTION.
Los distintos programas quepueden crearsecon el uso del lenguaje PL / SQL son: procedimientos, funciones, bloques anónimos y triggers. Los procedimientos y funciones pueden estar contenidos dentro de otros objetos más grandes llamados paquetes, los cuales están compuestos por la cabecera y el cuerpo. SQL*Plus es la herramienta que proporciona Oracle para conectarse a la base de datos por línea de comandos y ejecutar todo tipo de comandos de base de datos, incluidos programas PL /SQL.
En PL/SQL hay datos de tipo carácter, numérico,fecha, booleanos,y datos grandes entre otros. Además existen muchas funciones para gestionarlos, aunque aquí solo se ha tratado la SUBS TR. Existen también, operadores para hacer operaciones aritméticas, comparaciones y concatenaciones. Las estructuras de control sirven para controlar el ujo del programa, la toma de decisiones y programar las acciones en consecuencia.Aquí se han estudiado el IF, CASE, LOOP, WHILE y FOR. Los tres últimos son bucles, y son muy útiles para recorrer cursores. El control de excepciones es un bloque opcional dentro de la programación pero muy recomendable. Sirve para interceptar los errores de ejecución del programa y tomar las medidas oportunas en consecuencia, de otro modo el programa terminaría abrupta y descontroladamente.
264
Capítulo 6. Programación de bases de datos
Test de repaso
6.12.
1. ¿Qué tipo de variable tendría que denirse para albergar el dato 3.2?
a) CHAR(3)
6. Si la variable qué valor tendrá la
b) NU1\IBER(2,1)
penso
c) NUMBERU(3)
a) NULL
d) a) y b)
b) FALSE
c) TRUE
2. ¿Qué es el ROWID? a) Es una la
especial de la tabla
b) Es una función ideal para generar las automáticamente
c) Es una columna interna que almacena la dirección física
de cada
la
d) Es un tipo de excepciónmuy utilizada 3. ¿Cómo
se dene
suspenso es TR UE, expresión NOT sus-
una constante?
7. Si la variable gallo es Wikir-ikí, qué valor resultará de la función
REPLACE(gallo, i,
o):
a) o b) oooooooo c) kokoroko d )kokorokí
a) nombre_de_]a_constante CONSTANT tipo_de_dato := valor;
8. ¿Qué función se usa para escribir mensajes por pantalla en los programas
b) nombre-de.la-constante tipo_de_dato :=
PL/SQL?
valor CONSTANT
c) CONSTANT
a) PUT_LINE
nombre_de_la_const.ante ti-
po_de_dato := valor:
c) DB1\ISOUTPUT.PUT_LINE
d) nombre_de_1a_constante CONSTANT tipo_de_dato := valor 4. La expresión 5
=5
b) DBMS_OUTPUT.PUTLINE
es:
a) FALSE
d) PUTLINE 9. ¿Qué variable de entorno del SQL*Plus hay que activar para que la función de la pregunta 8 escriba por la salida estándard?
b) TRUE
a) La función escribe siempre 5. El
extracto de
denición
dame_sueldo() RETURN NUMBER(6) IS corresponde
a
b) SEVER_OUTPUT c) SERVEROUTPUT
a) Un procedimiento
b) Una función
a's'esp'¿'q'9q'9qr'e'sn'
C) Un disparador d )Un
paquete
265
Bases de
Datos
6.13. Comprueba
tu aprendizaje ¿Qué es una transacción?
1. Dene qué es un cursor, para 15. qué sirve y distintas formas de re-
correrlo. 16'
2. Dene
¿En qué consiste la transaccional implícita?
los distintos bloques de que
validación
¿Para qué se usael atributo se compone un programa PL/SQL. 17'
%TYPE?
¿y %ROWTYPE?
3. ¿Para qué usan se paquetes? los 18Pon ejemplos
con todos los operadores de comparación.
4. Dene qué esun disparador y los tipos distintos que hay. Pon un ejem-
Ventajas del uso del R0 WID.
plo. 19'
5. Enuncia las diferencias entre el
¿Dónde se puede usar la cláusula 20' EX]
SQL dinámico y el estático.
T WHEN?
¿Para qué sirve la 6. ¿Qué son los datos tipo LOB? ¿Pa- 21'
ra qué sirven? D
tabla de sistema
UAL?
¿Cuál es 7. Enumera los tiposde datostipo 22'
el signo comodín en las comparaciones entre datos de tipo cadena?, ¿cómo se usa?
carácter.
8. Enumera los tipos y subtipos de da-
¿Qué hace la instrucción
tos tiponumérico. 23'
en el contexto de
FETCH
los cursores?
9. Enumera los tipos de datos tipo fe-
Cha_ 24.
10. Ventajas
El atributo NOTFOUND, ¿de dónde es, para qué es y cómo se del
CASE frente
al usa?
IF..ELSIF alyrevés.
2_.Explica qué
conversión es la implícita de tipos de datos.
o ¿Qué signica 11. Ventajas del LOOP frente al WHI-
LE yal revés.
que en una base de datos todos los objetos tienen que estar identicados
unívocamente?
Expon las diferencias entre procedimientos y funciones.
26. 12. ¿Qué error intercepta
el evento
NO_DATA_FOUND?
13. ¿Cuándo
se producirá
un 27.
T00_MANY_RO WS?
14. Explica cómo se usan las funcio- 28. nes especiales SQLCODE y SQLERRM.
266
Explica los distintos tipos de aplicaciones de base de datos que existen.
CAPÍTULO 7
BBDD distribuidas Contenidos Qbjet
¡VOS
É BBDD YSGBD distribuidos "S?
Reconocer lautilidad de las ba-
g Colnponentes de unaBBDD ses distribuida
de datos distribuidas
Conocer
,.
cómo realizar consul-
., tas
Tecnicas de fragmentacion
Consultas distribuidas Transacciones distribuidas
bre bases
de datos
W Conocer
el funcionamiento
de
las transacciones distribuidas . .
Describir
.
.
, .
las distintas politicas
distribuidas C101-
En este capítulo se explican las peculiaridades de las consultas en bases de datos distribuidas, se realizan operaciones básicaspara que e] alumno aprecie Ia complejidad de este tipo de sistemas ya1 mismo tiempo su sencilla implantación, gracias a las propias herramientas proporcionadas por 10s SGBD.
267
Bases de
Datos
7.1. BBDD
y SGBD
distribuidos
Cuando una base de datos está controlada por más de un servidor se dice que está distribuida.
Estos servidores
están interconectados
mediante una
red de
te-
lecomunicaciones y los SGBD proporcionan mecanismos para poder consultar la información independientemente del servidor y la ubicación de los datos. Así por ejemplo, una consulta con una join entre la tabla de pedidos y la de clientes puede estar accediendo
a dos
servidores con
dos instancias
de bases
de datos
distintas.
Incluso, si las tablas están particionadas es posible que la misma consulta esté accediendo a más de dos servidores. Esto proporciona una especie de balanceo de carga para que la información pueda ser accedida lo más rápidamente posible. De esta manera se consiguen los siguientes benecios: 1. Más rapidez en el acceso a los datos y capacidad de almacenamiento. Al aumentar el número de ordenadores donde se depositan los datos, aumenta la capacidad de computación, y por tanto, la capacidad de búsqueda de la información.
2. Acceso más exible. El número de usuarios conectados que puede mantener el sistema se incrementa al haber más capacidad de cómputo y, gracias a la red de la BBDD distribuida, los usuarios pueden acceder desde más ubicaciones. 3. Escalabilidad. Distribuyendo una base de datos en distintas ubicaciones se permite incrementar de forma muy sencilla los recursos en cualquier momento para acomodar el sistema a las demandas de los usuarios ylas aplicaciones. 4. Fiabilidad y cierta capacidad de tolerancia a fallos. Realizando una buena política de fragmentación de la base de datos es posible conseguir que aunque algún nodo de la base de datos distribuida sufra algún percance, el resto del sistema siga funcionando con normalidad. Por otro lado, no todo son benecios, no hay que perder de vista que estos sistemas son muy costosos de implementar no solo por la duplicidad de recursos en términos de red y servidores, también por la dicultad de la administración de los datos ubicados en distintas localizaciones y porque se introduce un elemento caótico como la dependencia de las redes de comunicaciones para el correcto funcionamiento del intercambio de los datos. Ademas, la atomicidad de las operaciones es más complicada de conseguir por lo que la gestión transaccional tiene dicultades añadidas como se comentará en
la sección
7.1.1. Componentes
7.3.2.
de una
BBDD distribuida
Para poder crear una base de datos distribuida componentes. 268
hay que tener los siguientes
Capítulo 7. BBDD distribuidas 1. Sistemas gestores con capacidades distribuidas o un SGBD distribuido
en
sí mismo.
2. Un conjunto de bases de datos locales a cada uno de los servidores que albergarán la BBDD. 3. Una red de comunicaciones, generalmente basada en el protocolo TCP-IP para poder aprovechar las infraestructuras existentes. 4. Enlaces entre las BBDD locales. Los SGBD deben ser capaces de establecer enlaces entre las diversas bases de datos locales, de tal manera que cualquier consulta pueda ser redirigida al servidor donde está la BBDD local. 5. Un diccionario de datos global que indique en qué ubicación está cada uno de los datos que componen la BBDD distribuida.
BASE DE
DATOS DISTRIBUIDA
BBDD Ventas A BBDD
Marketing B
Red de Comunicaciones
1_
select sun (Total) from Pedidoseventas: insert into Balances values . . . update Pronocionrï-llarketinq.. Cosmic:
Enlace A-C
Nace B-C
BBDD Contabilidad
C
Figura 7.1: Componentes de una base de datos distribuida. Dependiendo del tipo de componentes elegidos en la formación de una base de datos distribuida se pueden tener: 1. BBDD distribuidas homogéneas: En estas el SGBD utilizado es el mismo para todas las BBDD locales. Generalmente, el SGBD proporciona. la tecnología para el enlace de las distintas BBDD locales. 2. BBDD distribuidas heterogéneas: Las bases de datos están distribuidas independientemente del SGBD utilizado como local. En este caso, las aplicaciones 269
Bases de
Datos
que consultan la base de datos distribuida juegan un papel fundamental como media.dor.
7.2. Técnicas
de fragmentación
El contenido de una tabla puede separarse en varios fragmentos que contendrán suciente información como para poder reconstruir la tabla original en caso de que sea necesario. Cada fragmento se encontrará en un nodo diferente, pero esta distribución a través de distintos nodos no duplica los registros, solo existirá una copia de cada elemento, por lo que, al no haber replicación. disminuye el coste de almacenamiento en detrimento de la disponibilidad y abilidad de los datos en caso de caída de algún nodo. La fragmentación puede ser horizontal o vertical y se puede aplicar sucesiva y alternativamente sobre
la misma
tabla:
Horizontal: los fragmentos son subconjuntos de una tabla y se denen a través de una operación de selección. La tabla original se reconstruye en base a una operación de unión de los fragmentos componentes. Vertical: los fragmentos son subconjuntos de los atributos con sus valores. Para poder recomponer la tabla original, cada fragmento debe incluir la clave primaria de la
Mixta: se
tabla.
mezclan las
dos técnicas
anteriores.
Para que una fragmentación sea correcta, esta debe cumplir con las siguientes reglas: IDebe ser completa, es decir, cada elemento de la tabla debe estar en algún fragmento. n Debe ser reconstruible, lo cual implica que debe ser posible conseguir una tabla completa a partir de la combinación de todos los fragmentos. ILos fragmentos deben ser disjuntos, esto signica que si la fragmentación es horizontal, un elemento que esté en un fragmento concreto no puede estar en ningún otro fragmento más que en aquél. En el caso de fragmentación vertical, puesto que es necesarioque se repitan las claves primarias, esta condición solo se tiene que cumplir para el conjunto de atributos que no son clave primaria. 270
Capítulo 7. BBDD distribuidas
7.3. Consultas
distribuidas
Algunos SGBD manejan el concepto de sistemas de bases de datos distribuidas de forma que cualquier aplicación que haga consultas al gestor pueda acceder a su base de datos de forma local y además, acceder a datos de bases de datos remotas. Oracle basa su concepto de basesde datos distribuidas en un objeto llamado DA-
TABASE LINK (Enlace abase dedatos). LosDATABASE LINKs son unaconexión unidireccional entre una basede datos (cliente) y otra (servidor). Oracle puede soportar bases de datos homogéneas y heterogéneas. Para soportar sistemas heterogéneos es necesario que Oracle pueda acceder a los datos como si estuviese accediendo a otra base de datos Oracle, por lo que cuenta con agentes llamados Transparent Gateways (Pasarelas transparentes). Estos agentes son interfaces que proveen todo lo necesario para poder recuperar, insertar, actualizar o borrar información de forma transparente para las aplicaciones que se ejecutan desde Oracle. 7.3.1. DB
Links
Un database link es una conexión entre bases de datos. Es unidireccional por lo que se crea desde una base de datos que quiere referenciar a otra. Para que un usuario pueda crear estos DB Links son necesarios los siguientes privilegios:
n CREATE DATABASE LINK (En local). uCREATE
PUBLIC DATABASE
LINK (En local).
ICREATE
SESSION (En remoto).
Es posible consultar los DB Links en las vistas USER_DB_LIN KS, ALL_DB-LINKS y DBA_DB_LINKS dependiendo del usuario con el que se esté conectado al SGBD. Existen también los enlaces compartidos o SHARED DB LINKS. La diferencia es que múltiples procesos clientes pueden usar el enlace compartido simultáneamente. Para crear un DB link es necesario que exista la conexión entre las bases de datos a través de Oracle Net Services, por lo que se debe crear una entrada en el tnsnames.ora de la base de datos a la que se quiere referenciar. Dentro de la denición se puede elegir si la conexión es dedicada o compartida, y no es lo mismo denir que la conexión que va a usar el DB link sea compartida a crear un DB link compartido. A continuación, se muestra un ejemplo de creación de un DB link para conectar una BBDD en versión 10gR2 con una BBDD 11gR2. La entrada en el chero
tnsnames.ora es:
271
Bases de
Datos
t11r2_u = (DESCRIPTION = (ADDRESS=(pnorocor = TCP)(HOST =192.168.1.129)(PORT (CDNNECT_DATA = (SERVER=DEDICATED) (SID =t11r2) ) )
=1521))
t11r2_u en este caso, es el nombre de la entrada para la conexión remota al servidor con
dirección IP
192.168.1129.
Una vez agregada la entrada al chero se puede utilizar la herramienta tnsping para comprobar que hay conectividad:
C:\Documents and
Settings\usuario>tnsping t11r2_u
TNS Ping Utility for Copyright (c)
32-bit Windows:
1997, 2007,
Oracle. A11
Version 10.2.0.4.0
-Production
on 05-MAY-2011 23:23:47
rights reserved.
Archivos de parámetros utilizados: C:\orac1e\product\10.2.0\db_1\network\admin\sq1net.ora Adaptador TNSNAMBS utilizado para resolver el alias Attempting to contact (DESCRIPTIDN = (ADDRESS =(PROTOCOL = TCP)(HOST =192.168.1.129) (PORT =1521)) (CONNECT_DATA =(SERVER =DEDICATED) (SID = t11r2))) Realizado correctamente (40 mseg)
Una vez creada la entrada del chero tnsnames yprobada, se pueden crear DB links públicos o privados, y es posible, además, usar un usuario especíco para la conexión en
la base
de datos
a referenciar.
Para crear
un DB
Link desde
el usuario
local al usuario remoto, se ejecutaría el siguiente comando:
SQL> CREATEDATABASE LINK tj_11r2 2 CONNECT TD usuario IDENTIFIED BY password 3USING t11r2_u; Enlace con
la base
de datos
creado.
Al ejecutar el comando anterior, se crea un objeto llamado tj_11r2 que usará la entrada tnsnames t11r2_u para conectarse a la BBDD remota. Después, para probar la conexión, se utiliza el nombre del enlace (tj_11r2) para ejecutar una consulta: 272
Capítulo 7. BBDD distribuidas
SQL> select
*from
dua1@tj_11r2;
También se pueden crear DB Links públicos que pueden ser usados por cualquier usuario, y además, sean usados por usuarios que también existan en la BBDD que se referencia:
SQL> CREATEPUBLIC DATABASELINK tj_11r2 Enlace con
la base
de datos
7.3.2. Ejecución
2USING
t11r2_u;
creado.
de consultas
distribuidas
Las consultas distribuidas son consultas que recuperan información de 2 o más nodos en un entorno de bases de datos distribuido. No es lo mismo que hablar de consultas remotas, las consultas remotas son consultas que se realizan a. una o más tablas de una base de datos remota. Es importante diferenciar entre estos dos tipos de consultas las distribuidas y remotas porque internamente son diferentes. Un ejemplo de una consulta remota es el siguiente:
SQL> select 2 from
count(8) pacientes0t11r2;
T11R2 es un DB LINK público creado a una BBDD 11gR2 en Linux, y la base de datos cliente está en 10gR2 en Windows. La ejecución de la consulta anterior prueba que existen conexión entre versiones diferentes. Esto se logra a través de Oracle Net
Services.
En una consulta distribuida puede darse el caso de que existan relaciones fragmentadas. Esto se ilustra en el ejemplo siguiente: 273
Bases de
Datos
Primero se muestra la tabla PACIENTES, fragmentada en dos bases de datos en distintos servidores y con la siguiente descripción:
SQL> desc pacientes
NOT NULL NUMBER VARCHAR2(100) HABITACION SQL) desc pacientes@t11r2
NOT NULL NUMBER VARCHAR2(100) FECHA_ENTRADA DATE
Ahora, se consulta un paciente con ID 1, su habitación y fecha de ingreso: SQL> select 2 from
1.id, 1.habitacion, pacientes 1, pacientesOt11r2 r where 1.id=r.id and 1.id=1
r.fecha_entrada
ID HABITACION FECHA_EN 10 26/04/11
Esta consulta
extrae información
de dos
bases de
datos ubicadas
en servidores
dis-
tintos, por tanto, es distribuida. Además, desde la base de datos servidor se puede ver lo siguiente en la vista VSSESSION: SQL> select sid, seria1#, 2 from vSsession 3 where username=TJ;
username, program,
event, machine
SID SERIAL# USERNAME PROGRAM 0RACLE.EXE SQL*Net
,server
MACHINE message from
client VILLEGUILLO
DEDICATED
Esto demuestra que cada vez que se realice una consulta a una base de datos remota, se abre una sesión conserver processdedicado si se dene en el tnsnamesora que sea dedicada. Dejar las conexiones abiertas puede llegar a ser un problema: si se Va a crear un proceso que lanza cientos de consultas yque va a muchos nodos en un 274
Capítulo 7. BBDD distribuidas entorno de bases de datos distribuido, y que además este proceso lo van a ejecutar muchas sesiones, en diferentes nodos, es seguro que se generará una explosión de conexiones abiertas, incrementando de forma radical el consumo de recursos. Para evitar esta explosión de conexiones abiertas, se puede ejecutar el cierre de los DB Links ejecutando: SQL> alter
session close
database link
t11r2;
Sesión modificada. --Esto cierra SQL) select 2 from 3* where no rows
la sesión en la base de datos servidor: sid, seria1#, username, program, event, machine, vSsession username=TJ
server
selected
7.4. Transacciones
distribuidas
Una transacción distribuida es una transacción que contiene una o más sentencia y que se realiza en 2 o más nodos dentro de un entorno de base de datos distribuido. También existen las transacciones remotas, y al igual que las consultas remotas, son transacciones con una o más sentencias que se realizan en una base de datos remota.
Los elementos que pueden intervenir a tener en cuenta en una transación distribuida se pueden ver en la siguiente gura: oo:-ina-or o-a COHHIT point sic: Coordinador Local
\
r
BD Servidor 1 no
.i
BD Cliente
\R Servidor 2
BD Servidor
n
Figura 7.2: Transacción distribuida. En esta gura se observan los siguientes elementos: BD Cliente Es un nodo que actúa como cliente donde se referencia la transacción distribuida. Esta BD tiene los DB links que conectan con el resto. 275
Bases de
Datos
BD Servidor Son las bases de datos que contienen información que va a ser modicada por la transacción distribuida. Coordinador Local Es un nodo que debe referenciar datos sobre otros nodos para completar su parte de la transacción distribuida. Coordinador Global
El nodo donde se origina la transacción distribuida.
Commit Point Site Es el nodo que inicia las operaciones de COMMIT o ROLLBACK con las instrucciones dadas por el coordinador global. Este punto se dene con el parámetro COMMITPOINTSTRENGTH, en un entorno homogéneo todas las BBDD tienen un parámetro como este. La base de datos con el valor mayor en este parámetro se convierte en COMMIT POINT SITE. 7.4.1. TWO-PHASE
COMMIT
Un SGBD debe garantizar la atomicidad en la información de sus basesde datos y en los entornos con basesde datos distribuidas también. Para que esto seproduzca, se usael mecanismo de TWO-PHASE COMMIT o proceso de COIÑIMIT en entornos distribuidos. Su ejecución es un poco más complicada. Se divide en 3 partes: Fase de preparación Es la primera fase y consiste en que el coordinador global informa a todos los nodos que van que se va a realizar CORIMIT o ROLLBACK. Esto se traduce en que cada nodo se prepara para una finalización de la transacción
distribuida. Para.
ello realiza
2 tareas:
1. Almacena la información de Redologs. 2. Genera un bloqueo distribuido sobre la tabla para prevenir lecturas. Cuando se realizan estas 2 operaciones el nodo dice que está comprometido para la nalización de la transacción distribuida. Fase de commit Después de que todos los nodos se comprometen a realizar la transacción, se realizan los siguientes pasos: 1. El coordinador global avisa al COMMIT POINT realizar el 2. El
SITE de que se va a
COMMIT.
COMMIT POINT
3. El COMMIT POINT
SITE realiza
el COMMIT.
SITE indica al coordinador global que hizo el COM-
MIT.
4. Los coordinadores globales ylocales envían mensajes a todos los nodos para hacer COMMIT de la transacción. 276
Capítulo 7. BBDD distribuidas 5. Cada nodo realiza su parte local del COMMIT de la transacción distribuida y quitan el bloqueo distribuido generado. 6. Todos los nodos notican a
al coordinador global que han realizado el
COMMIT.
Fase de olvido Cuando todos notican al COMMIT POINT SITE lizado el COMMIT, se realizan las siguientes tareas: 1. El
COMMIT POINT
SITE borra
la información
acerca del
que se ha rea-
estado de
la
transacción distribuida.
2. El COMMIT POINT
SITE informa al coordinador global que ha borrado
ese estado.
3. El coordinador global borra la información de la transacción distribuida.
7.4.2. Ejemplo
de transacción
distribuida
Con la tabla pacientes ubicada de forma fragmentada en dos bases de datos, se realizan las siguientes operaciones: select * from pacientes; ID NOMBRE
HABITACION
1Pacientel select * from pacientes@t11r2 ID NOMBRE 1 Pacientel
26/O4/11
update pacientes set nombre=P1 where id=1; 1fila
actualizada.
SQL> update pacientes@t11r2 2 set nombre=P1 3* where id=1 1 fila
actualizada.
SQL> update pacientes 2 set habitacion=10 3 where id=2; 1fila
actualizada.
277
Bases de
Datos
Antes de realizar commit, se puede observar qué está sucediendo, las transacciones creadas y los bloqueos generados en la BD servidor que en este caso es t11r2:
SQL> select saddr, sid, serial#, username, 2 from vssession 3where username =TJ; SADDR SID
SERIAL# USERNAME
37EFD738 28 STEFACCC 29 0RACLE.EXE
program, machine
PROGRAM sqlplusccaar (TNS
V1-V3) caar VILLEGUILLO
SQL> select SES_ADDR,START_TIME,STATUS,XID 2from vstransaction; SES_ADDR START_TIME 37EFACCC 05/O6/11 16:03:43 ACTIVE
0600000062010000
SQL> select 1 2 from vslock 3vhere sid=29; ADDR
KADDR LMDDE
37ACA524 37ACA55O 00579434 00579464 29 36908094 369C8OD4
REQUEST CTIME 29 AE TM 29 TX
BLOCK
13704 393216
Se observa que la transacción existe, que la transacción es generada por la sesión de la conexión de la BD cliente y que tiene un bloqueo exclusivo sobre la
(LMODE=3 rowX) sobre la tabla PACIENTES: SQL> select object_id 2 from dba_objects 3 where object_name=PACIENTES; DBJECT_ID
A continuación, también se muestran sesiones, transacciones y bloqueos en la BD Cliente:
SQL> select saddr, sid, 2 from vssession 3* where username=TJ
278
seria1#, username,
program
Capítulo 7. BBDD distribuidas SADDR SID
SERIAL# USERNAME
30F42BFC 1773 SQL> select 2* from
PROGRAM
TJ sq1p1us.exe
SES,ADDR,START_TIME,STATUS,XID vstransaction
SES_ADDR START_TIME 30F42BFC 05/06/11
16:02:46 ACTIVE
08002EO0F818000O
SQL> select t 2 from vslock 3 where sid=146; ADDR KADDR
LMODE REQUEST
2F5C67E4 2F5C67FC 146 TM 2F616204 2F616228
146 TX
CTIME
45926 524334 6392
También se puede observar la información de los DB links abiertos en la sesión con la vista VSDBLINK. Esta consulta se ejecuta en la propia sesión que tiene la transacción:
SQL> desc vsdblink
DB_LINK vmcmazuzs) OHNERJD NUMBER LOGGED_0N VARCHAR2(3) HETEROGENEOUS VARCHAR2 PROTÜCDL VARCHAR2(6) opmLcunsons NUMBER IN_TR.ANSACTION vacunas) UPDATE_SENT VARCHAR2(3) COMHIT_POINT_STRENGTH NUHBER
(3)
SQL> select # 2 from vsdblink; DB_LINK OWNER_ID
LOG HET PRDTOC ÜPEN_CURSORS IN_ UPD CÜMIT_POINT_STRENGTH 38 YES N0 UNKN
Una vez realizado el COMMIT, desaparecen las transacciones y los bloqueos. Y la vista
de estado
de DB
links abiertos
en la
sesión muestra:
SQL) select t 2 from vSdb1ink; DB_LINK 0HNER_ID
LOG HET PROTOC 0PEN_CURSORS IN_ UPD COMMIT_POINT_STRENGTH 38 YES ND UNKN
279
Bases de
Datos
Cuando una transacción falla en alguno de los puntos la transacción se convierte en transacción dudosa. Puede pasar cuando algún nodo se cae, la conexión de red en la comunicación de algún nodo falla o cualquier error de software no controlado. El proceso RECO es el encargado de resolver las transacciones dudosas automáticamente y hasta que REC O no pueda resolver la transacción dudosa, el dato queda bloqueado para lectura o escritura.
7.5. Optimización
de consultas
sobre bases de da-
tos distribuidas Cuando se realiza una consulta distribuida, hay que tener en cuenta los siguientes parámetros: OPEN_LINKS Congura la cantidad de máxima de conexiones abiertas concurrentemente para bases de datos remotas por cada sesión. COMMIT_POINT_STRENGTH Especica una transacción.
El nodo
con el
el valor de commit point site en valor n1ás
alto se
transforma en
el commit
point site.
Lo primero a tener en cuenta de optimización de consultas distribuidas son las estadísticas, tanto de las estadísticas de sistemas, como las de todos los segmentos que puedan intervenir en la consulta. Se ha de recordar que es transmisión de información por red, por lo que es importante que se la mínima cantidad. Para optimizar consultas distribuidas en Oracle se suelen utilizar dos técnicas. Usar consultas derivadas para disminuir la cantidad de información que se quiere recuperar a través de la red y la utilización de los hints NQMERGE yDRIVINGLSI TE.
7.5.1. Optimización Las consultas
derivadas o
mediante consultas IN LINE
VIE WS se
derivadas
convierten en
una estructura
en
memoria. Utilizando estas construcciones, se puede disminuir la cantidad de información que se desearecuperar. Por ejemplo, la consulta: select l.id,
from pacientes
l.habitacion, r.fecha_entrada
1,
pacientes@t11r2 r where 1.id=r.id and 1.id=1
280
Capítulo 7. BBDD distribuidas se puede optimizar utilizando
select 1.id,
una tabla derivada de la siguiente manera:
l.habitacion, r.fecha_entrada
from pacientes 1, (select id, fecha_entreda from pacientes@t11r2 where id=1)
r
where 1.id=r.id and 1.id=1
De esta manera, se recupera tan solo la información concerniente a un único paciente (el paciente con id=1), en lugar de todos los pacientes de la base de datos remota.
7.5.2. Optimización
mediante hints
En entornos distribuidos es más común que el optimizador pueda no ser del todo bueno con los planes de ejecución, así que el uso de Hints (y su constante control) puede ser útil en mucho casos. Con los Hints se pueden controlar cómo realizar una consulta. Por ejemplo, NO_MERGE evita los posibles no usos de consultas derivadas porque el optimizador puede determinar cambiar una tabla derivada por una join. Con DRIVINGSITE se dene en qué nodo se va a desarrollar la consulta, de tal manera que la BD donde se mezcle la información sea la que va a recibir menor cantidad de información a través de la red. Ejemplos de los cambios que producen estos Hints:
Ejecución sin hint:
SQL> select
2 from
1.id, 1.habitacion,
pacientes 1,
3(select 4where
r.fecha_entrada
id, fecha_entrada l.id=r.id and ID HABITACION
from pacientes@t11r2
where id=1)
r
l.id=1 FECHA_EN
10 26/04/11
281
Bases
de Datos
Ejecución con el hint
NOJIERGE:
SQL> select /*+ N0_MERGE(r) */ l.id, l.habitacion, 2 from pacientes 1, pacientes@t11r2 r 3
where ID
1.id=r.id
and
HABITACION
1.id=1;
FECHA_EN
10 26/04/11
Ejecución con el hint DRIVINCLSITE: SQL> select 2
3
/*+
DRIVING_SITB(r)
1.id,
1.habitacion,
from pacientes where ID
1.id=r.id
1, pacientes@t11r2 r and
HABITACION
1.id=1;
FECHA_EN
10 26/O4/11
282
*/ r.fecha_entrada
r.fecha_entrada
Capítulo 7. BBDD distribuidas
7.6. Prácticas
Práctica 7.1:
Resueltas
Configuración deBBDD distribuidas
Prepara dos máquinas virtuales con Oracle y congúralas dando a una má.quina la dirección 192.168.1.101 y a la otra la dirección 192.168.1.102. A continuación: 1. Edita el chero tnsnamesora que está ubicado en el directorio \SORACLE_ HOME/network/ admin de ambas máquinas para agregar dos entradas que permitan enlazar Editar el
las dos instancias.
chero tnsnames
en cada una de las máquinas
introduciendo el
siguiente código:
JARDIN= (DESCRIPTIDN (ADDRESS -(PROTOCOL = TCP)(HOST =192.168.1.101)(PDRT (CÜNNECT_DATA =(SERVER =DEDICATED) (SERVICE_NAME=jardin) ) ) JARDIN2 = (nsscnrprron = (ADDRESS=(PRDTOCOL =TCP)(HOST =192.168.1.102)(PDRT (CONNECT_DATA =(SERVER =DEDICATED) (SERVICE_NAME=jardin) ) )
2. Comprueba que haya conectividad tns entre las dos instancias. En la máquina 192.168.] .101 ycon el usuario oracle, introducir tnsping jardin2 yen la máquina 192.168.] .102 introducir el comando: tnsping jardin
el comando:
3. Crea enlaces entre cada máquina. necesarios para poder hacer consultas desde una máquina a la otra con el esquemajardineria. Desde la máquina 192. 168.1.101 a la 102 el enlace se llamará contabilidad, mientras que de la 102 a la 101 se llamará facturacion. Primero hay que dar al usuario jardineria permisos de CREATE LINK en cada una de las máquinas: sqlplus / as sysdba Después, ejecutamos el comando SQL: grant create database link to jardineria; Finalmente, podemos ejecutar los comandos de creación de los enlaces. Desde la máquina 1921631.101:
283
Bases de
Da tos
CREATE DATABASE LINK contabilidad CONNECT T0jardineria IDENTIFIED USING jardin2;
Yen
la máquina
192.J68.1.102:
CREATE DATABASE LINK facturacion\\ CONNECT T0jardineria IDENTIFIED USING jardin;\\ }
Práctica 7.2:
BY jardineria
BY jardineria\\
Trabajando con BBDD distribuidas
Realiza los siguientes ejercicios para aprender cómo trabajar con DB Links: 1. Edita la tabla. empleados en la. máquina 192.168.1101 para añadir un campo que indique qué porcentaje de comisión se lleva cada empleado de los pedidos que gestiona y pon a todos los empleados un 5 C78 de comisión. Desde la máquina 1921631.101,
ejecutar:
alter table empleados addPorcentajeComision number(5,2); update empleados set PorcentajeComision.
=5;
2. Crea una tabla llamada Comisiones en la máquina 192.168.1102 con los campos CodigoEmpleado, CodigoPedido, TotalPedido yComision. No es posible ejecutar comandos DDL a. través de DB Links, por ejecutamos el siguiente comando DDL:
create table
Comisiones(
CodigoEmp1eado integer, CodigoPedido integer, TotalPedido number(15,2), Comision number(7,2) );
284
tanto, desde la máquina 1921681.102,
Capítulo 7. BBDD distribuidas 3. Rellena la tabla de comisiones con los datos de los pedidos mediante una consulta distribuida a 1a tabla de pedidos en la máquina 192.168.1.101. Hay que ejecutar la siguiente sentencia
de tipo insert-select:
INSERT into comisionesccontabilidad SELECT CodigoEmp1eado, CodigoPedido, Tota1Pedido, Tota1PedidotPorcentajeComision/100 FROM Empleados inner join Clientes on Empleados.CodigoEmp1eado=C1ientes.CodigoEmp1eadoRepVentas natural (select Codigocliente,CodigoPedido,sum(Cantidad*PrecioUnidad) Tota1Pedido from Pedidos natural join Deta11ePedidos group by Codigocliente,CodigoPedido) Totales
join as
4. Crea un trigger en la tabla Empleados que mantenga actualizada la tabla de comisiones cuando se modica el porcentaje de comisión de la misma. Modica la comisión de un empleado y comprueba que, efectivamente se ha modicado. En la máquina 192.168.1.101
se ejecuta el siguiente
código:
create or replace trigger Tímpleadocomisiones after update of PorcentajeComision on empleados
for each
row
begin update comisionescontabilidad set comision = totalpedidotznev.Porcentajecomision/100 where CodigoEmp1eado=:o1d.CodigoEmp1eado; end; /
5. Modica el Empleado con código 31 estableciendo un porcentaje de comisión del 10 70 y verica que efectivamente, se han modicado las comisiones: update empleados set porcentajecomision=10 where codigoempleado=31; select *fmm comisiones@contabilidad where codigoempleado=31;
285
Bases de
Datos
7.7. Prácticas Práctica 7.3:
propuestas Fragmentación horizontalde tablas
Una empresa de telefonía está implementando un sistema de recepción de incidencias. Estas incidencias se recogerán desde un único número de asistencia telefónica y se almacenarán en una base de datos distribuida. Esta tendrá 3 nodos Oracle. Se va. a fragmentar una tabla llamada incidencias de forma horizontal, de tal manera que las provincias cuyo nombre comience por las letras de la A a la C estén en el nodo O, de la D a la M en el nodo 1 y de la O a la Z en el nodo 2. De esta manera estarán equilibradas en número de registros por el número de población. Se pide: 1. Crear
la estructura
de las tablas en
los tres nodos. La
tabla incidencia
tendrá los
campos IdIncidencia, Fecha, Código de Cliente, Texto de la incidencia, Pro-
vincia y Estado (abierta /cerrada). 2. Crear
un enlace
de base de datos
entre cada
uno de
los servidores.
3. Ejecutar una consulta distribuida que devuelva todos los registros de la tabla incidencia.
4. Crear un procedimiento en el nodo 1 que inserte una incidencia en el nodo que le corresponda según la letra de la provincia. 5. Crear un procedimiento que borre una incidencia del nodo adecuado basándose en el campo de provincia. A continuación
se desea fragmentar la
tabla a través del campo IdIncídencia y
el operador Mod (Resto de la división entera). La. operaciónIdIncidencia Mod 3 indicará en qué nodo debe estar almacenado el registro (0,12). Para asignar el IdIncidencia sin duplicados se va a crear una secuencia (objeto sequence) para que antes de insertar un registro se consulte y se inserte en el nodo adecuado. Se pide: 1. Crea la secuencia con el comando create sequence en el nodo 0. 2. Crea una función llamada SiguienteIncidencia que devuelva el siguiente número de secuencia.
3. Ejecuta la consulta select siguienteIncidenciaO Qnodoü desde los otros dos nodos.
286
Capítulo 7. BBDD distribuidas
Práctica 7.4:
Fragmentación vertical
Una aplicación comercial de marketing tiene una tabla de clientes muy grande con los siguientes campos: ICampos principales: Código de Cliente, Nombre, Apellidol, identicador de facebook, dirección, código postal y país.
Apellido2, email,
ICampos secundarios: película favorita 1, pelicula favorita 2, hobbie 1, hobbie 2, otros intereses y comentarios. Se pretende fragmentar la tabla utilizando nodos, para lo cual se pide:
una base de datos distribuida de dos
1. Realizar la fragmentación de la tabla separando los campos principales y creándolos en un nodo y los campos secundarios (gustos y aciones) creándolos en otro
nodo.
2. Crear un procedimiento que muestre por pantalla la información de un cliente determinado. El procedimiento recibirá como parámetro el código de cliente y consultará los dos nodos para mostrar toda la información. 3. Crear un prodecimiento que elimine un cliente de la base de datos.
287
Bases de
Datos
Práctica 7.5:
Consultas distribuidas
Sigue los siguientes pasos para ejecutar consultas distribuidas en Oracle: 1.
Genera una copia de la máquina virtual con tu servidor Oracle, cámbiale la dirección IP y asegúrate de que tienen conectividad entre ambas.
.Localiza el chero tnsnames de tu servidor oracle original y agrega una entrada para que se pueda crear un enlace a la máquina virtual copiada. .Prueba con la utilidad tnsping original a la copiada.
que es posible conectar de la máquina virtual
Crea un usuario llamado Userl en la instacia oracle de la máquina virtual original con los permisos CREATE DATABASE LINK y CREATE PUBLIC DATABASE LINK y el rol RESOURCE. .Crea un usuario llamado User2 en la instancia oracle de la máquina virtual copiada con permiso CREATE SESSION y el rol RESOURCE. .Crea una tabla llamada Cliente(Código, Nombre, Dirección) en la máquina virtual original en el esquema Userl e inserta dos registros. .Crea una tabla llamada l\Iascotas(Código, Tipo, Raza, Nombre) en la máquina virtual copiada en el esquema User2 e inserta dos mascotas para cada Cliente. .Ejecuta una. consulta que devuelva un listado con las mascotas de cada cliente incluyendo la dirección y el nombre del cliente. .Crea ahora la misma consulta, pero utilizando una tabla derivada para traer solamente las mascotas del primer cliente. 10.
288
Ejecuta la consulta anterior utilizando los hints NO_MERGE y DRIVING_SITE comparando su plan de ejecución con el comando explain plan.
Capítulo 7. BBDD distribuidas
7.8.
Resumen
Los conceptos clave de este capítulo son los siguientes: Una base de datos está controlada por más de un servidor se dice que está distribuida.
Este tipo de organización proporciona más rapidez y exibilidad en el acceso y más capacidad de almacenamiento. Proporciona también escalabilidad y abilidad.
Un sistema de BBDD distribuidas requiere una red de comunicacionesy enlaces entre bases de datos locales a cada servidor (DBLINKS). Se clasican
en:
o Homogéneas: todas las BBDD locales usan el mismo SGBD. o Heterogéneas: las BBDD locales pueden tener distinto SGBD. Se puede fragmentar una BBDD distribuida verticalmente, donde los fragmentos son conjuntos de campos de una tabla u horizontalmente donde los fragmentos son conjuntos de registros. Una consulta distribuida es aquella que consulta múltiples tablas ubicadas en
distintas ubicaciones.Se puedehacer usode nombreTabla@servidor para hacer referencia a
una tabla
en un servidor enlazado
con un
DBLINK.
El comando DML create database link se utiliza para crear enlaces a través de un enlace
declarado en
el chero
tnsnamesora.
Con la utilidad tnsping se puedecomprobar si hay conectividad con una BBDD remota.
Una transacción
distribuida utiliza
el método
TWO PHASE
COMMIT a
través de un coordinador local, un coordinador global y un Commit Point Site.
En Oracle se puede consultar la vista vSsession para ver las sesiones abiertas con servidores
remotos.
Se puede eliminar una conexión abierta con el comando alter session close database link.
Es posible utilizar hints en Oracle para parametrizar cómo se va a guiar la ejecución de la consulta.
289
Bases de
Datos
7.9. Test
de repaso 5. Las
1. Un
DBLink es
fases de
)
a Son
a) Una conexión unidireccional entre una BBDD cliente y una servidora b) Una
conexión bidireccional
entre dos
TWO PHASE
COMMIT
dos fases
b Son la fase de preparación, commit y olvido c Son
4fases
BBDD locales
c) Una
conexión bidireccional
entre dos
BBDD distribuidas
d) Ninguna
)
de las anteriores
2. Es posible tener heterogéneas
BBDD Distribuidas
a) Si, a través de DB Links comunes b) Si, a t.ravés de software que hace las BBDD compatibles
c) No, es imposiblecomunicar dosBBDD con distintos SGBD
d) Sí, a través de agentesllamados transparent gateways
3. Con
muchos DBLinks
puede ocurrir
) d) Son las fases de commit. y rollback 6. Un
hint es
a) Cambiar
que:
un mecanismo
para
la forma en la que una consulta
funciona
a) Mejora el rendimiento del servidor
b) No hay problemacon lasconexiones, puesto que se cierran solas
c) Es posible quese quedendemasiadas cone-
b) Ejecutar
una consulta distribuida
c) Ejecutar
una consulta local
d) Ninguna
de las anteriores
xiones abiertas
7. ¿Cuál de estas sentencias es
d) Hay problemas deseguridad 4. TWO
PHASE COMMIT
la correc-
ta? es
a) CREATE
DATA BASE LINK;
a) Un enlace doblea BBDD
b) CREATE DB LINK:
b) Un mecanismo para realizar transacciones
c) CREATE DATABASE LINK;
locales
d) Ninguna
de las anteriores
c) Un mecanismo pararealizar transacciones distribuidas
d) Un mecanismo pararealizar transacciones distribuidas y locales
8. Para
comprobar si
entre BBDD
hay conectividad
remotas
a) Se usa el comando tnsnames b) Se usa el comando using c) Se usa el comando dblink
290
d) Ninguna 9. Open
de las anteriores
links congura:
a) El valor de commit en una transacción b) Máximo
número de conexiones abiertas
c) Tiempo máximo de ejecución d) Ninguna de las anteriores
7.10.
.¿Qué es una base de datos distri-
11.
buida?
.Enumera los tipos de BBDD distribuidas según el SGBD que se utiliza.
Comprueba tu
. Enumera
las características
12.
Capítulo 7. BBDD distribuidas
13.
aprendizaje de una
BBDD distribuida.
¿Cómo se ejecuta una consulta dis-
.¿Qué es la escalabilidad?
14.
tribuida?
. ¿Qué signica que
una BBDD
es
¿En qué consiste un transparent gateway o pasarela transparente?
able?
. Enumera los 5elementos que tiene una BBDD
distribuida.
1.5.
¿Qué es un DBLINK?
16.
¿Qué requisitos debe tener un usuario para poder crear un DB Link?
. ¿Por qué se fragmenta una BBDD distribuida?
.Dene
¿Qué almacena el chero
los siguientes conceptos: 17.
IFragmentación
tnsna-
mes.ora?
vertical
n Fragmentación horizontal - Fragmentación mixta
¿Qué diferencia hay entre un dblink público y uno privado?
18.
Escribe el comando DDL para crear
.¿Qué reglas hay para que una fragmentación sea 10.
DBLINKS.
correcta?
19.
¿Para qué sirve lautilidad tnsping?
¿Qué diferencia hay entre una consulta distribuida y una remota?
¿Cómo secierra una conexión a una base de 20.
datos remota?
Describe el
funcionamiento de
transacción distribuida
mecanismo TWO
a través
una del
PHASE COM-
MIT. 21.
Enumera los hints que tiene Oracle para optimizar las consultas distribuidas.
CAPÍTULO 8
BBDD Objeto-Relacionales Contenidos Objetivos W Las
bases de datos
ÑIdenticar
Objeto -Relacionales
_
Los atr1butos
las características
de
las bases de datos objeto rela-
_cionales
multlvaluados
Crear tipos de datos ob jeto, sus
Las Colecciones
atributos v métodos
Tablas anidadas
Crear tablas de objetos v tablas
Tipos de Objetos de Los identicaciones de Objeto
columnas objeto tipo Crear tlpos de datos co1ecc1on
Métodos en BBDD_OR Realizar .Modicar
Herencxa en BBDD-OR
DML con BBDD-OR_ dad
Consultas la información
_
_
alma-
_
cenada manteniendo la 1ntegr1y consistencia de los datos
En este capítulo se explica cómo se gestiona la información almacenada en bases de datos objeto-relacionales, evaluando yutilizando las posibilidades que proporciona el sistema gestor.
293
Bases de
Datos
8.1. Las
Bases de datos ob jetos-relacionales
A medida que el mundo de la informática va generando modelos del mundo real para crear aplicaciones, van apareciendo nuevas necesidades parapoder dar solución a estos problemas. A lo largo del libro se ha estudia.do queun modelo de datos cuenta con las siguientes características: IEntidades IAtributos
en cada
una de
estas entidades
IRelaciones entre los atributos y entre las entidades n Directrices 0 reglas entre las entidades y los atributos Las BBDD pueden modelar todas estas características. En un modelo más complejo incluso se puede incluir acciones, operaciones o procedimientos entre entidades y atributos. Se puede decir que las Bases de Datos Objeto-Relacional (BBDDOR) son una extensión del modelo relacional que además, rompe ciertas reglas, tanto en el modelo relacional como en el paradigma de la orientación a objetos, pero seguro que aporta otra solución al modelado de información. A lo largo de este capítulo se podrá observar con ejemplos la diferencia de un modelo entidad relación E-R convencional y un modelo de datos objeto relacional O-R.
La principal diferencia radica en la existencia de tipos. Estos tipos se pueden construir mediante sentencias DDL y serán la base del desarrollo de BBDD O-R. Por tanto, para denir el modelo objeto-relacional habría que añadir a las características
básicas deun modelo E/ R: entidades, atributos,relaciones yreglas y los tipos. 8.2. Los
atributos multivaluados
Los atributos multivaluados, según lo estudiado, rompen directamente la primera formal normal. Con este tipo de atributo básicamente se expresa todo lo contrario a la IFN. Se dice, que un atributo puede tener más de un valor, pero son del mismo tipo. Existen autores, como Ted Codd, que hablan de la primera forma normal solo como atomicidad para evitar que el valor no se pueda dividir conceptualmente, por tanto se enfoca más no en que se pueda tener varios valores del mismo tipo, sino que ese valor en sí sea indivisible conceptualmente. En todo caso, este tipo de atributo amplia enormemente el modelo de cara a modelar en mundo real. Con los gestores BBDDO-R se puede lograr obtener atributos con múltiples valores. 294
Capítulo 8. BBDD Objeto-Relacionadas 8.2. 1. Las
colecciones
Al realizar el paso al modelo relacional, los atributos se convierten en columnas. Podemos representar los atributos multivaluados en la BBDD a través de las colecciones. Una colección es un grupo de elementos del mismo tipo. En Oracle se usan los tipos para crear colecciones. Supóngase que se deseaguardar los nombres de los hijos de los empleados. Para esto se puede usar una. colección. La relación puede tener las siguientes ocurrencias:
III Apellidos m
(luis-Insular (Jose pedro) Carlos» Lo primero sería crear la colección: SQL> create 2
type colec_hijos
as varray(10)
of varchar2(30);
/
Tipo creado.
En esta instrucción se ha denido un nuevo tipo de datos llamado coleahijos que tendrán como máximo grupos de 10 valores y además, que serán de máximo 30 caracteres. A
SQL> create 2 (id 3 nombre
4apellido 5 hijos 6
continuación, se
crea la tabla:
table empleado number, varchar2(30),
varchar2(30), co1ec_hijos)
/
Tabla creada.
Con esto se expresaque la columna de hijos será una colección de tipo colecjnjos ya denida. Es posible insertar datos tal y como se hace en cualquier otra tabla con el comando INSERT, lo único a tener en cuenta es que hay que decirle que el tipo de la siguiente forma:
Bases de
Datos
insert into
empleado values
(2,Esperanza,Jiménez,co1ec_hijos(josé,carlos,pedro));
Obsérvese quees necesarioespecicar el tipo colecJzijos para que el SGBD realice las comprobaciones necesarias. Para consultar, también se puede utilizar SELECT: SQL> select
*
2from
empleado; ID NOMBRE
APELLIDO HIJOS
1 Francisco
Pérez COLEC_HIJOS(luis,
ursu1a)
2 Esperanza
Jiménez CULEC_HIJOS(josé,carlos,pedro)
De esta manera se ha introducido una restricción al mundo real: que un empleado no puede tener más de 10 hijos.
Actividad 8.1: Dene un tipo tabla llamadoAsignaturas. Después, crea una tabla llamada ciclosFownativos que pueda tener varias asignaturas, de tal manera que asignaturas sea una tabla anida.da.
8.2.2. Tablas
anidadas
50 o 60 años atrás, existía la posibilidad de que 10 hijos fuese un parámetro corto en algunas ocasiones yfuese posible ampliarlo hasta 20 o incluso 50, pero siempre tendría una restricción. Existe la posibilidad de no limitar la cantidad de Valores dentro del atributo multivaluado, deniendo lo que se denomina un tipo tabla, en la que solo se especica el tipo de datos que se desea para ese atributo. Utilizando el mismo ejemplo se redene el tipo hijos de la siguiente forma: SQL> create 2/
Tipo creado.
296
type tab1a_hijos
as table
of varchar2(30);
Capítulo 8. BBDD Objeto-Relacionadas Y al igual que con el ejemplo anterior, se crea la tabla basándola en el tipo tabla_hijos: SQL> create table empleado 2 (id number, nombre varchar2(30),
apellido varchar2(30), hijos tabla_hijos) nested table
hijos store
as t_hijos
/ Tabla creada.
Ahora, tablajzíjos, ya no es un tipo colección . es un tipo tabla. Los tipo tabla utilizan para su almacenamiento una tabla anidada o nested table. Dicho de otro modo, la columna hijos es del tipo tablmhijos almacenada sobre un tipo de segmento especial llamado tabla anidada. A diferencia de la colección, seha denido esta tabla especial que permitirá almacenar en el atributo multivaluado tantos valores como sea necesario.
¿Sabías que .. . ?En Oracle, sepuede consultar la tabladba_objects para examinar los objetos que se han creado en el SGBD. También se puede consultar mediante dba_segments laestructura de almacenamiento que utiliza Oracle para almacenar el objeto:
SQL> select 2 from
3* where
object_name, object_type,
status
dba_objects
object_name like
%HIJDZ
0BJECT_NAME OBJECT_TYPE
TABLA_HIJOS T_HIJOS SQL> select segment_name, segment_type 2 from dba_segments
3* where
segment_name like
ZHIJOS%
SEGMENT_NAME SEGMENT_TYPE T_HIJDS NESTED
TABLE
297
Bases de
Datos
Para consultar,
insertar, borrar
o actualizar
información en
tablas anidadas,
se
realiza igual que con las colecciones. Con estos tipos se abren nuevas posibilidades al construir modelos de datos: es posible denir tipos de datos personalizados y muy completos, con comportamientos y características autónomas.
El modelo pasa de tener dos dimensiones (las y columnas), a tres dimensiones (las de tipos, las y columnas). La cantidad de colecciones tipo y tablas tipo, dependerá únicamente de la destreza que se posea y de la habilidad para aplicar estas ventajosas características a cada uno de los modelos que representan el mundo que se desea modelar.
8.2.3. Tipos
de Objeto
Aunque no es objetivo del capítulo explicar la teoría de la programación orientada
a objetos (POO), se recordará queuna clasees comoel molde o un patrón para la fabricación de los objetos. Yvisto de una
desde el otro sentido, un objeto es una instancia
clase.
En Oracle, se pueden crear clases a través de los tipos, más concretamente de los tipos de objetos, usando la sentencia create type as object. Gracias a este tipo objeto se puede agregar información a la base de datos anidando la. información en única la en
tantos niveles
como se desee.
Para ilustrar el funcionamiento de esta estructura recurrimos a la siguiente rela-
ción:
CLIENTES ( Id, Nombre,Dirección, Apellido,Provincia, Población, Móvil) Teléfon Se puede armar que todos sus atributos son atómicos y que cumple, al menos, la primera forma normal. Una instancia de esa relación cliente (Modelo Relacional), podría ser: [EI Apellido Mayor.20 Madrid
Madrid 912823722
600000001
Suponiendo que este Cliente no cuenta con un móvil, sino que cuenta con 3 móviles, el móvil de su trabajo, su móvil particular de una compañía que le da una buena tarifa. por la mañana, y otro móvil de una compañía que le da buenos descuentos en SMS. Se podría pensar en conservar el mismo modelo de datos de forma elegante, y no con una entidad cliente que contenga hasta 10 atributos llamados 298
Capítulo 8. BBDD Objeto-Relacionales movill, movi12,...movil10 estas soluciones).
(no es muy inusual encontrarse con BBDD que tienen
Ajustándose únicamente al modelo E-R la solución óptima sería crear una Relación que sea cliente-móvil, yque contenga el ID del chente y su número de móvil.
Por emplo: ej
É 600000001 1 1 600000002 1 600000003
Las BBDD orientadas a objeto brindan la posibilidad de crear un tipo de objeto de la siguiente forma: SQL> create
or replace
2 (tipo
type telefono
as object
varchar2(30),
3 numero
number)
4/
Se puede observar que cada objeto telefono tendrá dos atributos, el tipo de teléfono móvil y el número. A continuación, se crea una tabla tipo llamada listin basada en el objeto tipo para añadir la funcionalidad de múltiples valores: SQL> create 2
or replace
type listin
as table
/
Tipo creado.
Finalmente se
SQL> create
crea la
tabla Clientes:
table clientes
2 (id number, 3 nombre varchar2(10).
4
apellido varchar2(10), direccion varchar2(30),
poblacion varchar2(30), telefonos listin)
5
nested table 10 /
telefonos store
as te1_tab
of telefono
Bases de
Datos
A partir de aquí, se pueden ejecutar sentencias DML en la tabla clientes haciendo valer la deseada ampliación con relación al modelo de datos tradicional:
SQL> insert
into clientes
2 values
3(1,Paco,Pérez,mayor 20,madrid,madrid, 41istin(te1efono(fijo,911234567). 5 te1efono(movi1 persona1,60000O001), 6 te1efono(movi1 empresa ,600000002))) 7
/
1fila
creada.
SQL> commit; Confirmación terminada.
Si se consulta la
SQL> select ID NOMRE
*from
tabla se
obtiene:
cliente;
APELLIDO DIRECCION POBLACION PROVINCIATELEFONOS(TIPO, NUMRO) LISTIN(TELEFONO(fijo, 911234567), TELEFON0(movi1 personal, 600000001), TELEFON0(movi1 empresa, 60000O0O2))
Se puede observar cómo se anida la información dentro de la propia la. De esta manera, 1 cliente puede tener múltiples teléfonos y cada teléfono, varios atributos. Esto es la representación real de las relaciones anidadas.
8.3. Los
identicadores de
objeto
Oracle trabaja con OID (Object Identiers). Un OID es un identicador para mejorar la búsqueda de la información. Cuando se crea una columna cuyo tipo es un tipo de objeto, en lugar de almacenarse todos los datos del objeto en la propia columna de la tabla, el SGBD solo almacena un identicador, que será la dirección de una la en una tabla auxiliar que el SGBD para almacenar los datos del objeto. Es decir, internamente, el SGBD solo almacena un número de 16-Bytes que le sirve como referencia para ir a buscar la información de la tabla objeto si es necesario. Es posible ver estos OIDs con una pseudo-columna llamada objectJd. Para ver el valor del objeto, se puede utilizar objectwalue. Se ilustra en el siguiente ejemplo: 300
Capítulo 8. BBDD Objeto-Relacíonales
SQL> create type coche as object 2 3
(marca varchar(20), modelo varchar(20));
4/
Tipo
creado.
SQL> create Tabla
table
vehiculos
into
vehiculos
coche;
creada.
SQL> insert 1 fila
of
values
(coche(seat,ibiza));
creada.
SQL> select
object_id,
object_va1ue from vehiculos;
DBJECT_ID
0BJECT_VALUE(MARCA, MODELO)
A5440089F85FFA3OE040007FOIOOOFDE
COCHE(seat,
ibiza)
La ventaja de usar OIDs es que la informacióndel objeto está almacenadaen otro sitio distinto de la propia la, por tanto, en caso de no usar este objeto, el SGBD no tendrá que accedera toda esta informaciónreduciendoel tiempo de respuesta. La desventajaesque en el momentode realizar consultassobrelas tablas, el SGBD debe realizar accesosa bloquesextras de información,consumiendomás CPU.
8.4.
Los
métodos
Al igual que en la POO cada clase dene el comportamiento de sus objetos a través de métodos,en las BBDD-OR también es posiblecrear métodospara los tipo objeto. Se pueden denir funciones o procedimientosmiembros, cuyas accionesmodelan el comportamientode un tipo de objeto. Estas funcioneso procedimientosque pertenecena un tipo de objeto se denominan métodos. Para ilustrar como usar funciones miembro en tipos de objetos, se expone el siguienteejemplo: si se deseamodelar un objeto triángulo para almacenar sus ca301
Bases de
Datos
racterísticas (la base y la altura), y almacenar en la BBDD cientos de triángulos pudiendo calcular el área de cada triángulo, se podría. crear el siguiente esquema: SQL> create 2 (base
or replace number,
3 altura
number,
4member
function area
5
type tipo_triangu1o
as object
return number)
/
Tipo creado /
Se puede observar que dentro del tipo de objeto tipoiriangulo
se ha denido la
cabecera deuna función llamada área (método o member functionarea). A continuación se creará la denición tipo create 01" replacetype body: SQL> create 2 member
or replace
type body
function area
del método área a través del cuerpo del
tipo_triangu1o as
return number
is
a number;
begin :=a (base*a1tura)/2; return a; end; end;
Cuerpo del
tipo creado.
Una vez creado el tipo triángulo, triángulos: SQL> create 2 (id
table triangulos
number,
3 triangulo
tipo_triangulo);
Tabla creada.
SQL> desc
triangulos
TRIANGULD TIPD_TRIANGULD
302
se puede crear una tabla para
almacenar
Capítulo 8. BBDD Objeto-Relacionales Y después, se insertan datos dentro la tabla, tal ycomo se ha expuesto previamente:
SQL> insert 1 fila
into triangulos
values (1,tipo_triangu1o(5,5));
into triangulos
values (2,tipo_triangulo(10,10));
creada.
SQL> insert 1fila
creada.
SQL> commit; Confirmación terminada.
SQL> select * from triangulos; ID TRIANGULÜ(BASE, ALTURA) 1TIPÜ_TRIANGULÜ(5, 2 TIPD_TRIANGULÜ(10,
5) 10)
Finalmente. se puede declarar un pequeño bloque anónimo en PL-SQL para recorrer la tabla
e invocar
a1 método
area:
SQL> declare t tipo_triangu1o; begin for i in (selectfrom * triangulos) loop t:=i.triangu1o;
dbms_output.put_1ine(E1 triangulo dbms_output.put_1ine(Con base: dbms_output.put_1ine(Y altura: dbms_output.put_line(tiene un
con id:||i.id); IIt.base); IIt.altura); area de: ||t.area);
end loop; end; /
El triangulo Con base: Yaltura: tiene un
con id:1 5 5 area de:
El triangulo Con base: Yaltura: tiene un
12,5
con id:2 10 10 area de:
Procedimiento PL/SQL
50
terminado correctamente.
303
Bases de
Datos
Por cada iteración del bucle, se hace una referencia a un objeto t. Obsérvese que tbase y t. altura son los atributos del objeto t, mientras que t. area es la invocación al método.
Actividad 3.2: Al igual queen POO,en BBDDes posiblecrear constructores. Consulta en
la documentación
8.5. La
de Oracle
cómo crear
constructores.
herencia
Una de las grandes ventajas de la POO es la herencia, gracias a la cual se pueden crear superclases abstractas para después, crear subclases más especicas que hereden los atributos y métodos de las superclases. En BBDDO-R es posible hacer algo parecido con los tipos de objetos: se pueden crear subtipos de objetos a partir de otros supertipos de objetos creados previamente. Un ejemplo sencillo en el que se aprecia con facilidad qué es la herencia es una escuela, donde hay estudiantes, profesores y empleados. Todos ellos tienen características de una persona: un nombre, un número de identicación, un teléfono, etc. Por tanto se puede construir un super tipo de objeto llamado tipo_persona que aglutine los atributos característicos de una persona.
create or replace type (id number, nombre varchar2(10),
tipo_persona as
object
telefonos listin) not final / creado.
La creación del tipo lleva includa la claúsula not nal que indica que se pueden generar más tipos de objetos a partir de este. Dicho con nomenclatura POO, se pueden crear subclases apartir de la superclase, o dicho con un lenguaje más natural se pueden crear tipos de persona más especicos a partir del tipo genérico persona. A continuación se crea un tipo de persona especíca, el estudiante: 304
Capítulo 8. BBDD Objeto-Relacionales
SQL> create or replace type 2 (facultad varchar2(10), 3 nota_media number) 4
not
5
/
Tipo
tipo_estudiante
under tipo_persona
final
creado.
En este caso, la cláusula under especica a qué supertipo pertenece el tipo estudiante. Nuevamente, se dene como not nal para poder generar clasicaciones más amplias. Obsérveseque este tipo de construccionespuedenusarsetambién para las jerarquías en el modelo entidad relación. Ver sección2.4.1. Al igual que con cualquierotro objeto, se puede comprobar la estructura del tipo estudiante utilizando
el comando describe, abreviado desc:
SQL> desc tipo_estudiante tipo_estudiante extiende TJ.TIPD_PERSONA tipo_estudiante N0 es FINAL
VARCHAR2(10) TELEFONOS
LISTIN
FACULTAD
VARCHAR2(10)
NÜTA_MEDIA
NUMBER
Incluso sería posible crear un tipo de subobjeto que tenga los atributos y métodos del tipmestudiante. Si además, se deseara crear un tipo para representar los estudiantesde intercambio, se podría denir:
SQL> create or replace type tipo_estudiante_intercambio 2 under tipo_estudiante 3 (pais varchar2(30), 4 5
Tipo
universidad
varchar2(30))
/
creado.
SQL> desc tipo_estudiante_intercambio
305
Bases de
Datos
tipo_estudiante_intercambio extiende
TJ.TIPÜ_ESTUDIANTE
VARCHAR2 (1o) TELEFONOS LISTIN FACULTAD VARCHAR2(10) NÜTA_MEDIA NUMBER PAIS VARCHAR2(30) UNIVERSIDAD VARCHAR2(30)
8.6. Operaciones
DML
A lo largo del capítulo ya. se ha mostrado en los ejemplos cómo utilizar la sentencia insert y select cuando se tratan tipos de objetos: SQL> insert into empleado 2 values (1,Fernando,Moreno,tab1a_hijos(E1ena,Pab1o)); 1fila
creada.
SQL> insert
2 1fila
into empleado
values (2,David,Sanchez,tab1a_hijos(Carmen,Candela)); creada.
SQL> col hijos format SQL> select *from ID NOMBRE
a40 empleado;
APELLIDO HIJOS
1Fernando 2 David Sanchez
Moreno TABLA_HIJÜS(Elena, Pab1o) TABLA_HIJOS(Carmen, Candela)
La única restricción es que no es posible operar sobre la tabla anidada: SQL> select
* from
t_hijos;
select from * t_hijos * ORA-22812: no almacenamiento de
306
se puede
hacer referencia
una columna
de tabla
a la anidada
tabla de
Capítulo 8. BBDD Objeto-Relacionadas Para realizar actualizaciones se utiliza update:
SQL> update empleado 2 set hijos=TABLA_HIJOS(Carmen,Cande1a,Cayetana) 3 where 1fila
id =1;
actualizada.
Ypara realizar borrados se utiliza delete. Obsérvese cómo se puede utilizar un determinado método para la selección de los registros a borrar o eliminar: SQL> select
* from
triangulos t
ID TRIANGULÜ(BASE,
ALTURA)
2 TIPÜ_TRIANGULÜ(10,
SQL> delete 1 fila
where t.triangu1o.area()>20;
from triangulos
10)
t where
t.triangu1o.area()>20;
suprimida.
8.7. Las
referencias
Una referencia es un puntero a un objeto creado a partir de su OID. Se utiliza principalmente para apuntar a un objeto que ya. existe y no tener que duplicar la información. Por ejemplo, si se desea crear una tabla de mascotas en la que ca.da mascota tiene su veterinario, yesos veterinarios ya están almacenados en una tabla de objetos, se podría hacer uso de la palabra reservada REF para indicar que el veterinario ya existe y por tanto. solo se almacena una referencia a ese veterinario en la
tabla de
mascotas.
SQL> create type veterinario 2( id integer, 3 nombre 4direccion
as object
varchar(100), varchar(255));
5/
Tipo creado. SQL> create
type mascota
as object
2(
307
Bases de Datos
3 4 5
id integer, raza varchar(100), nombre varchar(100),
6
vet
REF veterinario
7) 8/
Tipo
creado.
SQL> create Tabla
table
veterinarios
into
veterinarios
values
table
mascotas
of mascota;
SQL> insert 1 fila
veterinario;
(1,Jesús
Sánchez,C/El
mareo 29);
creada.
SQL> create Tabla
of
creada.
creada.
SQL> insert
into
2
select
3
from
4
where
1 fila
mascotas
1,perro,sprocket,
REF(v)
veterinarios v v.id=1;
creada.
Se puede ver cómo REF se utiliza en dos situaciones:Al crear el tipo mascota, para indicar que su veterinario será una referenciaal veterinario real, y después,al insertar la mascota, se realiza una sentenciade tipo ínsertselect para obtener una referenciaal veterinario cuyo id = 1. Si a continuación, se realiza una consulta se obtiene:
SQL> select * ID
RAZA
1 perro
from
mascotas;
NOMBRE
VET
sprocket
000O220208A59467OFAD9FO874E040007F01002AF3A594670FAD9E08
Para obtener los datos reales se puede utilizar la palabra DEREF:
SQL> select nombre,deref(vet) from mascotas; NOMBRE DEREF(VET)(ID, NOMBRE, DIRECCION)
sprocket VETERINARIO(1, Jesús Sánchez,
308
C/E1 mareo 29)
Capítulo 8. BBDD Objeto-Relacionales
8.8. Prácticas
Práctica 8.1:
Resueltas
Supermercado
Para la gestión de un supermercado, se desea construir un modelo para la gestión de las listas de la compra: 1. Crea un tipo para almacenar direcciones postales con dos campos, la dirección y el código postal. create or replace type ( dir varchar2(100), CP /
tipo_direccion as number(5))
object
2. Crea un tipo contacto para almacenar un número de teléfono y un email. create or replace type tipo_contacto as (telefono number, email varchar2(100)) /
object
3. Crea un tipo persona con los campos id, nombre, apellido, dirección y contacto. Después, crea un Subtipo cliente con otro campo adicional llamado número de pedidos. create or replace type (id varchar2(20), nombre varchar2(30). apellido varchar2(30). direccion tipo_direccion, contacto tipo_contacto) not final / create or replace type (n_pedidos number) /
tipo_persona as
tipo_cliente under
object
tipo_persona
4. Crea un tipo artículos con los campos id, nombre, descripción, precio y porcentaje de IVA. Después crea un tipo tabla de objetos para registros de artículos. create or replace type (id_art number,
tipo_articulo as
object
309
Bases de Datos
nombre descripcion precio porct_iva
varchar2(30). varchar2(100), number, number)
/ create or replace type tab1a_articu1os table of tipo_articu1o; /
as
5. Crea un tipo para la lista de la compra y otro para su detalle. La lista de la compra contendrá un identicador, fecha, cliente y una tabla de detalles de lista de la compra. A su vez, un detalle de lista de compra estará compuesto por un artículo y un campo que denote la cantidad pedida de ese artículo. Se deberá incluir en la denición una función miembro para calcular el total de la lista de la compra. create or replace type tipo_lista_deta11e numero number, articulo tipo_articu1o, cantidad number ) / create /
or replace
type tab_1ista_deta11e
create or replace type tipo_lista_compra (id number, fecha DATE, cli REF tipo_c1iente, Detalle tab_1ista_detal1e, member function total return number ) /
6. Crea
ahora el cuerpo del tipo lista
de la
create or replace type body tipo_1ista_compra member function total return number is i integer; tot number := O;
as object (
as table
of tipo_1ista_deta11e;
es object
compra para denir
el método total:
as
begin fori in1..Deta1le.count loop tot return end; end; /
310
:= tot + tot;
(Detal1e(i).cantidad * Deta11e(i).articu1o.precio ) (1+(Detal1e(i).articu1o.porct_iva/100)); end loop;
t
Capítulo 8. BBDD Objeto-Relacionadas Crea una tabla
create insert
de clientes e inserta uno.
table Clientes of tipo_c1iente; into clientes values (1, Pedro,Suarez, TIPO_DIRECCION(Paseo del Museo 15,28099), TIPO_CONTACTO(917726S25,
[email protected]),0);
Crea una tabla para las listas de la compra e inserta una lista de la compra con un detalle de dos artículos para el cliente insertado anteriormente:
create table listas_de_compras of tipo_1ista_compra nested table Detalle store as tDeta11e; insert into 1istas_de_compras select 1,current_date,ref(c), tab_1ista_deta11e( tipo_lista_deta11e(1.tipo_articu1o(1,Barra de pan,Tipo baguette,1,7),4), tipo_1ista_deta11e(2,tipo_articu1o(2,Lonchas de jamón,Iberico Be11ota,6,7),4) ) from Clientes c where c.id=1;
Muestra.con una
select los datos de la lista de la compra:
col cliente formats40 col detalla formatn50 set linesize 132 select idjcchmdcrccli)
u cliente. detallo fromliltagdhcompns;
l 13/06/11TIPILCLIENTEÜI,'Padxo. Suarez. TIP TAB_LISTA_DÉI'ALLE(TIPO_LISTA_DÉI'ALLE(1, TIPÜ_ARTIC O_DIR.ECCIDN(Puoo del Husoo15', 28099)ULOU, Burn de pu, Tipo bnguotto, 1, 7), d). . TIPU_CONTACl'0(917726525, Tsuuezdono.TIPO_LISTA_DÉTALLE(2.TIPCLARTICULCK?, Wonchudo com). 0) jamón, Iberico BeuataHG.7). 4))
10.
Construyeuna selectpara mostrar por pantalla el id de una lista de la y su total.
SQL> select ID
id,
c.tota1()
compra
from 1istas_de_compras c;
C.TOTAL()
311
Bases de
Datos
8.9. Prácticas Práctica 8.2:
Propuestas Tipos básicosy herencia
Realiza los siguientes ejercicios: 1. Crea. un tipo para las direcciones de empresas, contendrá el tipo de dirección y la dirección (número, calle y piso). 2. Crea un tipo colección para almacenar hasta 3 direcciones (scal, postal administrativa).
y
3. Crea un supertipo empresa con los atributos CIF, Nombre y sus direcciones. 4. Crea un subtipo de empresa llamada Sociedad Anónima con los atributos número de accionistas, capital social ypresupuesto. 5. Crea un subtipo de empresa llamada Sociedad Limitada que tenga una lista de socios, donde se especique el nombre del socio y un porcentaje de posesión de la empresa. 6. Crea una tabla de empleados que tenga una referencia a una Empresa.
Práctica 8.3:
Comandos DML con objetos
Con los tipos de la. práctica anterior realiza las siguientes operaciones: 1. Crea una tabla de empresas de tipo sociedades anonimas. 2. Inserta
una sociedad
anonima con
dos direcciones.
3. Crea una tabla de empresas de tipo sociedades limitadas. 4. Inserta una sociedad limitada con dos direcciones y cuatro socios. 5. Inserta un empleado para cada una de las empresas insertadas. 6. Crea una consulta que muestre la empresa para la que trabajan los empleados utilizando la
312
función DEREF.
Capítulo 8. BBDD Objeto-Relacionales
Práctica 8.4:
Números complejos
Un númerocomplejo a+bi está compuestopor una parte imaginaria (b) y una parte real (a). Se desea crear un tipo de objeto llamado tipo_complejo con una serie de métodos para poder operar con ellos. Se pide: 1. Crea el tipo tipo_complejo que contenga los atributos imaginario dena la cabecera de los siguientes métodos:
y real, y que
IMódulo: Retorna un valor numérico resultado de operar los valores imaginarios y reales con la fórmula x/ a2+b? - Valor: Retorna una cadena decaracteres con la representación del número complejo (a+bi). IConjugado: Retorna una cadena de caracteres con la representación del conjugado del número complejo (a-bi).
- Multiplicar(Número Complejo): Actualizarálos atributosdel númerocomplejo resultado de multiplicar los propios atributos por otro número complejo que será pasadocomo parámetro: (a+bi)(c+di) =acbd+(ad+bc)i 2. Crea el cuerpo del tipo desarrollando los métodos denidos en la cabecera del tipo.
3. Crea el tipo tipo_tabla_co1nplejos para almacenar una serie de números complejos. Después, crea el tipo tipo_lista_complejos que almacene una tabla de complejos. 4. Crea una tabla de listas de números complejos e inserta un registro con 5 números.
5. Crea un bloque anónimo para multiplicar el segundo.
primer número insertado por el
6. Crea un bloque anónimo que muestre el módulo, valor y conjugado de los números complejos insertados. 7. Crea una función que reciba una tabla de números complejos y devuelva un número complejo con la suma de todos ellos. 8. Crea un bloque anónimo que invoque a la función anterior y visualice la suma de los números complejos insertados.
313
Bases de
Datos
Resumen
8.10.
Los conceptos clave de este capítulo son los siguientes: Muchos SGBD permiten la creación de tipos personalizados, que son la base de las BBDD-OR.
Los atributos multivaluados puedenalmacenarse en colecciones (varray)de un número jo de elementoso en tablas anidadas(nested tables)para almacenar un número
variable de
elementos
.
Los objetos denidos en Oracle se puedenconsultar utilizando la tabla dba_objects. Un tipo de objeto se crea con la sentencia DDL create type tipo as object. Es posible crear tipos de tabla de objetos con la sentencia DDL create type tipmtabla as table of objeto. Se puede anidar la creación de tipos en tantos niveles como se desee. Un OID es un número de 16 bytes para mejorar la búsqueda de la información. Se puede consultar con la función object_id. Un método es una función o un procedimiento miembro denido
dentro de un
tipo.
Para invocar a un método se utiliza el operador punto objeto.metodo( Se pueden crear jerarquías de clases (u objetos tipo) deniendo FINAL
tipos NOT
.
Para crear un subtipo de objetos se utiliza la cláusula under supertipo. Es posible compartir objetos mediante referencias a objetos utilizando la cláusula REF.
Para ver la información de un objeto referenciado mediante REF se utiliza la función DEREF.
314
Capítulo 8. BBDD Objeto-Relacionales
Test de repaso
8.11.
1. En BBDD-OR un
tipo
a) Es la denición de unaestructura quesirve
6. Para
denir métodos
en BBDD-OR
para crear objetos
b) Se usa en la denición de una columna de una tabla
c) Se puede utilizar como basepara otros ti-
a) Se usan funciones o procedimientos miembros de un tipo de datos
b) Se utilizan paquetescon cuerpoy cabecera c) No es posible utilizar métodos
pos
d) Todas de las anteriores
d) Ninguna
2. Las
7. Para
colecciones se
crean mediante
de las anteriores
invocar a
un método
en BBDD-
OR
a) vArrays a) Se utiliza el operador ->
b) nested tables
b) Se usa la función REF
c) under
c) Se usa la función 0bject_value()
d) not nal
d) Se usa el operador punto 3. Una
tabla anidada
a) Se usa como modo de almacenamiento para un tipo tabla
b) Es un tipo de segmentoespecial c) Se crea conla cláusula store as d) Todas las anteriores 4. ¿Qué ver las
vista se
utiliza en
8. En
BBDD-RO la
a) Permite
herencia
que un tipo herede de más de un
supertipo
b) No es posible crear un subtipo a partir de un supertipo
c) Es posible crear un supertipo un subtipo
a partir de
Oracle para d) Ninguna
tablas anidadas?
de las anteriores
a) dba-objects
9. Cuando
b) user_nested_tables
BBDD-OR
c) dbasegments
a) Se pueden realizarinserts y updates
d) Ninguna
b) Se pueden usardeletes
de las anteriores
se usan
comandos DML
en
c) No es posible hacer select en tablas anida5. Un
OID
a) Es un identicador localizar el objeto
das
que usa el SGBD para
d) Todas las anteriores
b) Se puede vercon la función object_id c) Es el equivalente al ROWID en objetos
P6'P'8P'¿'9'9P'93'rP¬9'ZP
d) Todas las anteriores
315
Bases de
Datos
8.12. Comprueba
tu aprendizaje
1. ¿Qué es una base de datos OR?
_
,
_ _
_
12. Explica cómo se puede invocar a un
_método
denido en un tipo.
2. ¿Cual es la principal diferencia con
las bases de daÉOS TGÏaCÍOHHÏGS? 13. Comenta cómo se aplicala herencia
3. ¿Qué es un atributo multivaluado? a las BBDD-OR
4. ¿Cómo encajaatributo un multiva14' Se¿Cómo puede insert?regisu? luado enlas bases de datosOR? tro
en unatabla deObjetos
5_ Enumera dos formas distintas de 15. Denepara qué sirven las siguienalmacenar atributos multivaluados tes
en una tabla.
funclones
IObject-id
6. Explica las diferencias entre usar
_Objechvalue
una tabla anidada yunacoleccion. DEREF I
7. Escribe la sintaxis para crear: ITipos
_ _16. - TlpOS colecciones tes
_REF , _
,
,
Dene para que sirven las siguienCláusulas
- Tipos Tabla tore
ITablade objetos
as
IS Iunder
8.crean? ¿Qué es un tipo tabla? ¿Cómo se '
1na nnot
nal
9. ¿Cómo se puedenconsultar en Ora-
cle qué tipos deob jetos hay denidÍ OS 17. 10. ¿Cómose puedeconsultar enOra- qué cle las tablas anidadas creadas?
' ¡member , . ¿Que es una referenciaÍQPara 1153?
, _ 18. ¿Como se puede insertar una refe11. ¿Cómo se crea un método en un ti- rencia a un objeto en un tabla de po? objetos?
316
«.2
Bases de
Datos
ste libro está concebidodesde laexperiencia delos autores, como administradores de bases de datos
en empresasmultinacionales, como profesores de formación profesional(familia informática) y como profesores de Universidad.
Los profesionales de la industria informática yneótos encontrarán una valiosa fuente de infonnación para el desempeño deactividades relacionadascon basesde datos, detallando su funcionamiento, composición, diseño y aplicaciones. El contenido del libro tiene una orientación puramente práctica, con actividades, consejosy ejercicios resueltos en Access,MySQL, Oracle y DBZ que facilitan la comprensión y asimilación de la información. El objetivo del libro no es ser una guía de referencia de un solo Sistema de Gestión de Bases de Datos, sino la formación de
administradores de
bases de
datos actuali-
zados, versátilesy competentes. Existe multitud de materialdisponible parala realización de lasprácticas propuestas en lapágina webx. a .\gen-cota«. y en el blog lvbtltl-gzirccta.blogsptlttnni
arceta
grupo editorial
www.garceta.es