Bases de Datos

October 12, 2017 | Author: femabe22 | Category: Ascii, Databases, Table (Database), Backup, Computer Data
Share Embed Donate


Short Description

Download Bases de Datos...

Description

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.



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

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF