Вы находитесь на странице: 1из 65

SUBSECRETARIA DE EDUCACION SUPERIOR DIRECCION GENERAL DE EDUCACION SUPERIOR TECNOLOGICA INSTITUTO TECNOLOGICO DE OAXACA DEPARTAMENTO DE SISTEMAS Y COMPUTACION

INSTITUTO TECNOLOGICO DE OAXACA

DEPARTAMENTO DE SISTEMAS Y COMPUTACION LICENCIATURA LICENCIATURA EN INFORMATICA

MANUAL DE PRACTICAS DE LA ASIGNATURA IFH IFH0439 TALLER DE BASES DE DATOS

ARTURO ARMANDO ARAGON SORROZA

TRABAJO DE AO SABATICO REPORTE INTERMEDIO DEL 18 DE ENERO D EL 2010 17 DE JULIO DEL 2010

INDICE
CONTENIDO PAGINA ------------------------------------------------------------------------------------

INTRODUCCION _____________________________________________ 1 PRACTICA # 1. PREPARACIN DEL ENTORNO OPERATIVO _______ 2 PRACTICA # 2. INSTALACIN DEL GESTOR DE BASES DE DATOS _ 5 PRACTICA # 3. RECONOCIMIENTO DEL ENTORNO OPERATIVO DEL GESTOR DE BASES DE DATOS __________________ 9 PRACTICA # 4. CREACIN DE BASES DE DATOS Y ESQUEMAS __ 13 PRACTICA # 5. USO DE LA INTEGRIDAD _______________________ 21 PRACTICA # 6. CREACIN DE TABLAS ________________________ 32 PRACTICA # 7. ACCESO A LA BASE DE DATOS _________________ 39 PRACTICA # 8. MONITOREO DE BASES DE DATOS _____________ 49 PRACTICA # 9. USO DE TRIGGERS ____________________________ 55

INTRODUCCION
La importancia de almacenar, manipular y recuperar la informacin en forma eficiente ha llevado al desarrollo de una teora esencial para las bases de datos. Esta teora ayuda al diseo y procesamiento de consultas de bases de datos por parte de un usuario ingenuo. Las arquitecturas de las bases de datos han evolucionado mucho desde sus comienzos, aunque la considerada estndar hoy en da es la descrita por el Comit ANSI/X3/SPARC (Standard Planning And Requirements Committee of The American National Standards Institute on Computers and Information Processing) que data de finales de los aos setenta. A partir de entonces han aparecido en la escena de los Sistemas de Informacin Informatizados, infinidad de tecnologas que han implementado esta teora, llmense Oracle, Sybase, SQL Server de MS, Informix y DB2 de IBM, PostgreSQL, MySql de Sun, entre otras, ofreciendo la gestin de las bases de datos al profesional de la informtica en una forma accesible a travs del lenguaje de programacin SQL (Structured Querie Language). Como parte fundamental del perfil del Licenciado en Informtica, el Sistema Nacional de Educacin Superior Tecnolgica a travs de la Direccin General de Institutos Tecnolgicos, los alumnos inscritos en los Institutos Tecnolgicos del pas se forman para aplicar esta teora en la solucin de problemas de administracin de datos que requieren las empresas e instituciones asentadas en las distintas regiones de la Repblica Mexicana. Si bien es cierto que un buen Administrador de Bases de Datos no se hace en semanas ni meses, sino en aos, existe la posibilidad de utilizar tcnicas de enseanza-aprendizaje que guen a los estudiantes de informtica de nuestro Sistema Nacional de Educacin Superior Tecnolgica a conseguir el conocimiento suficiente y estandarizado de un Sistema de Gestin de Bases de Datos (SGBD) y del SQL, con cuyas bases pueda extender su experiencia para aprender el funcionamiento de al menos media docena de otros SGBD con la misma efectividad. Se requiere entonces, apoyarse en el inters y el gusto personales de cada estudiante con base en metodologas, como la de aprender haciendo mediante esfuerzos deliberados tareas bien definidas, con niveles apropiados de dificultad segn las posibilidades de cada individuo, con retroalimentacin y oportunidades de repeticin y correccin de errores para que logre las competencias suficientes para desarrollarse en el campo de las Bases de datos. En este sentido, el Manual de prcticas para la materia de Taller de Bases de Datos, tiene como objetivo principal el ofrecer a nuestros estudiantes un material debidamente dosificado tanto en nivel de dificultad como en contenidos que pueda estudiar y aplicar tanto en sesiones grupales como en forma individual, cuantas veces lo crea necesario hasta conseguir la meta establecida para cada ejercicio propuesto. El material est diseado para ofrecer al estudiante y al profesor tambin, la teora bsica en que se fundamenta la prctica propuesta, el algoritmo a seguir para conseguir la meta y la retroalimentacin necesaria para evaluar el avance en el aprendizaje. Las primeras dos practicas tienen como finalidad preparar el equipo con las caracteristicas operativas suficientes para instalar el sistema gestor de bases de datos con el que se trabajara durante el semestre. Al desarrollar la practica numero tres, el alumno aprendera a manipular la interfase que le permitira usar eficientemente el gestor de base de datos. Con las practicas cuatro a siete, se debera adquirir la habilidad para crear, gestionar y consultar bases de datos. A partir de la practica ocho se abordaran topicos cuya finalidad es preparar al estudiante para programar la gestion de los datos, usando triggers, procedimientos almacenados y programando interfases graficas mediante un lenguaje de programacion de alto nivel, asi como realizar respaldos y recuperacion de copias de datos con la debida seguridad en el acceso a las bases de datos.

Pagina 1

PRACTICA # 1. PREPARACIN DEL ENTORNO OPERATIVO


No. de prctica: 01 Nombre: Objetivo: Preparacin del entorno operativo Verificar que el equipo de cmputo a utilizar posea las caractersiticas operativas necesarias para alojar el SGBD PostgreSQL.

Un sistema gestor de bases de datos (SGBD), es un conjunto de programas Introduccin: que se ejecutan sobre una plataforma o sistema operativo previamente instalado. Adems de ste software bsico, el equipo debe poseer caractersticas fsicas suficientes para alojar y ejecutar eficiente y seguramente las diversas piezas de software que componen el SGBD. Por regla general, los SGBD actuales se dice que son multiplataforma, es decir, la base de datos implementada sobre un sistema operativo particular puede interactuar con equipos que corren en otros sistemas operativos. Por ejemplo, una base de datos implementada en Unix puede manipularse en equipos que corren en Windows o Solaris a travs de interaces de software correctamente programadas. Para fines de ste manual de prcticas, consideraremos el sistema operativo Windows (XP o Vista) como la plataforma de implementacin para las bases de datos que se implementarn. Dentro de una amplia gama de SBGD, que va desde MicroSoft Access hasta Oracle, se opt por seleccionar el Postgres Studio. Deber usarse la versin o release ms actualizada a la fecha de preparacin de los equipos a usar para utilizar este manual de prcticas. Como sabemos, el diseo de bases de datos normalmente se hace bajo el modelo relacional; sin embargo, las metodologas han evolucionadon tremendamente, pasando por el diseo orientado a objetos, la programacin basada en patrones y frameworks. En este sentido el Postgres Studio que usa el PostgreSQL, permite implementar las bases de datos bajo la metodologa de orientacin a objetos, razn por la cual fue seleccionado. Ahora bien. Qu es PostgreSQL? Es un sistema de gestin de bases de datos objeto-relacional (SGBDOR) de tipo open-source basado en PostGres versin 4.1, desarrollado en la Universidad de California en el Departamento de Ciencias de la Computacin de Berkeley. Reconoce una gran parte del SQL standard y ofrece muchas caractersticas modernas como: queries (consultas) complejas, llaves forneas, disparadores, vistas, integridad transaccional, control de concurrencia multiversin y posibilidades de expansin permitiendo la agregacin de nuevos tipos de datos, funciones, operadores, funciones agregadas, mtodos de indizacin y lenguajes procedimentales. Y como es de licencia libre, PostgreSQL se puede usar, modificar y distribuir gratuitamente, libre de cargos para cualquier propsito, que puede ser privado, comercial o acadmico. Incluye las siguientes caractersticas funcionales: - Plataformas soportadas: Linux x86/32 , Linux x86/64, Windows, Solaris, SPARC - Cumplimiento de la norma ACID completa - Vistas - Tipos de datos definidos por el usuario - Restricciones ANSI - Indices funcionales - Indices parciales - Particionamiento de datos e ndices

Pagina 2

PRACTICA # 1. PREPARACIN DEL ENTORNO OPERATIVO


Indices de bitmaps Llaves primarias y forneas Mquina de reglas Herencia Triggers y funciones almacenadas Transacciones anidadas Soporte de lenguajes procedimentales Soporte SQL/XML Control de concurrencia Multi-versin (MVCC) Bsqueda de texto completa PostgreSQL database links Autenticacin pluggable Improved heap-only tuples (HOT) Consola de administracin GUI (pgAdmin) Point-in-time recovery (PITR) Reorganizacin de ndices en lnea Respaldo en lnea Terminal interactiva SQL Conectores cliente: libpq, ECPG, JDBC, ODBC, .net Asynchronous pre-fetch para RAID: ndices bitmap Soporte para lenguajes de programacin: PL/pgSQL, PL/Java, PL/Ruby, PL/Python, PL/PHP, PL/Perl, C/C++, PL/Tcl, PL/Scheme

Dependiendo del alcance del sistema de bases de datos a implementar PostgreSQL ofrece muchas ms caractersticas en sus paquetes Postgres Plus Standard Server y Postgres Plus Advanced Server. Los requerimientos fsicos necesarios para instalar y operar el PostgreSQL son: - Memoria Ram: 2 GB mnimo, se recomienda 4 GB o ms. - Disco duro: 2 GB libres para albergar el SGBD y 20 GB para los datos de prctica. - Tarjeta de red. - Conexin a internet - Sistema operativo Windows XP o Vista instalado. Especificar en cada prctica la correlacin con l o los temas y subtemas del programa de estudio vigente: Tema 1: Subtema 1.3: Gestor de bases de datos Instalacin y configuracin del entorno operativo.

Material y equipo usado: Equipo de cmputo personal o Laptop con sistema operativo Windows XP o Vista. Metodologa: 1. Encender el equipo de cmputo. 2. Con el explorador de Windows verificar las caractersticas fsicas del equipo. 3. Verificar que no exista un usuario con el nombre de enterprisedb En caso de que si enterprisedb. exista, brrelo con la orden: net user enterprisedb /deleted desde la lnea de comandos. 4. Desde el panel de control, con las herramientas administrativas, crear un punto de restauracin del sistema como precaucin por si la instalacin muestra errores. Esto permitir regresar el sistema a un estado previo a la instalacin de PostgreSQL.

Pagina 3

PRACTICA # 1. PREPARACIN DEL ENTORNO OPERATIVO


5. Verificar contra las especificaciones mnimas de funcionamiento del gestor de bases de datos a instalar. Sugerencias didcticas: Leer el documento 02 1 Which Postgres is Right For Me.pdf que se encuentra en el CD de soporte, para abundar el conocimiento sobre los diferentes tipos de PostgreSQL que existen. Investigar en internet acerca del Proyecto Postgres de Berkeley (The Berkeley POSTGRES Project) para conocer la filosofa de este SGBD. Puede hojear el archivo 04 1 postgresql8.4.3-US, manual.pdf que se encuentra en el CD de soporte. Crear puntos de restauracin del sistema, instalar programas, restaurar el sistema al punto de restauracin previo a la instalacin de los programas y verificar el estado del equipo.

(resultados): Reporte del alumno (resultados): 1. Elaborar un check-list de las caractersticas del sistema operativo en funcionamiento. 2. Elaborar un documento que describa las adecuaciones necesarias del sistema operativo y hardware del equipo que deban hacerse en caso necesario. 3. Elaborar un resumen que describa las diferencias entre el PostgreSQL, PostgreSQL Plus Standard Server y PostgreSQL Plus Advanced Server. Bibliografa preliminar: 1. 02 1 Which Postgres is Right For Me.pdf 2. 04 1 postgresql-8.4.3-US, manual.pdf 3.
http://www.enterprisedb.com/learning/documentation.do

Pagina 4

GESTOR PRACTICA # 2. INSTALACIN DEL GESTOR DE BASES DE DATOS


No. de prctica: 02 Nombre: Objetivo: Instalacin del gestor de bases de datos Instalar en el equipo de cmputo el software SGBD PostgreSQL.

Todo paquete de software es desarrollado, documentado y soportado por una Introduccin: organizacin empresarial. Esta organizacin ofrece a sus clientes las versiones binarias del software, la documentacin pertinente, entrenamiento, capacitacin y soporte tcnico. Para el caso de PostgreSQl, el software en si es gratuito, no as los servicios que ofrece la organizacin que lo pone a disposicin. EnterpriseDb es la organizacin de la que podemos obtener una copia legal de PostgreSQL, adems de la documentacin bsica para su operacin. Una vez instalado el software, podemos hacer uso de l mediante una interface apropiada o incrustndolo en aplicaciones de programacin hechas por el usuario, usando lenguajes de programacin como C++, Java, PHP, Python, entre otros. Asi que lo primero que tenemos que hacer es tener a la mano una copia del software a instalar. El archivo binario para Windows que instalaremos es: pgplus-advsvr -windows_830112.exe que se pgplus-advsvrencuentra en el CD de soporte a este manual o si se desea, se puede accesar a la pgina de EnterpriseDB y descargar el producto y versin que se desee:
http://www.enterprisedb.com/products/download.do

la pgina se ve as:

Pagina 5

GESTOR PRACTICA # 2. INSTALACIN DEL GESTOR DE BASES DE DATOS


Plataformas calificadas Postgres Plus Advanced Server Postgres Plus Advanced Server 8.3 R2 SP1 (8.3.0.112) fue probado y calificado sobre las siguientes plataformas, tanto en 32-bit como en 64-bit. Windows 2000, 2003 Windows XP Windows Vista Windows 7 Este producto ha sido certificado en las siguientes localidades: en_US Ingls de Estados Unidos zh_HK Chino tradicional con Hong Kong SCS zh_TW Chino tradicional para Taiwan zh_CN Chino simplificado ja_JP Japons euc_KR Coreano en Especificar en cada prctica la correlacin con l o los temas y subtemas del programa de estudio vigente: Tema 1: Subtema 1.3: Gestor de bases de datos Instalacin y configuracin del entorno operativo.

Material y equipo usado: Equipo de cmputo personal o Laptop con sistema operativo Windows XP o Vista. Metodologa: 1. Instalacin de Postgres Plus Advanced Server con el Graphical Installer a. Descargar o ubicar el archivo de instalacin. b. Cllick derecho sobre el icono del archivo, seleccionar 'Extract All...' desde el pop-up menu. c. Usar el Windows Extraction Wizard para extraer el programa de instalacin. d. Doble click sobre el folder extrado (pgplus-advsvr-windows_830112) para abrir el archivo en una ventana de administrador de archivos. e. El folder contiene los iconos de Postgres Plus Advanced Server y de README_FIRST_Windows. f. Doble click sobre el icono de pgplus-advsvr-windows_830112 para iniciar el Installation Wizard. g. Obedecer los dilogos en pantalla para completar la instalacin de Postgres Plus Advanced Server. h. El nombre del usuario ser: enterprisedb y el password: masterkey masterkey. Nota: Al finalizar la instalacin, se conectar automticamente a internet para realizar actualizaciones al server. 2. Instalacin de Postgres Plus Advanced Server en la Lnea de Comandos a. Descargar o ubicar el archivo de instalacin. b. Cllick derecho sobre el icono del archivo, seleccionar 'Extract All...' desde el pop-up menu.

Pagina 6

GESTOR PRACTICA # 2. INSTALACIN DEL GESTOR DE BASES DE DATOS


c. Usar el Windows Extraction Wizard para extraer el programa de instalacin. d. Abrir una ventana MsDos y navegar hasta el directorio que contiene el archivo de instalacin. C:\> pgplus-advsvr-windows_830112.exe -console e. El script de instalacin te guiar a travs del proceso de instalacin de Postgres Plus Advanced Server. f. El nombre del usuario ser: enterprisedb y el password: masterkey masterkey. key Para los usuarios de Windows Vista Si se est trabajando con el User Account Control (UAC) activado, debern invocarse privilegios de Administrador para poder ejecutar las opciones Start Database, Stop Database y Restart Database del men de Aplicacin. Para ejecutar estas opciones, d click derecho sobre el item del men y seleccione la opcin Run as administrator. En windows Vista Home o Premiun, se debe desactivar el UAC y luego ejecutar en la lnea de comandos la siguiente orden: net User Administrador /active:Yes Esto es importante dado que la instalacion en Vista se debe hacer con el Usuario Administrador. 3. Desinstalacin de Postgres Plus Advanced Server a. Desinstar el software desde el Panel de Control b. Borrar la cuenta enterprisedb desde la lnea de comandos con la orden: net user enterprisedb /deleted Sugerencias didcticas: Leer acerca de la orden net user de la lnea de comandos, resulta til para la manipulacin de cuentas de usuario. La razn para adquirir habilidad en su manejo es porque al reinstalar el PostgreSQL con la misma cuenta de usuario (enterprisedb) y esta cuenta sigue activa en Windows, la instalacin abortar y emitir el mensaje correspondiente. Sera conveniente crear cuentas de usuario y manipularlas y eliminarlas mediante la orden net user.

(resultados): Reporte del alumno (resultados): 1. Al iniciar la instalacin de PostgreSQL Plus Advanced Server, se obtiene el aviso:

Pagina 7

GESTOR PRACTICA # 2. INSTALACIN DEL GESTOR DE BASES DE DATOS


2. Al finalizar la instalacin de PostgreSQL Plus Advanced Server, se obtiene el aviso:

3. Al enlazarse a internet para actualizar el software instalado aparecer:

4. Al dar click en Download & Apply y terminar la actualizacin, el aviso es:

Bibliografa preliminar:
1. http://wiki.postgresql.org/wiki/Instalacin_interactiva_en_Windows

Pagina 8

PRACTICA # 3. RECONOCIMIENTO DEL ENTORNO OPERATIVO DEL GESTOR DE BASES DE DATOS


No. de prctica: 03 Nombre: Objetivo: Reconocimiento del entorno operativo del gestor de bases de datos. Conocer y manejar la GUI de PostgreSQL: pgAdmin para la gestin intuitiva de bases de datos.

Introduccin: El SGBD es un software que corre en un segundo plano (background), por lo Introduccin: que se necesita de una interface (foreground) para utilizarlo. En otras palabras, el usuario necesita de un programa que realice las conexiones necesarias con el gestor de bases de datos y permita la edicin de instrucciones de SQL para crear, eliminar y manipular bases de datos, adems de que sea de forma intuitiva y fcil. El SGBD PostgreSQL incluye la GUI (Graphics User Interface) pgAdmin que fungir como enlace entre el implementador y l para la gestin sencilla y efectiva de bases de datos. La pantalla principal del pgAdmin tiene el siguiente diseo:

En esta pantalla se despliega la estructura de las bases de datos. Se pueden crear nuevos objetos, asi como borrar y editar objetos ya existentes si el usuario conectado posee los privilegios suficientes para hacerlo. En el lado izquierdo (object browser) se muestra un rbol con todos los servidores y sus objetos. En el lado superior derecho se muestran los detalles del objeto actualmente seleccionado en el rbol. Algunos objetos podran tener estadsticas en adicin a sus propiedades, las cuales se mostrarn al seleccionar la pestaa statistics. El lado inferior derecho presenta en ingeniera inversa, scripts SQL del objeto seleccionado en el rbol. Se pueden copiar a cualquier editor mediante cut&paste o almacenarlos en un archivo usando la opcin Save definition del men File, o bien, usarlos como patrones si se selecciona Query Tool. Si est seleccionada la opcin Copy SQL, el query se copiar automticamente a la herramienta.
Pagina 9

PRACTICA # 3. RECONOCIMIENTO DEL ENTORNO OPERATIVO DEL GESTOR DE BASES DE DATOS


La lnea del fondo o lnea de estado mostrar alguna informacin pertinente, as como el tiempo que pgAdmin se tard en completar la ltima accin. Se puede cambiar el tamao de la ventana principal y de los paneles que la componen segn el gusto del usuario. Estos cambios se preservarn al salir del pgAdmin. El estado de los objetos en el object browser se refrescan solo por demanda o despus de hacerles cambios con las herramientas internas del programa. - La ventana principal muestra la estructura de las bases de datos y los detalles de sus objetos. - Opciones del men File: - Save Definition permite almacenar en un archivo scripts SQL. - Usar la opcin Add server.. o el botn en la barra de herramientas para agregar una nueva conexin de base de datos a pgAdmin. - Con Change password se puede cambiar la contrasea del usuario actualmente conectado con la base de datos seleccionada. - El dilogo Options permitir configurar el programa pgAdmin. - Exit, termina la sesin y cierra el programa. - Opciones del men Tools: - Control server permite controlar el estado de los servidores de bases de datos, iniciarlos y detenerlos. - Query Tool permite la ejecucin arbitraria de rdenes SQL. - Debugger permite la depuracin de funciones y procedimientos almacenados de pl/sql y edb-spl.. - Export Tool permite exportar datos desde Query Tool. - Edit Grid permite ver y editar datos en una tabla o vista seleccionada. - La herramienta de Maintenance ejecuta la tarea de reconstruir las estadsticas de las bases de datos y sus tablas, eliminar renglones de datos no usados y reorganizar ndices. - La herramienta Backup llama a la herramienta de vaciado de PostgreSQL para crear archivos de respaldo de los datos. - La herramienta Restore llama a la herramienta de restauracin de datos de PostgreSQL para recuperar datos desde archivos backup. - Grant Wizard permite la asignacin de privilegios de grupo o usuario sobre muchos objetos a la vez. - Report Tool genera reportes simples de datos y objetos de la base de datos. - La ventana Server status mostrar los usuarios actualmente conectados, sus seguros y la bitcora del servidor de la base de datos seleccionada. - Guru Hints ayuda a perfeccionar la base de datos. - Command Line Options permite iniciar pgAdmin en el modo mss conveniente. Al editar las propiedades de un objeto de bases de datos y se presiona la tecla F1, pgAdmin proporcionar la ayuda pertinente acerca de las rdenes SQL de PostgreSQL seleccionadas. Para que esto trabaje bien, el nombre del sitio de ayuda en el dilogo de opciones deber estar especificado correctamente. Para manipular las tablas de una base de datos mediante instrucciones SQL, se usa la herramienta Query Tool, que tiene las siguientes propiedades:

Pagina 10

PRACTICA # 3. RECONOCIMIENTO DEL ENTORNO OPERATIVO DEL GESTOR DE BASES DE DATOS

La parte superior es la ventana de entrada, donde se escribirn y editarn las instrucciones SQL. Se puede leer un query desde un archivo, o se puede escribir el query a un archivo. La ventana de entrada tiene la opcin de autocompletar para auxiliar en la escritura de queries. Para usar esta utilidad, al ir escribiendo se pulsa la combinacin Control+Espacio para ver una lista de posibles nombres de objetos a insertar. Para ejecutar el query, seleccionar la opcin Execute del men Query, presionar la botn de ejecutar de la barra de herramientas o presionar la tecla F5. Si no se tiene seleccionada una palabra, el contenido completo de la ventana se enviar al servidor de la base de datos, quien se encargar de ejecutarlo. Esto quiere decir, que se puede ejecutar solo una parte del texto, seleccionndolo y ejecutandolo. Si en lugar de pulsar F5, se pulsa F7, la instruccin se ejecutar presentando los resultados en la pestaa Output Data, y dibujando un diagrama explicativo en la pestaa Explain del Output Pane. programa Especificar en cada prctica la correlacin con l o los temas y subtemas del pro grama de estudio vigente: Tema 1: Subtema 1.2: Subtema 1.3: Gestor de bases de datos. Herramientas. Instalacin y configuracin del entorno operativo.

Material y equipo usado: Equipo de cmputo personal o Laptop con sistema operativo Windows XP o Vista. SGBD PostgreSQL instalado.

Pagina 11

PRACTICA # 3. RECONOCIMIENTO DEL ENTORNO OPERATIVO DEL GESTOR DE BASES DE DATOS


Metodologa: 1. Ejecutar el programa Postgres Studio. a. Seleccionar Inicio | Programas | Postgres Plus Advanced Server 8.3r2 | Postgres Studio

b. Seleccionar desde el escritorio el icono 2. Navegar y explorar las partes que forman el pgAdmin. 3. Seleccionar del arbol en Servers, Advanced Server 8.3R2 (localhost:5432) a. Entrar con el usuario enterprisedb y el password masterkey. b. Abrir la base de datos postgres, ir a schemas, public, tables y emp. 1. Navegar por la interface, ir a Query Tools y probar alguna instruccin Select. Sugerencias didcticas: El alumno est obligado a leer ntegramente el documento 03 4 Using PGAdmin III.pdf que se encuentra en el CD de soporte, para conocer al detalle el contenido completo de la interface pgAdmin III.

Reporte (resultados): Rep orte del alumno (resultados): 1. Elaborar un resumen de la navegacin que realiz en pgAdmin. 2. Elaborar un reporte de mensajes y las acciones tomadas para resolver los problemas que se pudieron presentar. Bibliografa preliminar: 1. Documento 03 4 Using PGAdmin III.pdf ubicado en el CD de soporte. 2.
http://www.enterprisedb.com/docs/en/8.3/pgadmin/

Using pgAdmin III

Pagina 12

PRACTICA # 4. CREACIN DE BASES DE DATOS Y ESQUEMAS


No. de prctica: 04 Nombre: Objetivo: Creacin de bases de datos y esquemas. Mediante el pgAdmin, aprender el procedimiento para crear bases de datos y sus tablas usando el SGBD PostgreSQL.

Las bases de datos han existido desde los Sumerios y los Egipcios, quienes Introduccin: utilizaron escritura cuneiforme y jeroglficos para registrar sus cuentas en una forma que pudieran preservarse y reexaminarse posteriormente [Diamond 1997]. Esa es la esencia de una base de datos: ser un mecanismo de almacenamiento de informacin razonablemente permanente y accesible. Los sistemas de gestin de bases de datos con sus interfaces grficas y herramientas, han hecho posible que las bases de datos actuales sean prcticamente entes vivos en las manos de los usuarios, aunque en realidad no sean ms que colecciones abstractas de bits organizadas alrededor de estructuras de datos, operaciones y restricciones. Todos estos elementos se agrupan en un espacio compacto denominado esquema (schema), en PostgreSQL las bases de datos se crean en un servidor, cada base de datos puede tener tantos esquemas como sea necesario. Por razones prcticas, se crea el schema por default Public, en el cual agregaremos las tablas, los dominios, los triggers y otros elementos que formarn nuestra base de datos. Para crear una base de datos, usaremos el pgAdmin y para agregar sus elementos usaremos tambin el pgAdmin con sus cuadros de dilogo o a travs de la herramienta Query Tool, escribimos y ejecutamos scripts de SQL. Un elemento muy importante al crear una tabla es el tipo de datos de cada atributo, el cual establece el dominio de los valores a almacenar. PostgreSQL tiene un rico conjunto de tipos de datos nativo disponible para los usuarios. stos pueden agregar nuevos tipos a PostgreSQL usando la instruccin CREATE TYPE. La siguiente tabla muestra todos los tipos de datos de propsito general reconocidos por PostgreSQL. Muchos de los nombres alternativos listados en la columna Alias son los usados internamente por PostgreSQL por razones histricas. En adicin, algunos tipos usados internamente o deprecados estn an disponibles, pero no aparecen en la tabla. Tabla Tipos de Datos
Alias int8 signed serial8 varbit bool Descripc Descripcin entero de ocho-bytes entero de ocho-bytes autoincrementable string de bits de longitud fija string de bits de longitud variable Boolean lgico (true/false) caja rectangular sobre un plano datos binarios (byte array) cadena de caracteres de longitud variable cadena de caracteres de longitud fija IPv4 o IPv6 network address crculo sobre un plano fecha de calendario (ao, mes, da) nmero de punto flotante de doble precisin (8 bytes) Nombre bigint bigserial bit [ (n) ] bit varying [ (n) ] boolean box bytea character varying [ (n)] character [ (n) ] cidr circle date double precision

varchar [ (n) ] char [ (n) ]

float8

Pagina 13

PRACTICA # 4. CREACIN DE BASES DE DATOS Y ESQUEMAS


Nombre inet integer interval [ fields ] [ (p)] line lseg macaddr money numeric [ (p, s) ] path point polygon real smallint serial text time [ (p) ] [ without time zone ] time [ (p) ] with time zone timestamp [ (p) ] [without time zone] timestamp [ (p) ] with time zone tsquery tsvector txid_snapshot uuid xml Alias int, int4 Descripc Descripcin IPv4 o IPv6 host address entero signado de cuatro-bytes intervalo de tiempo lnea infinita sobre un plano segmento de lnea sobre un plano MAC (Media Access Control) address cantidad monetaria numrico exacto de precisin seleccionable trayectoria geomtrica sobre un plano punto geomtrico sobre un plano trayectoria geomtrica cerrada sobre un plano nmero de punto flotante de precicin sencilla (4 bytes) entero signado de dos-bytes entero de cuatro-bytes autoincrementable cadena de caracteres de longitud variable hora (sin zona horaria) hora, incluyendo zona horaria fecha y hora (sin zona horaria) fecha y hora, incluyendo zona horaria query de bsqueda de texto documento de bsqueda de texto user-level transaction ID snapshot identificador universalmente nico datos XML

decimal [ (p, s) ]

float4 int2 serial4

timetz timestamptz

(Schemas Schemas) Esquemas PostgreSQL (Schemas)

Un cluster de BD de PostgreSQL contiene una o mas BD con nombre. Usuarios y grupos de usuarios son compartidos a travs del cluser entero, pero ningn otro dato se comparte a travs de las BD. Cualquier conexin cliente dada al servidor puede accesar solamente los datos de una sola BD, la especificada en la peticin de conexin. Nota Not a: Los usuarios de un cluster no necesariamente tienen los privilegios para accesar todas las BD en l. Una BD contiene uno o ms esquemas con nombre, los cuales a su vez contienen tablas. Los esquemas tambin contienen otras clases de objetos con nombre, incluyendo tipos de datos, funciones y operadores. El mismo nombre de objeto puede usarse sin conflicto en esquemas diferentes; por ejemplo, en los esquemas public y miesquema podemos crear la tabla persona y usarla sin ningn problema. Un usuario puede accesar objetos en cualquier esquema en la BD en la que est conectado, siempre y cuando tenga los privilegios para hacerlo. Algunas de las razones para usar estos esquemas son: Permitir que muchos usuarios usen una BD sin interferirse unos con otros. Organizar objetos de BD en grupos lgicos para hacerlos ms administrables. Poner aplicaciones de terceras partes en esquemas separados para que no se colisionen con los nombres de otros objetos.

Los esquemas son como los directorios en el SO, excepto que no pueden anidarse.

Pagina 14

PRACTICA # 4. CREACIN DE BASES DE DATOS Y ESQUEMAS


Se usa la instruccin CREATE SCHEMA para crear un esquema con el nombre apropiado. Por ejemplo: CREATE SCHEMA myschema; Para crear o accesar objetos en un esquema, se debe escribir un nombre calificado, consistiendo del nombre del esquema y el de la tabla, separado por un punto: schema.table La sintaxis ms general sera: database.schema.table As que para crear una tabla en el nuevo esquema, se usa: CREATE TABLE miesquema.mitabla ( ... ); Para eliminar (drop) un esquema si est vaco, usar: DROP SCHEMA miesquema; Si no est vaco se usa: DROP SCHEMA miesquema CASCADE; Los esquemas cuyo nombre inician con pg_ son reservados para propsitos del sistema y no los pueden crear los usuarios. Si no se especifica el esquema a usar, por default las tablas (y otros objectos) automticamente se colocan en el esquema public. Todas las BD nuevas contienen ese esquema. As, lo siguiente es equivalente: CREATE TABLE productos ( ... ); y CREATE TABLE public.productos ( ... ); bsqueda La trayectoria de bsqued a de los esquemas Por razones de comodidad, las tablas son referenciadas mediante sus nombres no calificados; es decir, con solo su nombre. El sistema determina que tablas son las que necesitamos siguiendo una trayectoria de bsqueda, que consiste en una lista de esquemas existentes en la BD conectada. La primer tabla encontrada con el nombre buscado, se convierte en la tabla significativa. En caso de no encontrarse, se reporta un error, an si la tabla existe en otro esquema (obviamente no incluido en la trayectoria de bsqueda). El primer esquema de la lista se conoce como el esquema actual. Adems de ser el primero en ser analizado, es en donde las nuevas tablas se crean si no se especifica un esquema diferente. Para mostrar la trayectoria de bsqueda actual, se usa: SHOW search_path; Por default se regresa: "$user",public El primer elemento especifica que un esquema con el mismo nombre que el usuario conectado va a ser buscado. Si tal esquema no existe, se ignora. El segundo elemento se refiere al esquema public. Como esta es la configuracin inicial, todos los objetos de nueva creacin en la BD se crean en el esquema public. Cuando los objetos son referenciados en algn otro contexto sin la calificacin del nombre del esquema (modificacin de tablas o datos, requisiciones de datos), la trayectoria de bsqueda es recorrida hasta que el objeto buscado se encuentra. Para agregar un esquema a la trayectoria de bsqueda, se usa: SET search_path TO miesquema,public;

Pagina 15

PRACTICA # 4. CREACIN DE BASES DE DATOS Y ESQUEMAS


(Se omite el $user porque no lo necesitamos por ahora.) Y entonces podremos acceder a la tabla sin la calificacin del esquema: DROP TABLE mitabla; Adems, como miesquema es el primer elemento en la lista, ahora todos los objetos sin nombre calificado se crearn en l. Si se hubiera escrito: SET search_path TO miesquema; Entonces, el esquema pblico deber accesarse con calificacin de nombre explcita. El esquema public no es especial, solo se crea por default, por lo que se puede borrar (dropped) en el momento que se quiera. La trayectoria de bsqueda de los esquemas trabaja de igual manera con nombres de tipos de datos, de funciones y de operadores. La calificacin de los nombres de tipos de datos y funciones se hace igual que con los nombres de las tablas, no as con los nombres de los operadores, que cuando se requera se debe codificar: OPERATOR(schema.operator) Se hace esto para eliminar ambigedades sintcticas. Por ejemplo: SELECT 3 OPERATOR(pg_catalog.+) 4; Esquemas Privilegio ios Esquemas y Privileg io s Por default, los usuarios no pueden accesar objetos colocados en esquemas que no le pertenecen. Para permitirles el acceso a esos objetos, el propietario del esquema deber garantizar el privilegio USAGE sobre su esquema y los privilegios adicionales sobre los objetos. El privilegio CREATE sobre el esquema, permitir a esos usuarios crear objetos nuevos en esos esquemas. Como puede verse, los privilegios CREATE y USAGE sobre el esquema public, se dan por default a todos y cualquiera de los usuarios. Para quitar privilegios se usa: REVOKE CREATE ON SCHEMA public FROM PUBLIC; (El primer public es el esquema, el segundo public se refiere a cualquier usuario. El primero es un identificador y el segundo es una palabra clave, se ve tambin la utilidad de escribir con maysculas o no. sistem stema El esquema de catlogo del si stem a En adicin a los esquemas public y los creados por el usuario, cada BD tiene un esquema pg_catalog, que contiene las tablas del sistema, los tipos de datos internos, funciones y operadores. pg_catalog est explicitamente incluido en la trayectoria de bsqueda de los esquemas. Esto asegura que todos los objetos internos siempre estn disponibles. Sin embargo, si explcitamente se coloca pg_catalog al final de la lista de esquemas, los nombres de los objetos creados por el usuario pueden sobreescribir a los objetos del sistema (si as fueran programados). Descripcin del ejercicio a implementar Para aprender a crear una base de datos en PostgreSQL, usaremos el siguiente modelo conceptual: Base de datos: Personal Tabla: Persona IDPersona Nombre Sexo

rowid Llave primaria text character[1]

Pagina 16

PRACTICA # 4. CREACIN DE BASES DE DATOS Y ESQUEMAS


FechaNacimiento Estatura Peso EstadoCivil Comentario date real real character[1] text

Especificar en cada prctica la correlacin con l o los temas y subtemas del programa de estudio vigente: Tema 2: Subtema 2.1: Administracin de bases de datos. Creacin de bases de datos.

Material y equipo usado: Equipo de cmputo personal o Laptop con sistema operativo Windows XP o Vista. SGBD PostgreSQL instalado. Metodologa: Creacin de la base de datos Personal: 1. 2. 3. 4. 5. 6. 7. 8. 9. Ejecutar el pgAdmin. Seleccionar el servidor Advanced Server 8.3R2 (localhost:5432). Entrar con el password masterkey. En el rbol, expandir y seleccionar la entrada Databases. Dar click derecho y seleccionar New Database o ir al men Edit | New Object | New Database. En el cuadro de propiedades escribir: a. Name Personal b. Comment Datos personales Las otras propiedades dejarlas como sugiere PostgreSQL (Owner, Limit Conexions, ,,,) En el cuadro de privilegios, agregar todos los privilegios a este usuario: ALL y agregar. Cerrar el cuadro de dilogo y listo, la base de datos ha sido creada en el servidor seleccionado. Esta base de datos tiene como propietario al usuario enterprisedb. Una vez creada la BD, se pueden cambiar el nombre, el propietario y los comentarios. Para ello se abre el cuadro de dilogo de propiedades y se hacen los cambios. El cuadro se abre dando doble click sobre cualquiera de las propiedades de la BD, con el men Edit | Properties o con el icono correspondiente en la barra de herramientas. Creacin de la tabla Persona usando pgAdmin: 1. 2. 3. 4. Seleccionar la base de datos Personal. Seleccionar Schemas y public. En la entrada Tables dar click derecho y seleccionar New Table. Llenar el cuadro de dilogo con: a. Name Persona b. Has OIDs seleccionar -- cada tupla tendr un identificador interno nico c. Comment Datos de cada persona 5. Agregar cada columna (atributo) de la tabla, pulsando el botn Add y escribiendo los datos correspondientes: Name, Data Type, Not Null, Comment.

Pagina 17

PRACTICA # 4. CREACIN DE BASES DE DATOS Y ESQUEMAS


6. En el cuadro Constraints, agregar (Add) la restriccin de llave primaria (primary key), identificar la restriccin como pk_persona, en el cuadro de dilogo Columns, seleccionar la columna IDPersona. 7. Pulsar el botn OK y listo, la tabla Persona se agreg a la BD Personal. Creacin de la tabla Persona usando un script en SQL: Seleccionar la base de datos Personal. Seleccionar Schemas y public. Seleccionar la entrada Tables. Abrir la herramienta Query Tool, en el men Tools | Query Tool, pulsando CTRL + E o el icono correspondiente en la barra de herramientas. 5. Escribir el script en la ventana de edicin o leerlo si se hizo previamente.
CREATE TABLE Persona ( IDPersona rowid NOT NULL, Nombre text NOT NULL, Sexo character(1) NOT NULL, FechaNacimiento date NOT NULL, Estatura real NOT NULL, Peso real NOT NULL, EstadoCivil character(1) NOT NULL, Comentario text, CONSTRAINT pk_persona PRIMARY KEY (IDPersona) )

1. 2. 3. 4.

6. Ejecutar el script y cerrar Query Tool. 7. En el rbol, seleccionar Tables, dar click derecho y Refresh para visualizar la nueva entrada. Sugerencias Sug erencias didcticas: Ver el video How To Create A Postgres Database Using pgAdmin.Avi que se encuentra en el CD de soporte o en la direccin de internet:
http://www.enterprisedb.com/learning/videos/Create_Postgres_Database_pgAdmin.do.

Ver el video Video Demo PostgreSQL PgAdmin.Avi que se encuentra en el CD de soporte. Usando pgAdmin, agregar la siguiente tabla: Base de datos: Personal Tabla: Direccion IDDireccion Calle Colonia Localizacion Ciudad Estado CodigoPostal Comentario

rowid Llave primaria text text point text text integer text

Pagina 18

PRACTICA # 4. CREACIN DE BASES DE DATOS Y ESQUEMAS


Usando Query Tool, elaborar el script para agregar la siguiente tabla: Base de datos: Personal Tabla: Role IDRole Descripcion FechaInicio Base de datos: Personal Tabla: OrganizacionCriminal Nombre EstadoLegal Estabilidad PrioridadInvestigacion EstadoProsecucion (resultados): Reporte del alumno (resultados): 1. Al terminar de crear la tabla Persona, deber obtener una pantalla como la siguiente:

rowid Llave primaria text date

Usando Query Tool, elaborar el script para agregar la siguiente tabla:

text text box text text

Llave primaria

2. De la misma manera presentar las pantallas correspondientes a las tablas Direccion, Role y OrganizacionCriminal.

Pagina 19

PRACTICA # 4. CREACIN DE BASES DE DATOS Y ESQUEMAS


Bibliografa preliminar: 1. Muller, Robert J. Database Design for Smarties : using UML for data modeling Morgan Kaufmann Publishers ISBN 1-55860-515-0 2. Elmasri, Ramez., Navathe, Shamkant B. Sistemas de Bases de datos. Conceptos fundamentales Addison Wesley Iberoamericana, S.A. ISBN 968-444-399-4 3. Documento 04 1 postgresql-8.4.3-US, manual.pdf que se encuentra en el CD de soporte.

Pagina 20

PRACTICA # 5. USO DE LA INTEGRIDAD


No. de prctica: 05 Nombre: Objetivo: Uso de la integridad. Agregar a las tablas de la base de datos las restricciones necesarias que permitan asegurar la integridad de llave primaria, de llave fornea y de datos.

La integridad de datos se refiere al estado de correccin y completitud de los Introduccin: datos ingresados en una base de datos. Los SGBD relacionales deben encargarse de mantener la integridad de los datos almacenados con respecto a las reglas predefinidas o restricciones (constraints). La integridad tambin puede verificarse inmediatamente antes del momento de introducir los datos a la base de datos (por ejemplo, en un formulario empleando validacin de datos), aunque esto aumentara la cohesin. Un claro ejemplo de error de integridad es el ingreso de un tipo de dato incorrecto dentro de un campo. Por ejemplo, ingresar un texto cuando se espera un nmero entero. Tambin un error de integridad puede ser la existencia de un valor numrico (id cliente) en la compra de un producto por parte de un cliente que no existe en su correspondiente tabla con ese nmero (integridad referencial). Tambin puede suceder que se elimine una fila padre con dos o ms filas hijos que quedaran "hurfanas".. (integridad referencial). default Valores por d efault Los valores por defaut se pueden asignar a una columna. Cuando se inserta un nuevo rengln y no se especifican valores para algunas de sus columnas, stas se llenarn con sus respectivos valores por default. Si no se especifica un valor por default, ste ser el valor null, el cual representa a un dato desconocido. En la definicin de una tabla, los valores por default se escriben despus del tipo de dato. Por ejemplo: CREATE TABLE products ( product_no integer, name text, price numeric DEFAULT 9.99 ); El valor por default puede se una expresin, la cual se evaluar al insertar el nuevo rengln, no cuando se crea la tabla. Un ejemplo comn sera para una columna de tipo timestamp darle un valor por default CURRENT_TIMESTAMP, para que inserte la hora al momento de insertar el nuevo rengln. Otro ejemplo sera generar un valor serial para cada rengln. En PostgreSQL se hace as: CREATE TABLE products ( product_no integer DEFAULT nextval(products_product_no_seq), ... ); en donde la funcin nextval() proporciona valores sucesivos de una secuencia de objetos. Esta es una prctica tan comn que existe una abreviatura para hacerla:

Pagina 21

PRACTICA # 5. USO DE LA INTEGRIDAD


CREATE TABLE products ( product_no SERIAL, ... ); (constraints onstraints) Restricciones (constraints) Los tipos de datos son una forma para limitar la clase de datos que pueden almacenarse en una tabla. Sin embargo, para muchas aplicaciones las restricciones que esto proporciona son muy gruesas. Por ejemplo, una columna que contiene el precio de un producto debera probablemente aceptar solo valores positivos. Pero, no existe un tipo de datos standard que acepte solo valores positivos. Otro punto es que se quisiera restringir los datos de una columna con respecto a otras columnas o renglones. Por ejemplo, en una tabla que contiene informacin de productos, solo deber existir un solo rengln para cada nmero de producto. SQL permite definir restricciones sobre columnas y tablas. Las restricciones dan tanto control sobre los datos en las tablas como se desee. Si un usuario intenta almacenar datos en una columna que pudieran violar una restriccin establecida, generara una situacin de error de integridad. Esto aplica an si el valor proviene del valor por default definido para esa columna. Restricciones de tipo Check Son el tipo de restriccin de integridad de datos ms genrica. Permite especificar el valor en cierta columna que satisfar una expresin Booleana (valor true). Por ejemplo, para requerir precios de productos positivos, se usara: CREATE TABLE products ( product_no integer, name text, price numeric CHECK (price > 0) ); Como se puede observar, la definicin de una restriccin se escribe despus del tipo de dato, de la misma forma que las definiciones de los valores por default. Ambas definiciones pueden escribirse en cualquier orden. Una restriccin de integridad de datos consiste de la palabra clave CHECK seguida por una expresin entre parntesis. Deber involucrar la columna a ser restringida para que tenga sentido. Se puede agregar un nombre a la restriccin para clarificar los mensajes de error y permitirnos identificar la restriccin cuando se requiera cambiarla. La sintaxis es: CREATE TABLE products ( product_no integer, name text, price numeric CONSTRAINT positive_price CHECK (price > 0) ); Para especificar el nombre de la restriccin, se usa la palabra clave CONSTRAINT seguida por un identificador y su definicin. En caso de no especificar un nombre especfico, el sistema selecciona un nombre en forma automtica. Una restriccin de tipo check puede hacer referencia a varias columnas de la tabla. Por ejemplo, si queremos almacenar un precio regular y un precio de descuento para un producto, debemos asegurarnos que el precio de descuento sea menor que el precio regular:

Pagina 22

PRACTICA # 5. USO DE LA INTEGRIDAD


CREATE TABLE products ( product_no integer, name text, price numeric CHECK (price > 0), discounted_price numeric CHECK (discounted_price > 0), CHECK (price > discounted_price) ); Las dos primeras restricciones usan la sintaxis regular. La tercera usa una sintaxis nueva. No est ligada a una columna particular, en vez de eso aparecere como un elemento separado en la lista de columnas separadas por comas. Ambos tipos de definiciones pueden aparecer mezcladas. Se dice que las dos primeras restricciones son restricciones de columna, mientras que la tercera sera una restriccin de tabla, a la que tambin se le puede asignar un identificador. Las restricciones de columna se pueden escribir tambin como restricciones de tabla, mientras que lo contrario no ser posible. El ejemplo anterior se puede escribir como: CREATE TABLE products ( product_no integer, name text, price numeric, CHECK (price > 0), discounted_price numeric, CHECK (discounted_price > 0), CHECK (price > discounted_price) ); o tambin: CREATE TABLE products ( product_no integer, name text, price numeric CHECK (price > 0), discounted_price numeric, CHECK (discounted_price > 0 AND price > discounted_price) ); Es cuestn de gustos. CREATE TABLE products ( product_no integer, name text, price numeric, CHECK (price > 0), discounted_price numeric, CHECK (discounted_price > 0), CONSTRAINT valid_discount CHECK (price > discounted_price) ); Puesto que algunas columnas o expresiones se evaluarn al valor null, podrn generar algunas confusiones. Por lo tanto se recomienda usar la restriccin not null para esa columna. Por ejemplo: CREATE TABLE products ( product_no integer NOT NULL, name text NOT NULL, price numeric );

Pagina 23

PRACTICA # 5. USO DE LA INTEGRIDAD


Por supuesto que una columna puede tener ms de una restriccin. Solo se escriben una tras otra: CREATE TABLE products ( product_no integer NOT NULL, name text NOT NULL, price numeric NOT NULL CHECK (price > 0) ); El orden no importa. La restriccin NOT NULL tiene su inverso: la restriccin NULL (no existe en el SQL std, se adapt por PostgreSQL para hacerlo compatible con otros sistemas). Sin embargo, a algunos usuarios les gusta porque facilita cambiar la restriccin en un script. Por ejemplo, se pudiera iniciar con: CREATE TABLE products ( product_no integer NULL, name text NULL, price numeric NULL ); y luego insertar la palabra NOT donde se desee. Tip: En muchos diseos de BD la mayora de las columnas deber marcarse como not null. Restricciones Unique Las restricciones Unique aseguran que los datos contenidos en una columna o grupo de columnas es nico con respecto a todos los renglones en la tabla. La sintaxis es: CREATE TABLE products ( product_no integer UNIQUE, name text, price numeric ); cuando se escribe como restriccin de columna, y: CREATE TABLE products ( product_no integer, name text, price numeric, UNIQUE (product_no) ); cuando se escribe como restriccin de tabla. Si una restriccin unique se refiere a un grupo de columnas, stas se escriben separadas por comas: CREATE TABLE example ( a integer, b integer, c integer, UNIQUE (a, c) );

Pagina 24

PRACTICA # 5. USO DE LA INTEGRIDAD


Esto especifica que la combinacin de valores en las columnas indicadas es nico en toda la tabla, aunque alguna de las columnas no necesitan ser nicas (ordinariamente no lo son). Se puede asignar un nombre de la forma usual: CREATE TABLE products ( product_no integer CONSTRAINT must_be_different UNIQUE, name text, price numeric ); En general, se viola una restriccin unique cuando hay ms de un rengln en la tabla con las columnas incluidas en la restriccin con el mismo valor. Dos valores null no se consideran iguales. Por lo que una columna restringida puede contener el valor null sin generar un error. Restriccin de lllave primaria lave Tcnicamente, una restriccin de llave primaria (primary key) es una combinacin de una restriccin unique y una not null. As, las siguientes dos definiciones de tablas aceptan los mismos datos: CREATE TABLE products ( product_no integer UNIQUE NOT NULL, name text, price numeric ); CREATE TABLE products ( product_no integer PRIMARY KEY, name text, price numeric ); La llave primaria puede considerar ms de una columna, la sintaxis es similar a la de una restriccin unique: CREATE TABLE example ( a integer, b integer, c integer, PRIMARY KEY (a, c) ); Una llave primaria indica que una columna o grupo de columnas pueden usarse como un identificador nico para los renglones en la tabla. (Esta es una consecuencia directa de la definicin de una llave primaria. Note que una restriccin unique por si misma, no provee de un identificador nico porque no excluye los valores null). Una tabla puede tener al menos una llave primaria. (Puede haber cualquier cantidad de restricciones unique o not null, las cuales funcionalmente son la misma cosa, pero solo una puede ser identificada como la llave primaria). La teora de las BD relacionales dicta que todas las tablas deben tener una llave primaria.

Pagina 25

PRACTICA # 5. USO DE LA INTEGRIDAD


Restriccin de llaves forneas (Foreign Keys)

Una restriccin de llave fornea especifica que los valores en una columna o grupo de columnas, deber coincidir con los valores que aparecen en algn rengln de otra tabla. Se dice que esto mantiene la integridad referencial entre dos tablas relacionadas. Por ejemplo: CREATE TABLE products ( product_no integer PRIMARY KEY, name text, price numeric ); Vamos a suponer que tenemos una tabla que almacena ordenes de esos productos. Queremos asegurarnos que la tabla ordenes solo contenga ordenes de productos que realmente existan. As que definimos una restriccin de llave fornea que haga referencia a la tabla de productos: CREATE TABLE orders ( order_id integer PRIMARY KEY, product_no integer REFERENCES products (product_no), quantity integer ); A partir de ahora ser imposible crear ordenes con entradas en product_no que no aparezcan en la tabla products. Se dice que la tabla orders es la tabla que necesita la referencia a y la tabla products es la tabla referenciada por. Se puede abreviar el script anterior como: CREATE TABLE orders ( order_id integer PRIMARY KEY, product_no integer REFERENCES products, quantity integer ); porque en ausencia de una lista de columnas, la llave primaria de la tabla referenciada se usa como la columna o columnas referenciadas. Una llave fornea puede restringir y referenciar un grupo de columnas. Como es usual, entonces necesita escribirse en la forma de una restriccin de tabla. Por ejemplo: CREATE TABLE t1 ( a integer PRIMARY KEY, b integer, c integer, FOREIGN KEY (b, c) REFERENCES other_table (c1, c2) ); Por supuesto, el nmero y tipo de las columnas restringidas deber coincidir con el nmero y tipo de las columnas referenciadas. Se puede asignar un nombre personalizado a una restriccin de llave fornea, en la forma usual. Una tabla puede contener ms de una restriccin de llave fornea. Esto se usa para implementar las relaciones muchos a muchos entre las tablas. Digamos que se tienen las tablas products y orders, solo que ahora se quiere permitir que una orden contenga posiblemente muchos productos (la estructura previa no lo permite). El script quedara como:

Pagina 26

PRACTICA # 5. USO DE LA INTEGRIDAD


CREATE TABLE products ( product_no integer PRIMARY KEY, name text, price numeric ); CREATE TABLE orders ( order_id integer PRIMARY KEY, shipping_address text, ... ); CREATE TABLE order_items ( product_no integer REFERENCES products, order_id integer REFERENCES orders, quantity integer, PRIMARY KEY (product_no, order_id) ); Note que la llave primaria se encima con las llaves forneas en la ltima tabla. Sabemos que las llaves forneas no permiten la creacin de ordenes que no se relacionen con algn producto existente. Pero que pasa si se elimina un producto despus de haber creado una orden que lo referenca? SQL permite manejar esto tambin. Intuitivamente, tenemos algunas opciones: No permitir eliminar un producto referenciado Borrar las ordenes tambin Alguna otra?

Para ilustrar esto, vamos a implementar la siguiente poltica en la relacin muchos a muchos del ejemplo previo: cuando alguien desee elminar un producto que est siendo referenciado por una orden (va order_items), lo desactivamos. Si alguien elimina una orden, los elementos de la orden se eliminarn tambin: CREATE TABLE products ( product_no integer PRIMARY KEY, name text, price numeric ); CREATE TABLE orders ( order_id integer PRIMARY KEY, shipping_address text, ... ); CREATE TABLE order_items ( product_no integer REFERENCES products ON DELETE RESTRICT, order_id integer REFERENCES orders ON DELETE CASCADE, quantity integer, PRIMARY KEY (product_no, order_id) );

Pagina 27

PRACTICA # 5. USO DE LA INTEGRIDAD


El borrado restrictivo y en cascada son las dos opciones ms comunes. RESTRICT previene la eliminacin de un rengln referenciado. NO ACTION significa que si existe algn rengln que est siendo referenciado cuando se checa la restriccin, se genera un error; siendo ste el comportamiento por default si no se especifica alguna otra cosa. CASCADE especifica que cuando un rengln referenciado se elimina, los renglones de referencia debern ser eliminados automticamente tambin. Hay otras dos opciones ms SET NULL y SET DEFAULT. Esto causa que las columnas de referencia se llenen con null o con valores por default especificados, respectivamente, cuando el rengln referenciado es borrado. Note que esto no excluye la observancia de las restricciones. Por ejemplo, si se especifica una accin SET DEFAULT y el valor no satisface la llave fornea, la operacin fallar. Anlogamente a ON DELETE hay un ON UPDATE que se invoca cuando el valor de una columna referenciada es cambiado. Las acciones posibles son las mismas. Finalmente, se debe mencionar que una llave fornea debe referenciar a columnas que sean o llave primaria o formen parte de una restriccin unique. Agregar nuevas restricciones Para agregar una restriccin, se agrega como restriccin de tabla, la sintaxis es por ejemplo: ALTER TABLE products ADD CHECK (name <> ); ALTER TABLE products ADD CONSTRAINT some_name UNIQUE (product_no); ALTER TABLE products ADD FOREIGN KEY (product_group_id) REFERENCES product_groups; Para agregar una restriccin not null, que es una restriccin de tipo columna, se hace: ALTER TABLE products ALTER COLUMN product_no SET NOT NULL; Como la restriccin se checar inmediatamente, los datos de la tabla debern satisfacer la restriccin antes de que pueda agregarse. Esto trabaja de la misma manera para todos los tipos de restricciones excepto para las not null. Para eliminar una restriccin not null, usar: ALTER TABLE products ALTER COLUMN product_no DROP NOT NULL; Recuerde que las restricciones not null no tienen nombre. Cambiar el valor por default de una columna Para cambiar el valor por default de una columna, se usa una instruccin como: ALTER TABLE products ALTER COLUMN price SET DEFAULT 7.77; Aqu, el cambio no afecta a los renglones existentes en la tabla, solo cambia el default para futuros INSERT. Para eliminar un valor por default, se usa: ALTER TABLE products ALTER COLUMN price DROP DEFAULT; Esto tiene el mismo efecto que poner el valor por default a null. Como consecuencia, no es un error eliminar un valor por default donde uno no haya sido definido, porque implcitamente es null.

Pagina 28

PRACTICA # 5. USO DE LA INTEGRIDAD


restriccin Eliminar una restriccin

Para eliminar una restriccin se necesita conocer su nombre. Si se le dio un nombre en la definicin de la tabla, esto es muy sencillo. De otra manera, el sistema le asign un nombre aleatorio, el cual necesitamos encontrar en la definicin de los objetos de la BD. La instruccin psql \d tablename puede ayudarnos. La instruccin es: ALTER TABLE products DROP CONSTRAINT some_name; Si se est tratando con una restriccin generada con el nombre $2 por ejemplo, hay que escribirlo entre comillas. Agregar CASCADE si se desea eliminar una restriccin que dependa de alguna otra cosa. Por ejemplo, una llave fornea qie depende de una restriccin unique o de llave primaria. Especificar en cada prctica la correlacin con l o los temas y subtemas del programa de estudio vigente: Tema 2: Subtema 2.2: Subsubtema 2.2.1 Administracin de bases de datos. Definicin del esquema de integridad. Validar y verificar integridad de entidad e integridad referencial.

Material y equipo usado: Equipo de cmputo personal o Laptop con sistema operativo Windows XP o Vista. SGBD PostgreSQL instalado. CD de soporte con los scripts a ejecutar. Metodologa: Creacin de la base de datos Integridad: 1. 2. 3. 4. 5. Ejecutar el pgAdmin. Seleccionar el servidor Advanced Server 8.3R2 (localhost:5432). Entrar con el password masterkey. En el rbol, expandir y seleccionar la entrada Databases. Dar click derecho y seleccionar New Database o ir al men Edit | New Object | New Database. 6. En el cuadro de propiedades escribir: a. Name Integridad b. Comment Implementacin de diferentes tipos de integridad 7. Las otras propiedades dejarlas como sugiere PostgreSQL (Owner, Limit Conexions, ,,,) 8. En el cuadro de privilegios, agregar todos los privilegios a este usuario: ALL y agregar. 9. Cerrar el cuadro de dilogo y listo, la base de datos ha sido creada en el servidor seleccionado. 10. Abrir Query Tools (los scripts se encuentran en la carpeta Scripts del CD de soporte). 11. Leer el script P0501 Integridad.sql. 12. Ejecutar el script y observar los mensajes que emite el SGBD. 13. Leer el script P0502 Datos Integridad.sql. 14. Ejecutar el script y anotar los mensajes que emite el SGBD.

Pagina 29

PRACTICA # 5. USO DE LA INTEGRIDAD


Sugerencias didcticas: Usando pgAdmin, agregar la siguiente tabla: Base de datos: Integridad Tabla: Role IDRole rowid Llave primaria Descripcion text FechaInicio date IDOC integer Llave fornea con Org Crim Usando Query Tool, elaborar el script para agregar la siguiente tabla: Base de datos: Integridad Tabla: OrganizacionCriminal IDOC rowid Llave primaria Nombre text EstadoLegal text [Legal,En juicio,Desconocido] Estabilidad text [Alta,Moderada,Inestable] PrioridadInvestigacion text [Intensa,En curso,En pausa] EstadoProsecucion text [Historia,Activa,Sin progreso]

(resultados): Reporte del alumno (resultados): 1. Creacin de las tablas.

Pagina 30

PRACTICA # 5. USO DE LA INTEGRIDAD


2. Listado de mensajes que emite el SGBD al violar reglas de integridad. Con xito: Query returned successfully: 1 row affected, 10 ms execution time. Con error: ERROR: new row for relation "products04" violates check constraint "positive_price" 3. Listado de acciones correctivas. El error se origin al ejecutar el query: Corrigiendo, quedara:
INSERT INTO products04 VALUES (200,'PINZAS DE PUNTA',-10.00); INSERT INTO products04 VALUES (200,'PINZAS DE PUNTA',10.00);

De esta forma el alumno redactar los dems resultados que se obtengan al ejecutar el script. 4. Reporte de la creacin de las tablas Role y OrganizacionCriminal, comentarios personales. Bibliografa preliminar: 1. Muller, Robert J. Database Design for Smarties : using UML for data modeling Morgan Kaufmann Publishers ISBN 1-55860-515-0 2. Elmasri, Ramez., Navathe, Shamkant B. Sistemas de Bases de datos. Conceptos fundamentales Addison Wesley Iberoamericana, S.A. ISBN 968-444-399-4 3. Documento 04 1 postgresql-8.4.3-US, manual.pdf que se encuentra en el CD de soporte.

Pagina 31

PRACTICA # 6. CREACION DE TABLAS


No. de prctica: 06 Nombre: Objetivo: Creacin de tablas. Insertar datos en las tablas de una BD para posteriormente manipularlos mediante instrucciones SQL.

Cuando se crea una tabla, solo se crea su esquema; es decir, no contiene Introduccin: datos. As que la siguiente accin es insertar tantos datos como necesitemos. Conceptualmente los datos se insertan un rengln a la vez. Claro que se pueden insertar tantos renglones como deseemos, tomando en consideracin que no puede insertarse menos de un rengln. An si solo se conocen los valores de algunas de las columnas se debe crear un rengln completo. Para crear un nuevo rengln, se usa la instruccin INSERT. Se requiere del nombre de la tabla y los valores de las columnas. Por ejemplo, considere la tabla products: CREATE TABLE products ( product_no integer, name text, price numeric ); El ejemplo de una instruccin para insertar un rengln, ser: INSERT INTO products VALUES (1, Cheese, 9.99); Los valores de los datos se escriben en el orden en el cual aparecen las columnas en la tabla, separados por comas. Usualmente, estos valores sern literales (constantes), pero tambien se permiten expresiones escalares. La sintaxis previa tiene el inconveniente de que se necesita saber el orden de las columnas en la tabla. Para evitar esto se pueden escribir las columnas explcitamente. Por ejemplo, las siguientes instrucciones tienen el mismo efecto:
INSERT INTO products (product_no, name, price) VALUES (1, Cheese, 9.99); INSERT INTO products (name, price, product_no) VALUES (Cheese, 9.99, 1);

Muchos usuarios consideran como una buena prctica escribir siempre los nombres de las columnas. Si no se tienen valores para todas las columnas, se pueden omitir algunas de ellas. En este caso, las columnas se llenarn con sus valores por default. Por ejemplo: INSERT INTO products (product_no, name) VALUES (1, Cheese); INSERT INTO products VALUES (1, Cheese); La segunda forma es una extensin de PostgreSQL. Llena las columnas desde la izquierda con tantos valores como se den y el resto lo llena con valores por default. Por claridad, se pueden aceptar valores por default explcitamente, para columnas individuales o para el rengln completo:
INSERT INTO products (product_no, name, price) VALUES (1, Cheese, DEFAULT);

INSERT INTO products DEFAULT VALUES;

Pagina 32

PRACTICA # 6. CREACION DE TABLAS


Se pueden insertar varios renglones en una sola instruccin: INSERT INTO products (product_no, name, price) VALUES (1, Cheese, 9.99), (2, Bread, 1.99), (3, Milk, 2.99); Por default, se encuentra activado el autocommit a on. Esto quiere decir que cada vez que ejecutemos una instruccin INSERT, se aplica un commit para que los datos queden persistentes en la BD. Asi que imaginemos la tremenda sobrecarga que se genera al insertar montones de renglones a una tabla usando INSERT. Tip: Tip Cuando se inserte un lote de datos al mismo tiempo, considere usar la instruccin COPY. No es tan flexible como la orden INSERT, pero es ms eficiente. La siguiente instruccin insertar muchos renglones invocando un solo commit, eliminando la sobrecarga que genera ejecutar cada INSERT. COPY products FROM Ec:\\Productos.txt WITH DELIMITER AS ,; Toma como entrada el archivo Productos.txt, colocado en la raz del disco C:, cada rengln de datos est formado por los valores a insertar colocados de izquierda a derecha segn las columnas y separados por comas. El trmino de un rengn se especifica con la tecla enter. El contenido del archivo Productos.txt se ve de la siguiente manera: 101,AAA,10.00 102,AAB,24.50 103,AAC,14.75 104,AAD,22.00 105,AAE,45.35 El nombre del archivo va entre apstrofos. En Windows se requiere usar el carcter de escape E para que PostgreSQL reconozca el carcter apstrofo. Se debe usar doble slash (\\) para formar el pathname correcto del archivo a leer. En entornos de produccin, los datos se toman del mundo real de acuerdo a las reglas de negocios implantadas. En entornos de programacin y acadmicos, lo conveniente es trabajar con una copia de la BD y generar camas de prueba, lo ms extensas posible tanto en extensin como en variedad de posibles valores que concuerden con los tipos de datos de las columnas creadas. ----------------------------------En esta prctica crearemos dos bases de datos, Personas y Mariposas. Para la BD Personas codificaremos un programa en Java que nos genere 3,375 nombres de personas diferentes, tomando 15 nombres propios, 15 apellidos maternos y 15 apellidos paternos, estos datos generados se pueden procesar posteriormente en una hoja de clculo para afinar su contenido. La generacin de direcciones donde residen las personas y su correlacin con ellas, se la dejamos al alumno. El diagrama UML que muestra el diseo de la BD Personas es:

Pagina 33

PRACTICA # 6. CREACION DE TABLAS

El Script para crear la tabla Persona es P0603 Persona_Crear tabla.sql:


CREATE TABLE Persona ( Nombre text Not Null, Sexo text not null check (sexo in ('F','M')), FechaDeNacimiento date not null, FechaDeDefuncion date, Estatura integer not null, Peso integer not null, EstadoCivil text not null check (EstadoCivil in ('S','C','V','D')), Comentario text, CONSTRAINT per_pk PRIMARY KEY (Nombre) );

El siguiente cdigo en Java crea una cama de prueba para la tabla Persona de 3,375 renglones.
import java.io.*; import java.util.*; public class P06NombresAleatorios { static String file = "NombresAleatorios.txt"; public static void main (String[] args) throws IOException { PrintWriter out = new PrintWriter(file); int elem = 15; String[] a = {"Artemio", "Albino", "Ausencio","Benito","Bonifacio", "Constantino", "Cirilo", "Celso", "Cutberto", "Danilo", "Donato", "Heriberto", "Ignacio", "Joel", "Leoncio"}; String[] b = {"Arango", "Benitez", "Chavez", "Dolores", "Enriquez", "Hernandez", "Jimenez", "Lopez", "Luria", "Mendez", "Minguer", "Montes", "Nocedal", "Sanchez", "Duarte"}; String[] c = {"Alavez", "Bueno", "Carmona", "Diaz", "Elorza", "Heras","Jacome", "Juarez", "Barrera", "Cervantes", "Miramontes", "Moreno", "Narro", "Zurita", "Garcia"}; String[] ec = {"S", "C", "D", "V"}; String s String fn = ""; = "";

Pagina 34

PRACTICA # 6. CREACION DE TABLAS


Random r int eciv int dia, mes, int estat int peso = new Random(); = 0; ao; = 0; // estatura en cm 100 .. 190 = 0; // peso en kg 50 .. 120

for (int i = 0; i <= (elem - 1); i++) for (int j = 0; j <= (elem - 1); j++) for (int k = 0; k <= (elem - 1); k++) { dia = r.nextInt(28) + 1; mes = r.nextInt(12) + 1; ao = r.nextInt(31) + 1950; fn = dia + "/" + mes + "/" + ao + ","; estat = r.nextInt(91) + 100; peso = r.nextInt(71) + 50; eciv = r.nextInt(4); s += a[i] + " " + b[j] + " " + c[k] + ",M," + fn + "01/01/1900," + estat + "," + peso + "," + ec[eciv] + ",null"; out.println(s); s = ""; } out.close(); System.out.println("Proceso terminado, " + (elem nombres generados"); } }

* elem

* elem)

"

El archivo de datos creado se copia a la raz del disco C:, para facilitar su bsqueda. Un extracto de este archivo se ve como sigue:
Artemio Artemio Artemio Artemio Artemio Artemio Artemio Artemio Arango Alavez,M,23/10/1977,01/01/1900,127,112,S,null Arango Bueno,M,16/5/1973,01/01/1900,108,105,C,null Arango Carmona,M,20/7/1968,01/01/1900,135,96,S,null Benitez Alavez,M,13/8/1963,01/01/1900,120,50,D,null Benitez Bueno,M,26/6/1966,01/01/1900,148,56,C,null Chavez Garcia,M,12/6/1977,01/01/1900,161,77,S,null Dolores Alavez,M,10/8/1964,01/01/1900,146,65,C,null Dolores Bueno,M,11/3/1976,01/01/1900,106,75,D,null

La instruccin para insertar los datos en la tabla persona es:


COPY Persona FROM E'c:\\NombresAleatorios.txt' WITH DELIMITER AS ',';

----------------------------------Para la BD Mariposas, los datos fueron tomados del mundo real usando una muestra de 20 familias. Se tienen los nombres de las familias, gneros, especies y mariposas existentes en todo el mundo. El diagrama UML que muestra el diseo de la BD Mariposas es:

Pagina 35

PRACTICA # 6. CREACION DE TABLAS

El script para crear las tablas: P0601 Mariposas_Crear tablas.sql es


CREATE TABLE Familia ( FNombre character varying(20) not null, CONSTRAINT fam_pk PRIMARY KEY (FNombre) ); CREATE TABLE Genero ( GNombre character varying(20) not null, FNombre character varying(20) not null, CONSTRAINT gen_pk PRIMARY KEY (GNombre), CONSTRAINT genfam_fk FOREIGN KEY(FNombre) REFERENCES Familia(FNombre) ON DELETE CASCADE ); CREATE TABLE Especie ( ENombre character varying(20) not null, GNombre character varying(20) not null, CONSTRAINT esp_pk PRIMARY KEY (ENombre), CONSTRAINT espgen_fk FOREIGN KEY(GNombre) REFERENCES Genero(GNombre) ON DELETE CASCADE ); CREATE TABLE Mariposa ( MNombre character varying(40) not null, ENombre character varying(20) not null, MSexo char not null, CONSTRAINT mar_pk PRIMARY KEY (Mnombre,ENombre), CONSTRAINT maresp_fk FOREIGN KEY(ENombre) REFERENCES Especie(ENombre) ON DELETE CASCADE );

Los scripts con los datos a insertar no se listan en este espacio por ser muy extensos. Especificar en cada prctica la correlacin con l o los temas y subtemas del programa de estudio vigente: Tema 2: Subtema 2.2: Subsubtema 2.2.1 Administracin de bases de datos. Definicin del esquema de integridad. Validar y verificar integridad de entidad e integridad referencial.

Pagina 36

PRACTICA # 6. CREACION DE TABLAS


Material y equipo usado: Equipo de cmputo personal o Laptop con sistema operativo Windows XP o Vista. SGBD PostgreSQL instalado. Java SE y un escritorio de trabajo (DrJava) Hoja de clculo CD de soporte con los scripts a ejecutar. Metodologa: Creacin de la base de datos Mariposas: Ejecutar el pgAdmin. Seleccionar el servidor Advanced Server 8.3R2 (localhost:5432). Entrar con el password masterkey. En el rbol, expandir y seleccionar la entrada Databases. Dar click derecho y seleccionar New Database o ir al men Edit | New Object | New Database. 6. En el cuadro de propiedades escribir: c. Name Mariposas d. Comment Muestra real de mariposas 7. Las otras propiedades dejarlas como sugiere PostgreSQL (Owner, Limit Conexions, ,,,) 8. En el cuadro de privilegios, agregar todos los privilegios a este usuario: ALL y agregar. 9. Cerrar el cuadro de dilogo y listo, la base de datos ha sido creada en el servidor seleccionado. 10. Abrir Query Tools (los scripts se encuentran en la carpeta Scripts del CD de soporte). 11. Leer el script P0601 Mariposas_Crear tablas.sql. 12. Ejecutar el script y observar los mensajes que emite el SGBD. 13. Para insertar los datos ejecutar los scripts: P0602 Mariposas_Insertar datos ?????.sql en donde, ????? corresponde a Familia, Especie, Genero y Mariposa. 14. Anotar los mensajes que emite el SGBD. Creacin de la base de datos Personas: Ejecutar el pgAdmin. Seleccionar el servidor Advanced Server 8.3R2 (localhost:5432). Entrar con el password masterkey. En el rbol, expandir y seleccionar la entrada Databases. Dar click derecho y seleccionar New Database o ir al men Edit | New Object | New Database. 6. En el cuadro de propiedades escribir: e. Name Personas f. Comment Datos generados aleatoriamente 7. Las otras propiedades dejarlas como sugiere PostgreSQL (Owner, Limit Conexions, ,,,) 8. En el cuadro de privilegios, agregar todos los privilegios a este usuario: ALL y agregar. 9. Cerrar el cuadro de dilogo y listo, la base de datos ha sido creada en el servidor seleccionado. 10. Abrir Query Tools (los scripts se encuentran en la carpeta Scripts del CD de soporte). 11. Leer el script P0603 Persona_Crear tabla.sql. 12. Ejecutar el script y observar los mensajes que emite el SGBD. 13. Ejecute el DrJava o cualquier otro escritorio Java, abra el programa P06NombresAleatorios.java que se encuentra en el directorio Programas del CD de soporte. 1. 2. 3. 4. 5. 1. 2. 3. 4. 5.

Pagina 37

PRACTICA # 6. CREACION DE TABLAS


14. Copie el archivo NombresAleatorios.txt a la raz del disco C: 15. Ejecute el script P0603 Persona_Insertar datos Persona con COPY.sql. Sugerencias didcticas: Usando pgAdmin, agregar la tabla Direccion: Codificar un programa en Java para generar una cama de prueba aceptable para esta tabla. Puede auxiliarse con la hoja de clculo Excel para afinar los datos. Insertar los datos con la instruccin COPY.

(resultados): Reporte del alumno (resultados): 1. Creacin de las tablas. 2. Creacin de las camas de prueba. 3. Un resumen de las actividades realizadas para generar las camas de prueba. Bibliografa preliminar: 1. Muller, Robert J. Database Design for Smarties : using UML for data modeling Morgan Kaufmann Publishers ISBN 1-55860-515-0 2. Elmasri, Ramez., Navathe, Shamkant B. Sistemas de Bases de datos. Conceptos fundamentales Addison Wesley Iberoamericana, S.A. ISBN 968-444-399-4 3. Documento 04 1 postgresql-8.4.3-US, manual.pdf que se encuentra en el CD de soporte.

Pagina 38

PRACTICA # 7. ACCESO A LA BASE DE DATOS


No. de prctica: 07 Nombre: Objetivo: Acceso a la base de datos. Utilizar los datos previamente insertados para procesarlos y obtener informacin til para el usuario, mediante el uso de SQL; asi mismo, manipular la BD insertando nuevos renglones, actualizando valores y/o eliminando renglones.

Actualizacin de datos. La modificacin de los datos existentes en la BD se Introduccin: conoce como actualizacin (updating). Se pueden actualizar renglones individuales, todos los renglones de la BD o un subconjunto de ellos. Cada columna puede ser actualizada separadamente, las restantes no se ven afectadas. Para actualizar los datos se usa la orden UPDATE, que requiere tres piezas de informacin: 1. El nombre de la tabla y columna a actualizar. 2. El nuevo valor de la columna. 3. El rengln o renglones a actualizar. Puesto que SQL en general, no proporciona un identificador nico para los renglones. Por lo tanto no siempre es posible especificar directamente que rengln actualizar. En vez de esto, se deber especificar la condicin que el rengln a actualizar debe cumplir. Solamente si se tiene una llave primaria se pueden direccionar renglones individuales escogiendo una condicin que coincida con esa llave. Por ejemplo, para actualizar todos los productos que tiene un precio de 5 a un nuevo precio de 10, la instruccin es:
UPDATE productos SET precio = 10 WHERE precio = 5;

Esto podra actualizar cero, uno o muchos renglones. No es un error intentar una actualizacin que no tenga renglones coincidentes con la condicin. Como puede verse, la palabra UPDATE es seguida por el nombre de la tabla. Este nombre puede tener el nombre del esquema especfico donde se encuentra, o de otra manera, se buscar en la lista de esquemas. Luego va la palabra SET seguida por el nombre de la columna, un signo igual y el nuevo valor. Este valor puede ser una expresin escalar, no solo una constante. Por ejemplo, si se quiere elevar el precio un diez porciento, se escribira:
UPDATE productos SET precio = precio * 1.10;

Al no utilizar la clusula WHERE, estaremos actualizando todos los renglones de la tabla. Se pueden actualizar ms de una columna en una misma instruccin UPDATE escribiendo ms de una asignacin en la clusula SET. Por ejemplo:
UPDATE tabla SET a = 5, b = 3, c = 1 WHERE a > 0;

----------------------------------Eliminacin (deleting) de datos. De la misma manera en que insertamos renglones completos, as mismo eliminamos renglones completos desde una tabla. La nica forma de eliminar renglones es a travs de la especificacin de condiciones que los renglones a eliminar deben cumplir. Si no se especifica una condicin, se eliminan todos los renglones de esa tabla. Se usa la instruccin DELETE para eliminar renglones; la sintaxis es:
DELETE FROM tabla [WHERE condicion];

Pagina 39

PRACTICA # 7. ACCESO A LA BASE DE DATOS


Por ejemplo, para eliminar los renglones donde el precio es de 10, la instruccin es:
DELETE FROM productos WHERE precio = 10;

Y la instruccin:
DELETE FROM productos;

Dejara totalmente vaca la tabla! As que cuidado con lo que se escribe. ----------------------------------El proceso o instruccin para recuperar datos desde una BD se llama query (consulta). En SQL la orden SELECT se usa para especificar queries. Su sintaxis general es:
WITH with_queries] SELECT lista_seleccion FROM expresion_tabla [especificacion_sort]

La clase ms simple de un query es: SELECT * FROM tabla1; Suponiendo que existe tabla1, esta instruccin debera recuperar todos los renglones y columnas de ella. El * significa recuperar todas las columnas. Aunque la lista de seleccin puede ser un subconjunto de las columnas vlidas o clculos con ellas. Por ejemplo: SELECT a, b + c FROM tabla1; FROM tabla1 es una simple clase de expresin de tabla: lee solo una tabla. En general, la expresin de tabla puede contener constructores complejos de tablas base, reuniones (joins) y subqueries. Sin embargo, omitiendo la expresin de tabla por completo, se puede usar la instruccin SELECT como una calculadora: SELECT 3 * 4; aumentando su utilidad si la lista de seleccin regresa resultados variables. Por ejemplo: SELECT random(); Las expresiones de tabla calculan una tabla. Contiene una clsula FROM que es seguida opcionalmente por WHERE, GROUP BY y HAVING. Las expresiones triviales simplemente se refieren a una tabla en el disco llamada tabla base, pero se pueden usar expresiones ms complejas para modificar o combinar las tablas base de varias maneras. Las clusulas opcionales WHERE, GROUP BY y HAVING especifican una serie de transformaciones sucesivas ejecutadas sobre las tablas derivadas de la clusula FROM. Todas estas transformaciones producen una tabla virtual que proporciona los renglones que son pasados a la lista de seleccin para calcular los renglones de salida del query. La clusula FROM obtiene una nueva tabla a partir de una o ms tablas dadas en una lista de referencia de tablas separada por comas.
FROM referencia_tabla [,referencia_tabla [, ...]]

Una referencia de tabla puede ser un nombre de tabla (posiblemente calificado con el nombre del esquema) o una tabla derivada tal como una subconsulta, una reunin de tablas o combinaciones complejas de estas. Si se incluye ms de una tabla en la clusula FROM, se obtiene el producto cartesiano o join_cruzado para formar la tabla virtual intermedia que puede entonces ser sujeta a transformaciones por las clusulas WHERE, GROUP BY y HAVING. Reunin de tablas. Una tabla reunida (joined table) es producto de dos tablas (virtuales o reales) de acuerdo a las reglas del tipo particular de reunin: Inner, outer y cross-join.
T1 CROSS JOIN T2

Para cada combinacin posible de renglones de T1 y T2 (producto cartesiano), la tabla reunida contendr un rengln consistente de todas las columnas enT1 seguida por todas las columnas en

Pagina 40

PRACTICA # 7. ACCESO A LA BASE DE DATOS


T2. Si las tablas tienen N y M renglones respectivamente, la tabla resultante tendr N * M renglones.
FROM T1 CROSS JOIN T2 es equivalente a FROM T1, T2 y tambin a FROM T1 INNER JOIN T2 ON TRUE

La condicin del join se especifica en las clusulas ON o USING o implcitamente por la palabra NATURAL. ON es la clase de condicin de join ms general. Toma un valor booleano de la misma clase que WHERE. Un par de renglones de T1 y T2 coinciden si la expresin ON se evala a true para ellos. USING es una abreviatura, toma una lista de nombres de columnas separadas por comas, las cuales deben ser comunes a ambas tablas a reunir y forma una condicin de join que especifica igualdad en cada uno de esos pares de columnas. USING (a, b, c) equivale a (t1.a = t2.a AND t1.b = t2.b AND t1.c = t2.c). NATURAL es una forma abreviada de USING: forma una lista USING consistente en todos los nombres de columnas que aparecen en ambas tablas de entrada. Como con USING, estas columnas apararecern solamente una sola vez en la tabla resultante. Los tipos posibles de joins calificados son: INNER JOIN Para cada rengln R1 de T1, la tabla reunida tiene un rengln para cada rengln en T2 que satisface la condificin de reunin. LEFT OUTER JOIN Primero se ejecuta un inner join, luego, para cada rengln en T1 que no satisface la condicin de reunin con algn rengln en T2, un rengln es aadido con valores nulos en las columnas T2. De esta forma, la tabla resultante tiene siempre al menos un rengln para cada rengln en T1. RIGHT OUTER JOIN Al contrario del left outer join, la tabla resultante siempre tendr al menos un rengln para cada rengln en T2. FULL OUTER JOIN Combina todos los renglones de ambas tablas, llenando con valores nulos las columnas de los renglones provenientes de T1 y T2 que no satisfagan la condicin de reunin. Se pueden encadenar joins de todos los tipos permitidos o anidarlos, incluso T1 y T2 pueden ser tablas reunidas. Se pueden usar parentsis encerrando las clusulas JOIN para controlar el orden de ejecucin. Si no los hay, la reunin se ejecuta de izquierda a derecha. ----------------------------------Se puede dar un nombre temporal a las tablas y referencias de tablas complejas para ser usado por referencias a la tabla resultante en el resto del query. A este nombre se le llama alias y puede ser cualquier identificador. Para crear un alias se escribe:
FROM referencia_de_tabla AS alias o FROM referencia_de_tabla alias

Una vez asignado un alias, no se puede utilizar posteriormente el nombre original de la tabla. Los parntesis se usan para resolver ambigedades. -----------------------------------

Pagina 41

PRACTICA # 7. ACCESO A LA BASE DE DATOS


Las subconsultas (subqueries) que especifiquen una tabla derivada debern estar entre parntesis y se les debe asignar un alias.
FROM (SELECT * FROM tabla1) AS alias

Este ejemplo es equivalente a FROM tabla1 AS alias. Una subconsulta tambin puede ser una lista de valores (values).
FROM (VALUES (ana, sanchez), (memo, juarez), (jose, blanco)) AS nombres(pila, apellido)

----------------------------------La sintaxis de la clusula WHERE es: WHERE condicion_de_bsqueda La condicin de bsqueda es cualquier expresin que regresa un valor de tipo boolean. Una vez procesada la clusula FROM, cada rengln de la tabla virtual derivada se checa contra la condicin de bsqueda. Si el resultado es true, el rengln se mantiene en la tabla resultante, de otra manera, si el resultado es false o null, el rengln se descarta. La condicin de bsqueda tpicamente hace referencia al menos a una columna de la tabla generada. Algunos ejemplos de WHERE son:
SELECT SELECT SELECT SELECT SELECT SELECT ... ... ... ... ... ... FROM FROM FROM FROM FROM FROM fdt fdt fdt fdt fdt fdt WHERE WHERE WHERE WHERE WHERE WHERE c1 > 5 c1 IN (1, 2, 3) c1 IN (SELECT c1 FROM t2) c1 IN (SELECT c3 FROM t2 WHERE c2 = fdt.c1 + 10) c1 BETWEEN (SELECT c3 FROM t2 WHERE c2 = fdt.c1 + 10) AND 100 EXISTS (SELECT c1 FROM t2 WHERE c2 > fdt.c1)

fdt es la tabla derivada o resultante de la clusula FROM. Los renglones que no cumplan con la condicin de bsqueda se eliminarn de fdt. ----------------------------------Despus de pasar el filtro WHERE, la tabla derivada podria ser sujeta de un agrupamiento usando la clusula GROUP BY y de eliminacin de renglones de grupo usando la clsula HAVING. Por ejemplo, la siguiente instruccin obtiene sumas de renglones agrupados por nombre:
=> SELECT x, sum(y) FROM test1 GROUP BY x;

x | sum ---+----a | 4 b | 5 c | 2 (3 rows)

Si queremos filtrar los renglones agrupados, agregamos un filtro con la clusula HAVING, como:
=> SELECT x, sum(y) FROM test1 GROUP BY x HAVING sum(y) > 3;

x | sum ---+----a | 4 b | 5 (2 rows)


=> SELECT x, sum(y) FROM test1 GROUP BY x HAVING x < c;

x | sum ---+----a | 4 b | 5 (2 rows)

-----------------------------------

Pagina 42

PRACTICA # 7. ACCESO A LA BASE DE DATOS


La expresin de tabla en la orden SELECT construye una tabla virtual intermedia formada posiblemente con tablas combinadas, vistas, renglones eliminados, agrupamiento, etc. Finalmente esta tabla se pasa al procesamiento de lista de seleccin. sta determina que columnas de la tabla intermedia formarn la tabla resultante. El tipo ms simple de una lista de seleccin es * que emite todas las columnas que la expresin de tabla produce. Por ejemplo SELECT a, b, c FROM ... Los nombres de columnas a, b y c son nombres actuales o alias. Si ms de una tabla referenciada tiene una columna con el mismo nombre, debe darse tambin el nombre de la tabla correspondiente: SELECT tbl1.a, tbl2.a, tbl1.b FROM ... Si se usa una expresin de valores arbitraria en la lista de seleccin, conceptualmente se agrega una columna virtual nueva a la tabla resultante. sta expresin se evala una vez por cada rengln. Se pueden asignar etiquetas a los nombres de las columnas o funciones usadas en la lista de seleccin. Por ejemplo: SELECT a AS value, b + c AS sum FROM ... La palabra AS es opcional. Ahora, si se usa una palabra reservada, sta deber escribirse entre comillas. Por ejemplo, VALUE es una palabra reservada, as que la siguiente instruccin no trabajar:
SELECT a value, b + c AS sum FROM ...

Pero sta si:

SELECT a "value", b + c AS sum FROM ...

Una vez que la lista de seleccin ha sido evaluada, la tabla resultante puede opcionalmente sujetarse a la eliminacin de renglones duplicados. Para hacerlo se hace: SELECT DISTINCT
select_list ...

Con esta forma, solo el primer rengln de los duplicados se tomar en cuenta. Para determinar el rengln correcto, deber agregarse al query un ordenamiento (ORDER BY ) sobre un nmero suficiente de columnas. El procesamiento de DISTINCT ocurre despus de ORDER BY Los resultados de dos queries se pueden combinar usando las operaciones de conjunto (set) union, intersection y difference. La sintaxis es:
query1 UNION [ALL] query2 query1 INTERSECT [ALL] query2 query1 EXCEPT [ALL] query2

las operaciones de conjunto se pueden anidar y encadenar, por ejemplo:


query1 UNION query2 UNION query3

la cual se ejecuta como:


(query1 UNION query2) UNION query3

UNION agrega el resultado de query2 al resultado de query1. Elimina renglones duplicados a menos que se especifique UNION ALL. INTERSECT regresa todos los renglones coincidentes que resulten de query1 y query2. Se eliminan duplicados a menos que se especifique INTERSECT ALL. EXCEPT regresa todos los renglones que estn en el resultado de query1 pero que no estn en el resultado de query2 (es en realidad una diferencia entre conjuntos de datos). -----------------------------------

Pagina 43

PRACTICA # 7. ACCESO A LA BASE DE DATOS


Despus que un query ha producido la tabla de salida, puede ser ordenada (sort). Si no se especifica un ordenamiento, los renglones sern entregados en un orden no especificado. La clusula ORDER BY especifica el ordenamiento que se desea dar a la tabla de salida:
SELECT select_list FROM table_expression ORDER BY sort_expression1 [ASC | DESC] [NULLS { FIRST | LAST }] [, sort_expression2 [ASC | DESC] [NULLS { FIRST | LAST }] ...]

NULLS FIRST o LAST sirve para especificar si los renglones con valores null se colocan al principio o al final de la tabla resultante. ASC y DESC son orden ascendente y descendente respectivamente. Son independientes y se aplican a una sola columna a ordenar. As: ORDER BY x, y DESC significa ORDER BY x ASC, y DESC, que no es lo mismo que ORDER BY x DESC, y DESC. Una expresin sort puede tambin ser la etiqueta de la columna o el nmero de la columna de salida:
SELECT a + b AS suma, c FROM tabla1 ORDER BY suma; SELECT a, max(b) FROM tabla1 GROUP BY a ORDER BY 1;

----------------------------------LIMIT y OFFSET permiten recuperar solo una porcin de los renglones que son generados por el resto del query:
SELECT lista_de_seleccion FROM expresion_de_tabla [ ORDER BY ... ] [ LIMIT { number | ALL } ] [ OFFSET number ]

Limit limita el nmero mximo de renglones de salida al nmero especificado. Offset brinca el nmero de renglones al principio de la tabla de salida al nmero especificado. Se pueden usar ambos en un mismo query. ----------------------------------VALUES proporciona una manera para generar una tabla de constantes que puede usarse en un query sin tener que crear y llenar una tabla en el disco: la sintaxis es
VALUES ( expression [, ...] ) [, ...]

Cada lista entre parntesis de expresiones genera un rengln en la tabla. sta deber tener el mismo nmero de elementos del mismo tipo de datos. Por ejemplo:
VALUES (1, uno), (2, dos), (3, tres);

Regresar una tabla de dos columnas y tres renglones, equivale a:


SELECT 1 AS column1, one AS column2 UNION ALL SELECT 2, two UNION ALL SELECT 3, three;

Por default, PostgreSQL asigna los nombres column1, column2, etc. a las columnas de una tabla VALUES.

Pagina 44

PRACTICA # 7. ACCESO A LA BASE DE DATOS


PostgreSQL proporciona en su Query Tool, un Graphical Query Builder (constructor grfico de consultas), el cual puede usarse para generar consultas de manera intuitiva. Si queremos obtener una lista de mariposas, listando los nombres de sus especies y gneros, el procedimiento es: 1. Abrir Query Tool. 2. Ir a la solapa Graphical Query Builder. 3. Abrir el Schema donde se encuentre la BD a consultar (en este caso ser public). 4. Seleccionar con doble click las tablas a usar, en la ventana grfica, arrastrar los iconos de las tablas para colocarlas a gusto. 5. En las tablas, seleccionar las columnas a listar. 6. En la solapa Columns se puede modificar el orden de aparicin de las columnas en la lista de seleccin. 7. Seleccionar la columna de llave fornea de una tabla y arrastrarla sobre el nombre de la columna de la llave primaria de su tabla referenciada para programar el join.

8. Programar un criterio de seleccin si se desea en la solapa Criteria.

9. Programar una secuencia de ordenamiento si se desea en la solapa Ordering.

10. En la solapa Joins se puede modificar el operador de join.

Pagina 45

PRACTICA # 7. ACCESO A LA BASE DE DATOS


De esta manera nuestra consulta quedara as:

Especificar en cada prctica la correlacin con l o los temas y subtemas del programa de estudio vigente: Tema 2: Subtema 2.2: Subsubtema 2.2.1 Administracin de bases de datos. Definicin del esquema de integridad. Validar y verificar integridad de entidad e integridad referencial.

Material y equipo usado: Equipo de cmputo personal o Laptop con sistema operativo Windows XP o Vista. SGBD PostgreSQL instalado. CD de soporte. Metodologa: Preparacin de la base de datos Mariposas: 1. 2. 3. 4. 5. 6. Ejecutar el pgAdmin. Seleccionar el servidor Advanced Server 8.3R2 (localhost:5432). Entrar con el password masterkey. En el rbol, expandir y seleccionar la entrada Databases. Seleccionar la BD Mariposas para conectarla y dejarla lista para su uso. Obtener una lista de todas las mariposas mostrando los nombres de las familias, gneros, especies y mariposas, ordenadas de esa manera.
SELECT fnombre, gnombre, enombre, mnombre FROM familia f NATURAL JOIN genero g NATURAL JOIN especie e NATURAL JOIN mariposa m ORDER BY f.fnombre, g.gnombre, e.enombre, m.mnombre;

Pagina 46

PRACTICA # 7. ACCESO A LA BASE DE DATOS


7. Acotar la lista previa con mariposas cuyo nombre inicia con la letra E.
SELECT fnombre, gnombre, enombre, mnombre FROM familia f NATURAL JOIN genero g NATURAL JOIN especie e NATURAL JOIN mariposa m WHERE m.mnombre LIKE 'E%' ORDER BY f.fnombre, g.gnombre, e.enombre, m.mnombre;

8. Acotar an ms la lista previa con mariposas cuyo nombre de familia tenga una letra P.
SELECT fnombre, gnombre, enombre, mnombre FROM familia f NATURAL JOIN genero g NATURAL JOIN especie e NATURAL JOIN mariposa m WHERE m.mnombre LIKE 'E%' AND f.fnombre LIKE '%P%' ORDER BY f.fnombre, g.gnombre, e.enombre, m.mnombre;

9. Obtener el nmero de mariposas cuyo nombre de familia tenga una letra P.


SELECT COUNT(*) "Num Mariposas" FROM familia f NATURAL JOIN genero g NATURAL JOIN especie e NATURAL JOIN mariposa m WHERE m.mnombre LIKE 'E%' AND f.fnombre LIKE '%P%';

El anlisis grfico de esta consulta es:

10. Agregar las siguientes mariposas:


FAMILIA GNERO ESPECIE MARIPOSA SEXO

PIERIDAE

PHOEBIS PHIERINAE

PHILEA CHIRICAHUA PINE W FLORIDA WHITE SPRING WHITE CHECKED WHITE CABBAGE WHITE GREAT SOUTHERN W HOWARDS WHITE

ORANGE-BARRED SULPHUR NEOPHASIA TERLOOTII APPIAS DRUSILLA POEYI PIERIS SISYMBRII PIERIS PROTODICE PIERIS RAPHAE ASCIA MONUSTE MONUSTE ASCIA HOWARTHI

M M M M M M M M

Insertar los renglones en las tablas correspondientes. 11. Codificar una instruccin SELECT que muestre los renglones insertados.
SELECT fnombre, gnombre, enombre, mnombre FROM familia f NATURAL JOIN genero g NATURAL JOIN especie e NATURAL JOIN mariposa m WHERE f.fnombre = 'PIERIDAE' AND g.gnombre LIKE 'PH%' ORDER BY f.fnombre, g.gnombre, e.enombre, m.mnombre;

Pagina 47

PRACTICA # 7. ACCESO A LA BASE DE DATOS


12. Modificar el sexo de estos renglones insertados.
UPDATE mariposa m SET m.sexo = 'F' WHERE m.enombre IN ( SELECT e.enombre FROM familia f, genero g, especie e WHERE f.fnombre = 'PIERIDAE' AND g.gnombre LIKE 'PH%' AND g.gnombre = e.gnombre);

13. Ejecute de nuevo la consulta del pasoo 11 para verificar que la actualizacin se hizo correctamente. 14. Elimine el gnero PHOEBIS de la familia PIERIDAE. Puesto que las tablas relacionadas se crearon con la clusula ON DELETE CASCADE, no debe presentarse ningn error. 15. Ejecute de nuevo la consulta del paso 11 para verificar que la eliminacin se hizo correctamente. Sugerencias Sugerencias didcticas: Revisar la pgina: http://www.asturnatura.com/familia/pieridae.html para recuperar ms registros de mariposas, los cuales se insertarn en las tablas correspondientes. Codificar una consulta que presente la lista de mariposas recin insertadas.

(resultados): Reporte del alumno (resultados): 1. Listas de resultados de las consultas. Bibliografa preliminar: 1. Muller, Robert J. Database Design for Smarties : using UML for data modeling Morgan Kaufmann Publishers ISBN 1-55860-515-0 2. Elmasri, Ramez., Navathe, Shamkant B. Sistemas de Bases de datos. Conceptos fundamentales Addison Wesley Iberoamericana, S.A. ISBN 968-444-399-4 3. Documento 04 1 postgresql-8.4.3-US, manual.pdf que se encuentra en el CD de soporte.

Pagina 48

PRACTICA # 8. MONITOREO DE BASES DE DATOS


No. de prctica: 08 Nombre: Objetivo: Monitoreo de bases de datos. Revisar las facilidades que presta PostgreSQL para mejorar el comportamiento y mantener un buen performance de la base de datos.

El rendimiento (performance) de un query puede ser afectado por muchas Introduccin: cosas. Algunas de ellas las puede controlar el usuario, mientras que otras estn ligadas al diseo del sistema. PostgreSQL establece un plan de ejecucin para cada query que recibe. Selecciona el plan correcto para hacer coincidir la estructura del query con las propiedades de los datos, lo que es absolutamente crtico para un buen rendimiento; es decir, el DBMS incluye un complejo planeador que intenta todas las veces escoger buenos planes de ejecucin. Para ver el plan que PostgreSQL crea para un query dado, se usa la instruccin EXPLAIN. La estructura de un plan para la ejecucin de un query es un rbol de nodos planos. Los nodos del nivel inferior regresan renglones bsicos de la tabla consultada. Los tipos de nodos de rastreo dependen del mtodo de acceso utilizado, en este sentido entonces, hay rastreos secuenciales, indizados, de bitmaps. Si el query regresa un join, agregacin, ordenamiento u otras operaciones sobre los renglones bsicos, se usarn nodos a un nivel superior para realizar estas operaciones. El resultado que entrega EXPLAIN tiene una lnea para cada nodo en el rbol, mostrando el tipo de nodo bsico ms el costo estimado que hace el planeador para la ejecucin de ese plan. La primer lnea (el nodo superior) tiene el costo total estimado de ejecucin, es el nmero que el planeador busca minimizar. Por ejemplo: EXPLAIN SELECT * FROM mariposa;
QUERY PLAN Seq Scan on mariposa (cost=0.00..3.62 rows=162 width=34)

Los nmeros mostrados de izquierda a derecha significan lo siguiente: Costo estimado de arranque (es el tiempo gastado antes de poder iniciar el rastreo de salida, por ejemplo, el tiempo necesario para preparar la ordenacin de los datos). Costo estimado total (en el caso de que se recuperen todos los renglones (aunque podra no ser as, por ejemplo, si se usa una clusula LIMIT, este costo tender a ser menor). Nmero estimado de renglones de salida para este nodo o plan. Ancho promedio estimado en bytes de los renglones de salida para este plan.

Los costos se miden en unidades arbitrarias determinadas por los parmetros de costo del planeador. Hay que notar que el costo de un nodo de nivel superior toma en cuenta los costos de sus subnodos. Los costos solo reflejan cosas que el planeador puede controlar; es decir, el tiempo que se lleva en transmitir los datos a las salidas del usuario son descartadas porque dependen de otros factores. El query
EXPLAIN SELECT f.fnombre, g.gnombre, e.enombre, m.mnombre FROM familia f, genero g, especie e, mariposa m WHERE m.enombre = e.enombre AND e.gnombre = g.gnombre AND g.fnombre = f.fnombre;

Pagina 49

PRACTICA # 8. MONITOREO DE BASES DE DATOS


nos entrega los siguiente valores:
QUERY PLAN Hash Join (cost=9.76..15.61 rows=162 width=54) Hash Cond: ((m.enombre)::text = (e.enombre)::text) -> Seq Scan on mariposa m (cost=0.00..3.62 rows=162 width=32) -> Hash (cost=8.27..8.27 rows=119 width=31) -> Hash Join (cost=4.44..8.27 rows=119 width=31) Hash Cond: ((e.gnombre)::text = (g.gnombre)::text) -> Seq Scan on especie e (cost=0.00..2.19 rows=119 width=20) -> Hash (cost=3.76..3.76 rows=55 width=21) -> Hash Join (cost=1.45..3.76 rows=55 width=21) Hash Cond: ((g.fnombre)::text = (f.fnombre)::text) -> Seq Scan on genero g (cost=0.00..1.55 rows=55 width=21) -> Hash (cost=1.20..1.20 rows=20 width=11) -> Seq Scan on familia f (cost=0.00..1.20 rows=20 width=11)

y el query
EXPLAIN SELECT f.fnombre, g.gnombre, e.enombre, m.mnombre FROM familia f NATURAL JOIN genero g NATURAL JOIN especie e NATURAL JOIN mariposa m;

nos entrega
QUERY PLAN Hash Join (cost=9.76..15.61 rows=162 width=54) Hash Cond: ((m.enombre)::text = (e.enombre)::text) -> Seq Scan on mariposa m (cost=0.00..3.62 rows=162 width=32) -> Hash (cost=8.27..8.27 rows=119 width=31) -> Hash Join (cost=4.44..8.27 rows=119 width=31) Hash Cond: ((e.gnombre)::text = (g.gnombre)::text) -> Seq Scan on especie e (cost=0.00..2.19 rows=119 width=20) -> Hash (cost=3.76..3.76 rows=55 width=21) -> Hash Join (cost=1.45..3.76 rows=55 width=21) Hash Cond: ((g.fnombre)::text = (f.fnombre)::text) -> Seq Scan on genero g (cost=0.00..1.55 rows=55 width=21) -> Hash (cost=1.20..1.20 rows=20 width=11) -> Seq Scan on familia f (cost=0.00..1.20 rows=20 width=11)

que en trminos absolutos son equivalentes, lo que nos lleva a concluir que para sta muestra de datos ambas consultas cuestan lo mismo y no puede mejorarse el rendimiento. Ahora, si le agregamos ORDER BY f.fnombre, g.gnombre, e.enombre, m.mnombre; el costo aumenta a:
QUERY PLAN Sort (cost=21.55..21.96 rows=162 width=54) Sort Key: f.fnombre, g.gnombre, e.enombre, m.mnombre -> Hash Join (cost=9.76..15.61 rows=162 width=54)

Usar la instruccin EXPLAIN nos permitir seleccionar el query con menor costro de una serie de queries programados para obtener el mismo resultado.

Pagina 50

PRACTICA # 8. MONITOREO DE BASES DE DATOS


Es posible checar la precisin de los costos estimados del planeador usando EXPLAIN ANALYZE. Esta instruccin ejecuta el query y despliega el tiempo real de corrida acumulado dentro de cada plan junto con los mismos costos estimados que muestra un EXPLAIN plano. Por ejemplo:
EXPLAIN ANALYZE SELECT f.fnombre, g.gnombre, e.enombre, m.mnombre FROM familia f NATURAL JOIN genero g NATURAL JOIN especie e NATURAL JOIN mariposa m;

Mostrar lo siguiente:
QUERY PLAN Hash Join (cost=9.76..15.61 rows=162 width=54) (actual time=1.704..2.661 rows=153 loops=1) Hash Cond: ((m.enombre)::text = (e.enombre)::text) -> Seq Scan on mariposa m (cost=0.00..3.62 rows=162 width=32) (actual time=0.021..0.291 rows=153 loops=1) -> Hash (cost=8.27..8.27 rows=119 width=31) (actual time=1.644..1.644 rows=111 loops=1) -> Hash Join (cost=4.44..8.27 rows=119 width=31) (actual time=0.647..1.343 rows=111 loops=1) Hash Cond: ((e.gnombre)::text = (g.gnombre)::text) -> Seq Scan on especie e (cost=0.00..2.19 rows=119 width=20) (actual time=0.011..0.205 rows=111 loops=1) -> Hash (cost=3.76..3.76 rows=55 width=21) (actual time=0.606..0.606 rows=51 loops=1) -> Hash Join (cost=1.45..3.76 rows=55 width=21) (actual time=0.148..0.468 rows=51 loops=1) Hash Cond: ((g.fnombre)::text = (f.fnombre)::text) -> Seq Scan on genero g (cost=0.00..1.55 rows=55 width=21) (actual time=0.008..0.095 rows=51 loops=1) -> Hash (cost=1.20..1.20 rows=20 width=11) (actual time=0.107..0.107 rows=19 loops=1) -> Seq Scan on familia f (cost=0.00..1.20 rows=20 width=11) (actual time=0.006..0.042 rows=19 loops=1) Total runtime: 3.091 ms

El tiempo de corrida total mostrado por EXPLAIN ANALYZE incluye los tiempos de arranque y terminacin, as como el tiempo gastado al procesar los renglones de resultados. No incluye los tiempos de parsing, reescritura ni planeacin. Para un query SELECT, el tiempo de corrida total normalmente ser ligeramente mayor que el tiempo total reportado por el nodo de ms alto nivel. Para INSERT, UPDATE y DELETE, el tiempo total de corrida ser considerablemente mayor porque incluye el tiempo gastado al procesar los renglones de resultados. Para estas instrucciones, el tiempo para el nodo superior es esencialmente el tiempo gastado al localizar los renglones viejos y/o calcular los nuevos, pero no incluye el tiempo gastado en la aplicacin de los cambios. Si hubiera triggers, el tiempo gastado en ellos se mostrar en forma independiente para cada uno de ellos. El planeador necesita estimar el nmero de renglones recuperados por un query para poder hacer buenos planes. Un componente de estas estadsticas es el nmero total de entradas en cada tabla e ndice, as como tambin el nmero de bloques de disco ocupados por ellos. Esta informacin se mantiene en la tabla pg_class, en las columnas retuples y relpages. Por ejemplo:
Pagina 51

PRACTICA # 8. MONITOREO DE BASES DE DATOS


SELECT relname, relfilenode, relkind, reltuples, relpages FROM pg_class WHERE relname LIKE 'mariposa%';

Que nos entregara la siguiente informacin:


relname mariposa relfilenode 24933 relkind r reltuples 162 relpages 2

Cada pgina en disco mide 8 kilobytes. Este valor llega a ser de gran utilidad para prevenir el costoso error de disco lleno. Una de las tcnicas que nos permitiran mejorar el rendimiento de un query, es usar JOINs explcitos. De las tres instrucciones siguientes, el planeador ejecutar con menor costo las dos ltimas:
SELECT * FROM a, b, c WHERE a.id = b.id AND b.ref = c.id; SELECT * FROM a CROSS JOIN b CROSS JOIN c WHERE a.id = b.id AND b.ref = c.id; SELECT * FROM a JOIN (b JOIN c ON (b.ref = c.id)) ON (a.id = b.id);

Aunque como en todo, la prctica intensa nos dar la habilidad para escribir los mejores queries. ----------------------------------Con respecto a la insercin de grandes conjuntos de renglones, la mejor forma es usar la orden COPY, pues ejecuta un solo COMMIT al final del ltimo rengln a insertar. La instruccin INSERT ejecuta un commit por cada rengln agregado, lo cual provoca una enorme sobrecarga en el servidor. Se puede aliviar un poco poniento la variable AUTOCOMMIT en false. Sin embargo no es la mejor forma. Ahora bien, en el caso de que se esten usando ndices, es ms eficiente borrarlos y re-crearlos despus de una insercin masiva de renglones. Es decir, si dejemos que el DBMS actualice los ndices cada vez que se inserta un nuevo rengln, lo estaremos haciendo trabajar en demasa. De igual forma debe hacerse con las restricciones de llaves forneas, lo conveniente es desactivarlas, insertar el montn de renglones nuevos y volver a cargar las llaves forneas para que se re-creen. Para eliminar una restriccin se necesita conocer su nombre. Por eso se recomienda agregar restricciones con un nombre dado por el usuario. La instruccin es:
ALTER TABLE miTabla DROP CONSTRAINT nombre_restriccion;

(Si el nombre lo gener el DBMS y se llama $2, no hay que olvidar escribir el nombre entre comillas). Si la restriccion est en una tabla de la que dependen otras, agregar CASCADE; es decir,
ALTER TABLE miTabla DROP CONSTRAINT nombre_restriccion CASCADE;

Esta sintaxis trabaja para todos los tipos de restricciones excepto para las not-null. Para este caso usar:
ALTER TABLE products ALTER COLUMN product_no DROP NOT NULL;

Para agregar una restriccin, la sintaxis es:


ALTER TABLE miTabla ADD CHECK (nombre <> ); ALTER TABLE miTabla ADD CONSTRAINT nombre_restriccion UNIQUE (nProducto); ALTER TABLE miTabla ADD FOREIGN KEY (producto_grupo_id) REFERENCES productos_grupos;

Pagina 52

PRACTICA # 8. MONITOREO DE BASES DE DATOS


Para agregar una restriccin not-null, que no puede escribirse como de tipo restriccin de tabla, usar:
ALTER TABLE miTabla ALTER COLUMN nProducto SET NOT NULL;

La restriccin se checar inmediamente despus de agregada, as que los datos debern satisfacerla a priori. ----------------------------------Incrementar temporalmente la variable de configuracin checkpoint_segments puede acelerar la carga de grandes volmenes de datos. Al ocurrir esto, PostgreSQL har ms checkpoints que lo normal. En un checkpoint, todas las pginas con ruido (que tengan basura) fluyeh hacia el disco. Incrementar el nmero de segmentos de checpoints disminuir el nmero de los chequeos. Despus de alterar significativamente (constantes inserts, updates o deletes) la distribucin de los datos dentro de una tabla, correr ANALYZE o VACUUM ANALYZE es vital. Esto asegurar que el planeador actualice las estadsticas de la tabla que se est analizando. Sin estas estadsticas o con estadsticas obsoletas, el planeador podra tomar decisiones pobres durante la planeacin de un query, conduciendonos a un psimo rendimiento. Si el demonio autovacuum est activo, la actualizacin de estadsticas ser automtica. programa Especificar en cada prctica la correlacin con l o los temas y subtemas del pro grama de estudio vigente: Tema 2: Subtema 2.2: Subsubtema 2.2.1 Administracin de bases de datos. Definicin del esquema de integridad. Validar y verificar integridad de entidad e integridad referencial.

Material y equipo usado: Equipo de cmputo personal o Laptop con sistema operativo Windows XP o Vista. SGBD PostgreSQL instalado. CD de soporte. Metodologa: Preparacin de la base de datos Mariposas: 1. 2. 3. 4. 5. 6. Ejecutar el pgAdmin. Seleccionar el servidor Advanced Server 8.3R2 (localhost:5432). Entrar con el password masterkey. En el rbol, expandir y seleccionar la entrada Databases. Seleccionar la BD Mariposas para conectarla y dejarla lista para su uso. En el Query Tool ejecutar los queries descritos en la seccin de introduccin de esta prctica. 7. Re-crear la llave fornea de la tabla mariposa (eliminar la restriccin y volverla a crear).

Creacin de la tabla Temporal: 1. En el rbol, expandir y seleccionar la entrada Databases. 2. Crear la BD Temporal para conectarla y dejarla lista para su uso, el esquema de la BD es:
CREATE TABLE a (id integer primary key); CREATE TABLE b (id integer primary key, ref integer); CREATE TABLE c (id integer primary key);

3. Crear una cama de pruebas con al menos 5,000 renglones por tabla. 4. En el Query Tool escribir el query para insertar los datos mediante la orden COPY.

Pagina 53

PRACTICA # 8. MONITOREO DE BASES DE DATOS


5. Ejecutar los siguientes queries:
SELECT * FROM a, b, c WHERE a.id = b.id AND b.ref = c.id; SELECT * FROM a CROSS JOIN b CROSS JOIN c WHERE a.id = b.id AND b.ref = c.id; SELECT * FROM a JOIN (b JOIN c ON (b.ref = c.id)) ON (a.id = b.id);

6. Calcular los costos y el tiempo de ejecucin de esos queries. Completar la instruccin con EXPLAIN ANALYZE. 7. Comparar los resultados e indicar cual o cuales de los tres queries es o son ms eficiente(s). Sugerencias didcticas: Revisar exhaustivamente los captulos 26 Monitoring Database Activity y 55 How the Planner Uses Statistics del manual de PostgreSQL para incrementar su conocimiento en el manejo de los valores estadsticos que maneja PostgreSQL. Revisar el video Importancia de las Estadisticas en PostgreSQL, que viene en el CD de soporte.

(resultados): Reporte del alumno (resultados): 1. Reporte de las estadisticas generadas. 2. Resumen de su interpretacin personal con sugerencias para incrementar el rendimiento de los queries. 3. Descripcin del procedimiento para la creacin de la cama de pruebas. 4. Scripts de SQL para realizar las actividades solicitadas. Bibliografa preliminar: 1. Muller, Robert J. Database Design for Smarties : using UML for data modeling Morgan Kaufmann Publishers ISBN 1-55860-515-0 2. Elmasri, Ramez., Navathe, Shamkant B. Sistemas de Bases de datos. Conceptos fundamentales Addison Wesley Iberoamericana, S.A. ISBN 968-444-399-4

3. Documento 04 1 postgresql-8.4.3-US, manual.pdf que se encuentra en el CD de


soporte.

Pagina 54

PRACTICA # 9. USO DE TRIGGERS


No. de prctica: 09 Nombre: Objetivo: Uso de triggers. Revisar los requisitos para el diseo, codificacin e implantacin de triggers.

Un trigger es un manejador de eventos. Es decir, es un cdigo que se ejecuta Introduccin: cuando ocurre un cierto evento en el servidor de la BD. El std. ANSI SQL-92 no dice nada acerca de los triggers o los ventos que los sealan. Muchos productos DBMS manejan triggers de una u otra forma, pero no hay un formato std. para ellos. El conjunto ms comn de triggers son eventos before y after que se disparan para los tres eventos de manipulacin de datos relacionales: insert, update y delete. En otras palabras, ocurre un evento en los siguientes puntos en el procesamiento de BD:
Before Insert, Before Update, Before Delete After Insert, After Update, After Delete

Estos triggers orientados a renglones realizan chequeos de las reglas de negocios y otras funciones de implementacin. Por ejemplo, un uso es implementar restricciones de integridad referencial (restricciones de llave fornea) a travs de las BD. Como cuando se inserta un rengln en una tabla, el trigger Before Insert checa para asegurarse que exista la llave fornea en una referencia foreign key a una tabla en otra BD. Esto se necesita en un ambiente de mltiples BD porque el mecanismo de restriccin de integridad de SQL requiere que todas las tablas estn dentro de la misma BD, lo cual en nuestros dias, ya no resulta muy til. ----------------------------------PL/pgSQL y Triggers Las funciones que usan los triggers se pueden crear con PL/pgSQL y ser referenciadas dentro de la definicin del trigger PostgreSQL. El trmino funcin de trigger es una simple manera de hacer referencia a una funcin que ser invocada por un trigger. La definicin de un trigger y la definicin de su funcin asociada son dos cosas diferentes. Un trigger se define con la instruccin CREATE TRIGGER, mientras que la funcin referenciada por l se hace con CREATE FUNCTION. Una funcin de trigger se define sin argumentos y regresan un valor del tipo de dato especial trigger. La sintaxis para definir un trigger en PostgreSQL es:
CREATE TRIGGER nombre { BEFORE | AFTER } { INSERT | UPDATE | DELETE ON tabla [ FOR [ EACH ] { ROW | STATEMENT } ] EXECUTE PROCEDURE nombre_funcion (argumentos) [ OR ] }

La sintaxis de CREATE FUNCTION se muestra en el siguiente ejemplo:


CREATE FUNCTION nombre_ funcion () RETURNS trigger AS ' DECLARE Declaracion de variables con tipo; [...] BEGIN instrucciones; [...] END; ' LANGUAGE 'plpgsql';

Cada funcin de trigger creada tiene acceso a un nmero de variables especiales que existen para proporcionar informacin acerca del trigger llamador y permitirle manipular datos de las tablas.

Pagina 55

PRACTICA # 9. USO DE TRIGGERS


Variables que se pueden usar en las funciones de triggers Nombre NEW dat ato Descripci cin Tipo de d ato Descrip ci n RECORD Contiene el nuevo rengln de la BD creado despus de las operaciones INSERT y UPDATE ejecutadas por triggers de tipo ROW. Se puede usar para hacer modificaciones al nuevo rengln. RECORD Contiene el viejo rengln de la BD que dejan las operaciones UPDATE y DELETE ejecutadas por un trigger after a nivel ROW. name text text text oid name integer Contiene el nombre del trigger disparado. Contiene la cadena BEFORE o AFTER, dependiendo de cuando el trigger fue disparado. Contiene una cadena con ROW o STATEMENT, dependiendo del nivel definido para el trigger. Contiene una cadena con INSERT, UPDATE o DELETE que indica la operacin que invoc al trigger. Contiene el ID del objeto de la tabla que invoc al trigger. Contiene el nombre de la tabla para la cual se invoc el trigger. Contiene el nmero de argumentos que especifica la definicin del trigger . Contiene los argumentos especificados por la instruccin CREATE TRIGGER. El ndice inicia en cero.

OLD TG_NAME TG_WHEN TG_LEVEL TG_OP TG_RELID TG_RELNAME TG_NARGS

TG_ARGV[ ] array of text

El siguiente cdigo ilustra la definicin en PL/pgSQL de una funcin de trigger, usando variables de la lista previa. La funcin de trigger checar_embarque se llama despus de una operacin INSERT o UPDATE a la tabla embarques. Se asegura que cada embarque agregado a la tabla contenga un nmero ID de cliente y un ISBN del libro especificado vlidos. Si es as, resta uno del total de la cantidad de libros en la tabla stock para ese libro si la operacin que llama es un INSERT (pero no un UPDATE).
CREATE OR REPLACE FUNCTION checar_embarque () RETURNS trigger AS ' DECLARE -- Declara una variable para contener el ID del cliente. id_number INTEGER; -- Declara una variable para contener el ISBN. book_isbn TEXT; BEGIN -- Si hay un nmero ID que coincida con el ID del cliente en -- la nueva tabla, lo recupera de la tabla de clientes (customers). SELECT INTO id_number id FROM customers WHERE id = NEW.customer_id; -- Si no hay coincidencia, genera una excepcin. IF NOT FOUND THEN RAISE EXCEPTION 'Nmero ID de cliente invalido.'; END IF;

Pagina 56

PRACTICA # 9. USO DE TRIGGERS

-- Si hay un ISBN que coincida con el ISBN especificado en la -- nueva tabla, recuperelo de la tabla de ediciones (editions). SELECT INTO book_isbn isbn FROM editions WHERE isbn = NEW.isbn; -- Si no hay coincidencia, genera una excepcion. IF NOT FOUND THEN RAISE EXCEPTION 'ISBN Invalido.'; END IF; -- Si el chequeo previo tuvo exito, actualiza la cantidad en existencia -- para la instruccin INSERT. IF TG_OP = 'INSERT' THEN UPDATE stock SET stock = stock - 1 WHERE isbn = NEW.isbn; END IF; RETURN NEW; END; ' LANGUAGE 'plpgsql';

Una vez creada la funcin checar_embarque(), se puede definir para la tabla embarques (shipments) un trigger que la invoque. El siguiente cdigo muestra la sintaxis para crear el trigger checar_embarque en la BD booktown usando psql.
CREATE TRIGGER checar_embarque BEFORE INSERT OR UPDATE ON shipments FOR EACH ROW EXECUTE PROCEDURE checar_embarque();

Hay que notar que la funcin del trigger checar_embarque() deber estar definida dentro de la BD booktown antes de que su trigger asociado sea definido. ----------------------------------Dentro del rbol de pgadmin III, los triggers y sus funciones asociadas se guardan dentro de la tabla correspondiente; por ejemplo, si se tiene el trigger mariposa_may y su funcion asociada mariposa_may(), para la tabla mariposa de la BD mariposas, el rbol se vera de la siguiente forma:

Pagina 57

PRACTICA # 9. USO DE TRIGGERS


Un ejemplo trivial de un trigger es aquel que codificaremos para convertir a maysculas el nombre de la mariposa que vayamos a insertar en la tabla mariposa. La funcin mariposa_may() utiliza la funcin upper(cadena) para convertir el contenido de la cadena a solo maysculas. Adems, enviar a la pantalla el mensaje INFO: nombre de la mariposa Mariposa agregada OK. El cdigo para la funcin y su trigger asociado es:
-- Function: mariposa_may() -- DROP FUNCTION mariposa_may(); CREATE OR REPLACE FUNCTION mariposa_may() RETURNS "trigger" AS $BODY$ DECLARE n_texto TEXT; BEGIN NEW.mnombre := upper(NEW.mnombre); n_texto := NEW.mnombre || ' Mariposa agregada OK'; RAISE INFO ' %', n_texto; RETURN new; END $BODY$ LANGUAGE 'plpgsql' VOLATILE; ALTER FUNCTION mariposa_may() OWNER TO enterprisedb; -- Trigger: mariposa_may on mariposa -- DROP TRIGGER mariposa_may ON mariposa; CREATE TRIGGER mariposa_may BEFORE INSERT OR UPDATE ON mariposa FOR EACH ROW EXECUTE PROCEDURE mariposa_may();

Al agregar un nuevo rengln a la tabla mariposa, como:


INSERT INTO mariposa VALUES ('actinote alcione hewitson xyz','BARITULA','F');

Se inserta y aparecer el mensaje:


INFO: ACTINOTE ALCIONE HEWITSON XYZ Mariposa agregada OK Query returned successfully: 1 row affected, 80 ms execution time.

----------------------------------Base de datos Tienda de Computadoras


CREATE TABLE item ( item_id rowid NOT NULL, nombre text NOT NULL, tipo text NOT NULL, cantidad integer NOT NULL DEFAULT 0, precio_compra real NOT NULL, precio_venta real NOT NULL, CONSTRAINT item_id_pk PRIMARY KEY (item_id) );

Nuestra tabla item tiene la capacidad de almacenar la informacin mas actual e importante para la tienda de computadoras, pero hay otro tipo de informacin que no es capaz de almacenar (por lo menos por ahora), la informacin del cambio de datos.

Pagina 58

PRACTICA # 9. USO DE TRIGGERS


Nuestra tabla item no tiene memoria de los cambios que han sufrido sus tuplas, si alguien viene y cambia el precio de venta de un artculo, no hay forma de obtener el precio anterior. Si alguien borra un artculo, tampoco sabremos que artculo ha sido borrado ni por quien. Esto nos lleva a la primera gran rea de utilizacin de los triggers, la auditora de tablas. Entonces cuales son las acciones que debe realizar nuestro trigger? Necesitamos llevar un registro de todos los cambios relevantes en nuestra tabla item, para empezar queremos tener un seguimiento de los cambios en los precios de los items. Tambin queremos almacenar en algn lugar todos aquellos items que hayan sido eliminados y guardar sus respectivos historiales de cambios.

Antes de empezar a denir el trigger es necesario conocer una cuantas variables por defecto que nos provee PostgreSQL:
current_user current_date current_time el nombre del usuario que esta actualmente conectado a la base de datos y que ejecuta las instrucciones. La fecha actual (del servidor, no del cliente). La hora actual.

PostgreSQL tambin maneja unas cuantas variables al momento de ejecutar un trigger, estas son:
NEW OLD TG_OP TG_ARGV Variable compuesta que almacena los nuevos valores de la tupla que se esta modicando Variable compuesta que almacena los valores antiguos de la tupla que se esta modicando Variable tipo string que indica que tipo de evento est ocurriendo (INSERT, UPDATE, DELETE). Variable tipo arreglo que almacena los parametros de la funcin del trigger, podemos accederlos de la forma TG_ARGV[0], TG_ARGV[1], etc.

Como ltimo paso antes de empezar a denir el trigger, debemos crear una tabla que vaya a almacenar los cambios de precio en nuestra tabla item, la llamaremos item_actualizado:
CREATE TABLE item_actualizado ( item_id integer NOT NULL, nombre text NOT NULL, precio_anterior real NOT NULL, precio_actualizado real NOT NULL, autor text NOT NULL, fecha_cambio date NOT NULL, CONSTRAINT item_id_fk FOREIGN KEY (item_id) REFERENCES item(item_id) );

Una vez definidas nuestras tablas, definimos la funcin del trigger: item_actualizado_tri():
CREATE FUNCTION item_actualizado_tri() RETURNS trigger AS ' BEGIN IF (TG_OP = 'UPDATE') THEN INSERT INTO item_actualizado VALUES ( OLD.item_id, OLD.nombre, OLD.precio_venta NEW.precio_venta, current_user, current_date); END IF; RETURN NULL; END; '
LANGUAGE 'plpgsql';

Pagina 59

PRACTICA # 9. USO DE TRIGGERS


La nombramos con un sujo tri para darnos cuenta de que es una funcin perteneciente a un trigger y no confundirla con otra que tengamos en nuestro servidor. Vamos a la denicion formal del trigger:
CREATE TRIGGER actualizar_item AFTER UPDATE ON item FOR EACH ROW EXECUTE PROCEDURE item_actualizado_tri();

Listo, cada vez que se actualice una tupla en la tabla item, se reejar el cambio en la tabla item_actualizado. Pero era eso lo que queriamos? No totalmente, volvamos a la funcin del trigger.
CREATE FUNCTION item_actualizado_tri() RETURNS trigger AS ' BEGIN IF (TG_OP = 'UPDATE') THEN IF (OLD.precio_venta != NEW.precio_venta) THEN INSERT INTO item_actualizado VALUES ( OLD.item_id, OLD.nombre, OLD.precio_venta, NEW.precio_venta, current_user, current_date); END IF; END IF; RETURN NULL; END; ' Language 'plpgsql';

Ahora si, solo se insertarn tuplas en la tabla item_actualizado cuando se cambie el valor de precio_venta. Modiquemos algn item_actualizado. Ejercicios: A la tabla item_actualizado aadir un atributo hora_cambio que almacene la hora de la modicacin. Hacer otro trigger que haga el mismo tratamiento pero con los items eliminados de la tabla item. precio_venta de la tabla item y luego veamos la tabla

Modicamos la tabla:
CREATE TABLE item_actualizado ( item_id integer NOT NULL, nombre text NOT NULL, precio_anterior real NOT NULL, precio_actualizado real NOT NULL, autor text NOT NULL, fecha_cambio date NOT NULL, hora_cambio time NOT NULL, CONSTRAINT item_id_fk FOREIGN KEY (item_id) REFERENCES item(item_id) );

Pagina 60

PRACTICA # 9. USO DE TRIGGERS


Modificamos la funcin:
CREATE FUNCTION item_actualizado_tri() RETURNS trigger AS ' BEGIN IF (TG_OP = 'UPDATE') THEN IF (OLD.precio_venta != NEW.precio_venta) THEN INSERT INTO item_actualizado VALUES ( OLD.item_id, OLD.nombre, OLD.precio_venta, NEW.precio_venta, current_user, current_date, current_time); END IF; END IF; RETURN NULL; END; ' Language 'plpgsql';

Gracias a nuestra nueva tabla item_actualizado ahora podemos obtener mas informacin acerca de nuestra tienda de computadoras. Podemos saber: Que precio tenia cierto tem en cierta temporada. Cuanto tiempo se ha mantenido el precio estable. En que temporadas del ao los precio caen o se disparan. Quienes han modicado los precios de los items.

Ahora hagamos el trigger que haga el seguimiento de los items que han sido eliminados de nuestra tabla item: Primero creamos la tabla item_eliminado:
CREATE TABLE item_eliminado ( item_id integer NOT NULL, nombre text NOT NULL, precio_compra real NOT NULL, precio_venta real NOT NULL, autor text NOT NULL, fecha_eliminacion date NOT NULL, hora_eliminacion time NOT NULL, );

La funcin del trigger item_eliminado_tri();


CREATE FUNCTION item_eliminado_tri() RETURNS trigger AS ' BEGIN IF (TG_OP = 'DELETE') THEN INSERT INTO item_eliminado VALUES ( OLD.item_id, OLD.nombre, OLD.precio_compra, OLD.precio_venta, current_user, current_date, current_time); END IF; RETURN NULL; END; ' Language 'plpgsql';

Y el trigger se ver como:


CREATE TRIGGER eliminar_item AFTER DELETE ON item FOR EACH ROW EXECUTE PROCEDURE item_eliminado_tri();

Pagina 61

PRACTICA # 9. USO DE TRIGGERS


Especificar en cada prctica la correlacin con l o los temas y subtemas del programa de estudio vigente: Tema 2: Subtema 2.2: Subsubtema 2.2.2 Administracin de bases de datos. Definicin del esquema de integridad. Creacin de disparadores (triggers).

Material y equipo usado: Equipo de cmputo personal o Laptop con sistema operativo Windows XP o Vista. SGBD PostgreSQL instalado. CD de soporte. Metodologa: Preparacin de la base de datos Mariposas: 1. 2. 3. 4. 5. 6. Ejecutar el pgAdmin. Seleccionar el servidor Advanced Server 8.3R2 (localhost:5432). Entrar con el password masterkey. En el rbol, expandir y seleccionar la entrada Databases. Seleccionar la BD Mariposas para conectarla y dejarla lista para su uso. En el Query Tool ejecutar los queries descritos en la seccin de introduccin de esta prctica en la pg. 58.

Creacin y preparacin de la base de datos Tienda de computadoras: 1. 2. 3. 4. 5. 6. Ejecutar el pgAdmin. Seleccionar el servidor Advanced Server 8.3R2 (localhost:5432). Entrar con el password masterkey. En el rbol, expandir y seleccionar la entrada Databases. Crear y conectar la BD Tienda de computadoras y dejarla lista para su uso. En el Query Tool ejecutar los queries descritos en la seccin de introduccin de esta prctica en la pg. 58 a 61. 7. En el nterim, crear una cama de pruebas. Revisar exhaustivamente la seccin 9.25 Trigger Functions y el captulo 35 Triggers del manual de PostgreSQL para incrementar su conocimiento en el manejo de los disparadores. Revisar el documento 09 01 Disparadores (triggers), que viene en el CD de soporte. Crear la base de datos Embarque, descrita en la seccin de introduccin de esta prctica, en las pgs. 56 y 57.

Sugerencias didcticas: -

(resultados): Reporte del alumno (resultados): 1. Reporte de los resultados obtenidos al ejecutar los triggers. 2. Scripts de SQL para realizar las actividades solicitadas. 3. Reporte de mensajes de advertencia al ejecutar los queries. Bibliografa preliminar: 1. Muller, Robert J. Database Design for Smarties : using UML for data modeling Morgan Kaufmann Publishers ISBN 1-55860-515-0

Pagina 62

PRACTICA # 9. USO DE TRIGGERS


2. Elmasri, Ramez., Navathe, Shamkant B. Sistemas de Bases de datos. Conceptos fundamentales Addison Wesley Iberoamericana, S.A. ISBN 968-444-399-4 3. Documento 04 1 postgresql-8.4.3-US, manual.pdf que se encuentra en el CD de soporte.

Pagina 63

Вам также может понравиться