Documente Academic
Documente Profesional
Documente Cultură
Indice
ndice
Que es PostgreSQL
Historia y Antecedentes
Ventajas de PostgreSQL
Caractersticas de PostgreSQL
Herramientas de PostgreSQL
Comparacin de sistemas administradores de bases de datos relacionales
Informacin general
Soporte del sistema operativo
Caractersticas fundamentales
Tablas y vistas
ndices
Otros objetos
Particionamiento
Arquitectura Conceptual de PostgreSQL
Front End (Cliente - Servidor)
Postmaster
Back End - Arquitectura General del Servidor de Postgres
Intrprete
Polica de trfico
Planificador / Optimizador
Ejecutor
Administracin de Datos
Almacenamiento de Datos
Conclusin
Instalar y Configurar el PostgreSQL 9.x
Instalacin del Servidor de Bases de Datos PostgreSQL 9.x
Configurar el PostgreSQL 9.2
Habilitar Conexiones Remotas al Servidor PostgreSQL 9.2
Optimizacin
Instalar el PostgreSQL en un Directorio Diferente
Instalar el PostgreSQL en un Directorio Diferente usando tablespace
Directorios y Archivos de PostgreSQL
Ubicaciones de los directorios y archivos de PostgrSQL en Linux
Ubicaciones de los directorios y archivos de Datos PostgrSQL en Linux
PostgreSQL Lmites de espacio en disco
Dnde estn nuestros datos en el disco?
Bloques de datos en el disco
PostgreSQL: Espacio en Disco
Tipos de Tablas
Tipos de Datos
2
5
6
7
8
13
15
15
15
16
17
17
18
19
20
21
22
22
23
23
23
23
23
25
27
28
28
32
38
38
41
42
43
43
43
45
46
48
50
50
51
Indice
Gestin de Bases de Datos PostgreSQL
PSQL: La pequea gran herramienta de PostgreSQL
Ejecutando psql desde el sistema operativo
Ejecutando psql en modo interactivo
Controlando una Sesin en psql en modo interactivo
Query multi-lnea en modo interactivo
Usando valores NULL y BLANK
Valores DEFAULT
pg_dump y pg_dumpall
pg_restore
createdb y dropdb
Postmaster y pg_ctl
PgAdmin
Administracin de sesiones
Inicio y Tipos de sesiones
Control de sesiones
Caso de Estudio
Sentencias DDL
CREATE
ALTER .. ADD
ALTER .. DROP
DROP
TRUNCATE
Sentencias DML
SELECT
INSERT
UPDATE
DELETE
Sentencias TCL
COMMIT
SAVEPOINT
RELEASE SAVEPOINT
ROLLBAK
Instalar Script
Caso de Estudio - Continuacin
Sentencias DCL
GRANT
REVOKE
Sentencias XML
54
54
55
58
61
62
63
64
64
66
67
68
69
71
71
71
75
76
76
85
89
92
95
96
96
104
105
106
109
109
109
110
111
114
117
119
119
120
128
Indice
PLpgSQL
Introduccin
Estructura
Utilizacin mediante SELECT
DECLARE
Insertar Datos en una Tabla
Actualizar Datos en una Tabla
Utilizar ROW TYPES
Cursores
Cursores Implcitos con FOR <VAR> IN <QUERY>
Triggers
Validacin
Valores Calculados
Manejo de Errores
Ejercicio Red Social
Consultas Enumeradas
Consultas, Funciones, Procedimientos y Vistas
Consultas
Funciones
Procedimientos
Vistas
Funciones Ventana (Windows Functions)
Automatizacin de Backups
Bibliografia
131
131
131
132
132
132
133
135
136
138
138
140
140
141
142
147
149
149
150
151
151
153
156
158
Que es PostgreSQL
PostgreSQL es un Sistema de Gestin de Bases de Datos Objeto-Relacionales
(ORDBMS) que ha sido desarrollado de varias formas desde la dcada de 1980 y
es un proyecto de software libre distribuido bajo licencia BSD (Berkeley Software
Distribution) y creado con el aporte de varios colaboradores y auspiciantes a nivel
mundial bajo los estndares de ANSI-SQL 92/99.
Con ms de dos dcada de desarrollo, PostgreSQL se ha convertido en la base de
datos de cdigo abierto y con orientacin a objetos ms avanzada disponible en el
momento, ofreciendo las caractersticas propias de los ms potentes motores de
bases de datos comerciales como Oracle, DB2 o SQLServer.
PostgreSQL es el ltimo resultado de una larga evolucin comenzada con el
proyecto de bases de datos relacionales Ingres en la Universidad de Berkeley.
Luego se inici el proyecto Post-Ingres para resolver los problemas con el modelo
de base de datos relacional que se haban presentado.
El proyecto resultante llamado Postgres complet el soporte de tipos de datos y la
base de datos comprenda tambin las relaciones entre tablas o clases.
El proyecto PostgreSQL sigue actualmente un activo proceso de desarrollo a nivel
mundial gracias a un equipo de desarrolladores y contribuidores de cdigo abierto.
PostgreSQL es ampliamente considerado como una de las alternativas de sistema
de bases de datos de cdigo abierto.
El sitio web oficial de PostgreSQL es;
http://www.postgresql.org
Historia y Antecedentes
La implementacin del DBMS (Sistema Manejador de Bases de Datos) Postgres
comenz a desarrollarse en 1986 con la coordinacin del profesor Michael
Stonebraker, y fue patrocinado por algunas fundaciones estatales y militares de
investigacin.
Los conceptos inciales para el sistema fueron presentados con la definicin del
modelo de datos inicial junto con la lgica y arquitectura del gestor de
almacenamiento; desde entonces, Postgres ha pasado por varias versiones. El
primer sistema de pruebas fue operacional en el ao 1987 y la Versin 1 fue
lanzada a unos pocos usuarios en Junio de 1989; despus de revisar el sistema
de reglas de la primera versin, ste fue rediseado y la Versin 2 se lanz en
Junio de 1990. La Versin 3 apareci en 1991 y aadi una implementacin para
mltiples gestores de almacenamiento, un ejecutor de consultas mejorado junto
con un mejor sistema de reglas. En su mayor parte, las siguientes versiones hasta
el lanzamiento de Postgres95 se centraron en los temas de portabilidad y
fiabilidad.
El mantenimiento del cdigo y las tareas de soporte ocupaban demasiado tiempo
que deba dedicarse a la investigacin, as que el proyecto termin oficialmente
con el lanzamiento de la Versin 4.2.
En 1994, Andrew Yu y Jolly Chen aadieron un intrprete de lenguage SQL
(Lenguaje Estructurado de Consultas) a Postgres y el proyecto se denomin
Postgres95, el mismo que fue lanzado a continuacin en la Web para que
encontrara su sitio en el mundo de los gestores de bases de datos como un
descendiente de dominio pblico y cdigo abierto del cdigo original Postgres de
Berkeley. El cdigo de Postgres95 fue optimizado y reducido en tamao en un
25% respecto a sus predecesores; muchos cambios internos mejoraron el
rendimiento y la facilidad de mantenimiento. Postgres95 en su versin v1.0 se
ejecutaba en un 30 a 50% ms rpido que Postgres v4.2 y adems de su
correccin de errores, el lenguaje de consultas Postquel fue reemplazado con SQL
(implementado en el servidor). Tambin se incluy un nuevo programa (psql) para
realizar consultas SQL interactivas.
En 1996 nace el proyecto PostgreSQL, siendo una nueva versin de Postgres95,
tratando de reflejar la relacin entre el Postgres original y las versiones ms
recientes con capacidades de SQL. Los nmeros de versin parten de la 6.0,
volviendo a la secuencia seguida originalmente por el proyecto Postgres de
Berkeley.
El nfasis durante el desarrollo de Postgres95 estaba orientado a identificar,
entender y mejorar los problemas existentes en el cdigo del servidor. Con
PostgreSQL, adems de estas mejoras se puso nfasis para aumentar las
6
Ventajas de PostgreSQL
Instalacin Ilimitada
Con PostgreSQL, nadie puede demandarlo por violar acuerdos de licencia,
puesto que no hay costo asociado a la licencia del software.
Soporte
Adems de las ofertas de soporte comercial, hay una importante comunidad de
profesionales y entusiastas de PostgreSQL de los que su compaa puede
obtener beneficios y contribuir.
Ahorros considerables en costos de operacin
Ha sido diseado y creado para tener un mantenimiento y ajuste mucho menor
que otros productos, conservando todas las caractersticas, estabilidad y
rendimiento.
Estabilidad y Confiabilidad Legendarias
Es extremadamente comn que compaas reporten que PostgreSQL nunca ha
presentado cadas en varios aos de operacin de alta actividad. Ni una sola
vez. Simplemente funciona.
Multiplataforma
PostgreSQL est disponible en casi cualquier Unix (34 plataformas en la ltima
versin estable - Linux, UNIX, AIX, BSD, HP-UX, Mac OS X, Solaris) y ahora en
versin nativa para Windows.
Extensible
El cdigo fuente est disponible para todos sin costo. Si su equipo necesita
extender o personalizar PostgreSQL de alguna manera, pueden hacerlo con un
mnimo esfuerzo, sin costos adicionales.
Esto es complementado por la comunidad de profesionales y entusiastas de
PostgreSQL alrededor del mundo que tambin extienden PostgreSQL todos los
das.
Diseado para ambientes de alto volumen
PostgreSQL usa una estrategia de almacenamiento de filas llamada MVCC
para conseguir una mejor respuesta en ambientes de grandes volmenes. Los
Caractersticas de PostgreSQL
A continuacin se presentan las ms importantes caractersticas de este sistema
manejador de bases de datos por la cuales es considerado uno de los ms
potentes gestores de bases de datos en el mundo del software libre:
Soporte SQL92/SQL99
Implementa los estndares SQL92/SQL99 con sus operadores, funciones,
clusulas y comandos (DDL y DML), junto con comandos extendidos de
PostgreSQL.
Transacciones
Posee un completo soporte para control de transacciones asegurando la
integridad y consistencia de los datos
Permiten el paso entre dos estados consistentes manteniendo la integridad de
los datos. Un bloque de transacciones comienza con una sentencia BEGIN
WORK y si la transaccin fue vlida se cierra con COMMIT WORK o END
WORK. Si la transaccin falla, se cierra con ABORT o ROLLBACK WORK.
BEGIN WORK;
.......
Sentencias SQL;
.......
COMMIT WORK;
Integridad referencial
PostgreSQL soporta integridad referencial, la cual es utilizada para garantizar la
validez de los datos de la base de datos.
Soporte completo de ACID (Atomicity Consistency Isolation Durability)
Operaciones Atmicas, formadas por comandos que se ejecutan todos o
ninguno de ellos.
Consistencia, que garantiza que la base de datos nunca se quede en un estado
intermedio de una transaccin (con parte de los comandos ejecutados y otra
parte que no).
Aislamiento, que mantiene separadas las transacciones de usuarios distintos
hasta que stas han terminado, es decir controlando la concurrencia de
usuarios.
10
11
Permite hacer un rolled back sin tener que repetir la transaccin entera.
Point in Time Recovery
Permite salvar el estado de la DB en momentos concretos, para su posterior
recuperacin.
Tablespaces
Permite destinar discos fsicos a un ndice o a una tabla concreta.
Improved Memory and I/O
Optimizaciones en la velocidad de ejecucin y en el consumo de memoria de la
aplicacin.
Aadidos o ampliados
Lenguajes de procedimientos almacenados PL/Java, PL/J, PL/PHP y PL/Perl.
Seguridad
Gestin correcta de usuarios, grupos de usuarios y contraseas, as como
tambin los permisos asignados a cada uno de ellos.
Respaldos (Backups) y Recuperacin caliente
Respaldos y Recuperacin completa de las bases de datos mientras trabaja el
servidor PostgreSQL
Replicacin
Con servidores PostgreSQL funcionando como maestros y otros como
esclavos. Todas las transacciones se las realiza primero en el servidor maestro
para que se puedan actualizar en los esclavos. La replicacin es un proceso
asncrono en PostgreSQL, y se la realiza gracias a un archivo llamado binary
Log que contiene la informacin de las modificaciones y actualizaciones entre
un nodo maestro y uno o mltiples esclavos; la replicacin con servidores
PostgreSQL es un proceso independiente del servidor.
Herencia entre tablas
Por lo que a este gestor de bases de datos se le incluye entre los gestores
objeto-relacionales.
12
Herramientas de PostgreSQL
Existen herramientas libres y gratuitas con interfaces grficas e intuitivas y fciles
de utilizar para la administracin completa de bases de datos PostgreSQL como
son PhpPgAdmin o el PgAdmin que son auspiciados por los mismos creadores del
sistema PostgreSQL. Tambin existen algunas herramientas comerciales entre las
que destaco por su funcionalidad a PostgreSQL Manager.
As tambin hay una variedad de herramientas para la administracin de bases de
datos PostgreSQL en modo consola, fabricadas por los mismos creadores de
PostgreSQL (http://www.postgresql.org) como son por ejemplo el terminal de
cliente interactivo de postgreSQL psql, o las aplicaciones para realizar copias de
seguridad y restauracin de base de datos pg_dump y pg_restore, o herramientas
cliente para crear y eliminar bases de datos como cretedb, dropdb entre otras que
son incluidas en la descarga completa del servidor PostgreSQL.
PgAdmin3
Es una interfaz comprensible para el diseo y administracin de una base de
datos PostgreSQL, diseada para ejecutarse en la mayora de los Sistemas
Operativos.
La aplicacin corre bajo GNU/Linux, FreeBSD y Windows.
La interfaz grfica soporta todas las caractersticas de PostgreSQL y facilita la
administracin.
Tambin incluye un Diseador de Consultas Grfico.
PHPPgAdmin
PHPPgAdmin es una poderosa herramienta de administracin basada en un
interfaz Web para bases de datos PostgreSQL.
Adems de la funcionalidad bsica, dispone de soporte para procedimientos
almacenados, triggers y vistas.
Las versiones de punta van mano a mano con el desarrollo del servidor
PostgreSQL.
Esta versin es una de las ms famosas de los administradores GUI para
PostgreSQL.
13
PSQL
Es la herramienta cannica para la ejecucin de sentencias SQL a travs del
shell del SO.
Es una herramienta de tipo frontend que permite describir sentencias SQL,
ejecutarlas y visualizar sus resultados.
El mtodo de ingreso puede ser mediante la insercin directa del cdigo en la
consola, o la ejecucin de sentencias dentro de un archivo de texto.
Provee diversos meta-comandos para la ejecucin de las sentencias, as como
diversas opciones tipo shell propias de la herramienta.
PgExplorer
PgExplorer es una herramienta de desarrollo para Postgres con una amplia
interfaz grfica.
Entre sus caractersticas se incluye una vista en rbol de las bases de datos y
sus respectivos objetos.
Se puede realizar ingeniera inversa a travs de sentencias SQL o scripts
personalizados.
Hay una amplia gama de asistentes que guan a travs del proceso necesario
para generar comandos SQL para varios objetos y sentencias.
Tambin incluye un Diseador de Consultas Grfico.
14
Informacin general
Creador
Adaptive
Server
Sybase/iAnywhere
Anywhere
Adaptive
Server
Sybase Inc
Enterprise
ANTs Data Server
ANTs Software
DB2
IBM
ltima
Fecha de la primera
versin
versin pblica
estable
Licencia
software
1992
10.0
Propietario
1987
15.0
Propietario
1999
1982
3.6
9
de
[Firebird]
Firebird Foundation
25 de julio de 2000
2.1
Informix
HSQLDB
1985
2001
10.0
1.9
1980
2006
CA-TOSL
InterBase
Informix Software
Hsqldb.Org
Berkeley
University, Computer
Associates
Borland
Propietario
Propietario
Licencia Pblica
InterBase
Propietario
Licencia BSD
1985
7.5.1
SapDB
SAP AG
MaxDB
Microsoft SQL Server
MySQL
Oracle
Ingres
PostgreSQL
SmallSQL
SQLite
Propietario
GPL con
7.4
drivers LGPL
7.7
GPL o propietario
2008
Propietario
5.0
GPL o propietario
11g Release 2 Propietario
9.0
Licencia BSD
0.12
3.6.16
ltima
Fecha de la primera
versin
versin pblica
estable
Creador
LGPL
Dominio pblico
Licencia
software
de
Server
Mac OS X
Linux
BSD
Unix
z/OS
DB2
Quiz
[[Firebird]]
No
?
15
HSQLDB
Informix
Ingres
InterBase
No
No
S (Solaris)
SapDB
No
No
MaxDB
No
No
No
No
No
No
MySQL
No
Quiz
Oracle
PostgreSQL
No
SmallSQL
S
Linux
S
BSD
S
Unix
Quiz
SQLite
S
Windows
S
Mac OS X
S
No
Quiz
No
z/OS
Caractersticas fundamentales
Informacin acerca de que caractersticas fundamentales de las RDBMS son
implementados nativamente.
ACID
Adaptive
Enterprise
Server
Integridad referencial
S
Transacciones
S
Unicode
S
DB2
Firebird
HSQLDB
Informix
Ingres
InterBase
SapDB
MaxDB
MySQL
Depende 1
Depende 1
Depende 1
Oracle
PostgreSQL
SQLite
S
ACID
S
2
No
Integridad referencial
Bsico
S
2
Transacciones
S
Unicode
Nota (1): Para las transacciones y la integridad referencial, el tipo de tabla InnoDB debe
ser usado; el tipo de tabla por defecto, MyISAM,
No soporta estas caractersticas. Sin
embargo, inclusive el tipo de tabla InnoDB permite el almacenamiento de valores que
excedan el rango de datos; algunas vistas violan la limitacin de ACID.
Nota (2): Las limitaciones de CHECK y FOREIGN KEY son analizadas
pero
No forzadas. Transacciones anidadas
No son soportadas.[1]
16
Tablas y vistas
Informacin acerca de que tablas y vistas 3 (unas ms bsicos que otras) son soportados
nativamente.
Tabla temporal
Adaptive
Enterprise
Server
Vista materializada
S 5
DB2
[[Firebird ]]
No
HSQLDB
No
Informix
Ingres
No
InterBase
No
SapDB
No
MaxDB
MySQL
No
Oracle
PostgreSQL
No 4
SQLite
No
Similar 6
S
Tabla temporal
No
Vista materializada
Nota (4): La vista materializada puede ser emulada con PL/PgSQL [2].
Nota (5): El servidor provee tempdb, que puede ser usado para tablas temporales
pblicas y privadas (para la sesin). [3]
Nota (6): El servidor MS SQL provee vistas indexadas. [4]
ndices
Informacin acerca de que ndices (otros como los ndices bsicos B-/B+) son soportados
nativamente.
rbol R-/R+
Adaptive
Enterprise
Server
No
DB2
No
Firebird
HSQLDB
Hash
Mapa
bits
No
No
No
No
No
No
?
No
?
No
?
No
?
No
?
de
No
?
Informix
No
No
No
Ingres
No
No
No
No
17
InterBase
No
No
No
No
SapDB
No
No
No
No
MaxDB
No
No
No
No
No
No
No
No
MySQL
No
No
No
No
Oracle
Edicin EE solamente
No
S
No
PostgreSQL
No
SQLite
No
No
No
No
No
rbol R-/R+
No
Mapa
Expresin Parcial Reversa
bits
Hash
de
Otros objetos
Informacin acerca de que otros objetos son soportados nativamente.
Dominio
Adaptive
Enterprise
Server
Cursor
Trigger
Funciones 5
Procedimiento 5
Rutina externa 5
DB2
No
Firebird
No
HSQLDB
Informix
Ingres
InterBase
S
?
S
SapDB
MaxDB
No
MySQL
No
S
3
S
3
S
3
S
3
Oracle
PostgreSQL
S
Trigger
No
Funciones
SQLite
No
Dominio
No
Cursor
No
Procedimiento
S
Rutina externa
Nota (3): Estos objetos de base de datos son disponibles a partir de MySQL 5.0 disponible
desde 24/12/2005.
Nota (5): Funcin y procedimiento se refieren a las rutinas internas escritas en SQL o
lenguajes procedurales como PL/SQL. Rutina externa se refiere a la escritura en los
lenguajes anfitriones como C, Java, Cobol, etc. "Procedimiento almacenado" es un
trmino comnmente usado para ese tipo de rutinas. Sin embargo, su definicin vara
entre diferentes vendedores de bases de datos.
18
Particionamiento
Informacin acerca de que mtodos de particionamiento son soportados nativamente.
Adaptive
Enterprise
Server
Rango
Hash
Compuesto (Rango+Hash)
Lista
AA
AA
AA
AA
DB2
Firebird
HSQLDB
Informix
No
?
?
Ingres
InterBase
SapDB
MaxDB
No
?
?
S
No
?
?
No
?
?
S
No
?
?
No
?
?
S
No
?
?
No
?
?
No
No
No
MySQL
Oracle
PostgreSQL
No
No
SQLite
S
Rango
S
Hash
S
Compuesto (Rango+Hash)
S
Listas
19
Procesos en el Cliente
20
Postmaster
Es un proceso demonio supervisor que se ejecuta constantemente.
Utiliza una arquitectura de invocacin implcita para escuchar alguna o todas las
llamadas a la base de datos.
Cuando recibe una llamada desde un cliente, crea un proceso back end (servidor
postgres) para hacerlo coincidir, utilizando una correspondencia 1-1.
Una vez que el proceso se crea, se enlaza el cliente y el proceso postgres para
que ya no tengan que comunicarse a travs del Postmaster.
22
Intrprete
Acepta una consulta SQL en forma de texto ASCII.
El analizador lxico busca coincidencia de patrones en la consulta para reconocer
los identificadores y palabras clave.
El Intrprete entonces ensambla estos en un rbol de traduccin.
El Intrprete comprueba que la consulta SQL tenga una sintaxis vlida, pero no
entiende la semntica.
Polica de trfico
Enva comandos simples para el ejecutor y los complejos se envan al planificador
/ optimizador.
Planificador / Optimizador
Las Consultas SQL se pueden ejecutar en diferente orden y producen los mismos
resultados.
El Planificador / Optimizador elegir la mejor ruta o la ms eficiente si existen
varias posibilidades.
A continuacin, se pasa hacia el Ejecutor.
Ejecutor
Recibe el plan de Planificador / Optimizador en la forma de un rbol.
Extrae las tablas de datos necesarias.
Recursivamente pasa por el plan, y lleva a cabo las acciones necesarias en cada
nodo.
Enva al tnel y filtra, sin procesamiento por lotes.
Devuelve una salida al cliente.
Administracin de Datos
La base de datos es mantenida por varios subsistemas independientes (y algunas
veces opcional) iniciadas por el Postmaster en la construccin, incluyendo:
23
El colector de Estadsticas.
El Auto-Vacuum.
El escritor Background.
El Sistema de Administracin de la memoria.
Colector de Estadsticas
Registros de la tabla / ndice de accesos de la base de datos, el uso de
funciones definidas por el usuario y los comandos que se ejecutan por los
procesos del servidor.
La informacin se transmite desde el colector a travs de los archivos
temporales en los procesos solicitantes.
Procesos que envan informacin relevante al colector peridicamente para
mantenerlo al da.
24
Auto-Vacuum
El Auto-Vaccum es una coleccin de procesos para escanear las tablas de la
base(s) de datos con el fin de liberar la memoria no utilizada, actualizar las
estadsticas, y prevenir la prdida de datos.
El Auto-Vaccum se basa en los datos recibidos desde el recolector de
estadsticas para el anlisis de la tabla adecuada.
Background Writer
El Background Writer mantiene la informacin de los archivos logs (registro de
la actividad) y backups (copia de seguridad) actualizados.
El Background Writer mantiene actualizados los archivos logs con todos los
cambios realizados a la base de datos desde su ltimo backup a fin de que
todos los datos estn seguros.
La salida estndar de cada subsistema se pasa al Background Writer para
mantener estos archivos logs.
Almacenamiento de Datos
La base de datos es mantenida por varios subsistemas independientes (y algunas
veces opcional) iniciadas por el Postmaster en la construccin, incluyendo:
El Acceso.
El Almacenamiento.
La Rutina de Carga (Bootstrap).
La grabacin en Disco.
Acceso
El Subsistema de Acceso est a cargo de:
indexacin
exploracin
bsqueda
recopilacin y devolucin de datos
25
Almacenamiento
Los datos almacenados son accesados a travs del Subsistema de
Almacenamiento:
Encargada del mantenimiento de una serie de buffers compartidos.
Permite mltiples accesos a las mismas tablas utilizando un modelo de control
de concurrencia multiversin (MVCC - multiversion concurrency control model).
Mantiene bloqueos de tabla y asegura la concurrencia de datos.
Conclusin
La Arquitectura general de PostgreSQL es Orientada a Objetos / Repositorio.
EL Front-end es una arquitectura cliente-servidor desde la Biblioteca de Cliente a
los Procesos del Servidor Postgres y el Postmaster que utiliza invocacin implcita.
El Servidor Postgres emplea arquitectura de Tnel Hbrido y Filtro / Repositorio.
El Control de Bases de Datos utiliza una arquitectura Orientada a Objetos.
Adelante veremos el cdigo fuente para determinar las dependencias a nivel de
cdigo, lo que nos permite formar una arquitectura concreta.
27
http://yum.pgrpms.org/9.2/redhat/rhel-6-i386/pgdg-centos92-9.2-6.noarch.rpm
Si instala en un Linux diferente utilice el rpm apropiado.
Usando wget:
[root@server1 ~]# wget http://yum.pgrpms.org/9.2/redhat/rhel-6-x86_64/pgdg-centos92-9.2-6.noarch.rpm
1.
2.
3.
4.
5.
6.
7.
8.
9. 100%[======================================>] 5,124 --.-K/s in 0s
10.
11. 2011-11-01 00:11:51 (310 MB/s) - pgdg-centos92-9.2-6.noarch.rpm
12.
13. [root@server1 ~]#
1.3 Excluir del CentOS, Fedora, Red Hat y Scientific Linux sus propios
paquetes PostgreSQL.
Este paso es importante para conseguir que el repositorio de PostgreSQL
funcione correctamente. Hay que excluir los paquetes PostgreSQL desde el
repositorio de la distribucin.
CentOS
Ahora tenemos que editar el archivo /etc/yum.repos.d/CentOS-Base.repo y
adicionarle la clausula 'exclude = postgresql*' en las secciones [base] y
[updates] para excluir postgreql.
1.
2.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
[base]
....
....
exclude=postgresql*
# released updates
[updates]
....
....
exclude=postgresql*
29
Fedora
Adicionamos la clausula 'exclude = postgresql*' en la seccin [fedora] del
archivo /etc/yum.repos.d/fedora.repo:
1.
2.
1.
2.
3.
4.
[fedora]
....
....
exclude=postgresql*
1.
2.
3.
4.
[main]
....
....
exclude=postgresql*
10. exclude=postgresql*
Fedora
1. [root@server1 ~]# rpm -i pgdg-fedora92-9.2-6.noarch.rpm
31
Otra forma,
Inicializar el Postgres:
1.
2.
3.
Contiene el ruta para el directorio data, pero no la ruta para el directorio de los
binarios ejecutable. Para modificar esto, agregue la ruta de la siguiente manera:
1.
2.
3.
4.
5.
Para que acepte todas las conexiones, se agrega en la parte de IPv4 local
connections la lnea:
host all
all
0.0.0.0/0 md5
Cambiar METHOD a md5 para que solicite contrasea, ver cambios abajo:
1.
2.
3.
4.
....
# TYPE DATABASE USER
ADDRESS
local all
all
md5
# IPv4 local connections:
METHOD
33
5.
6.
7.
8.
9.
host
host
# IPv6
host
....
all
all
127.0.0.1/32 md5
all
all
0.0.0.0/0
md5
local connections:
all
all
::1/128
md5
all
test
all
10.20.4.0/24
md5
testuser
127.0.0.1/32 md5
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
1.
2.
3.
4.
5.
6.
7.
8.
-bash-4.1$
3.
4.
5.
6.
7.
8.
9.
10.
11.
[ OK ]
[ OK ]
35
-bash-4.1$ psql
Password:
psql (9.2.6)
Type "help" for help.
postgres=# show listen_addresses;
listen_addresses
-----------------*
(1 row)
postgres=# show port;
port
-----5432
(1 row)
postgres=#
Crear un usuario:
1.
2.
36
3.
4.
Consultas en la Tabla
1.
2.
3.
4.
5.
6.
7.
test=> \dt
List of relations
Schema |
Name
| Type | Owner
--------+-----------+-------+-------public | testtable | table | myuser
(1 row)
Fedora 18/17/16
1.
2.
3.
4.
5.
37
Fedora 18/17/16
1.
4 Optimizacin
4.1 Crear enlaces simblicos para compatibilidad con versiones de
anteriores a PostgreSQL 9.x
Mucho, si no la mayora de los mdulos y software de terceros buscan los
archivos de configuracin del Postgres y el directorio de datos en sus antiguas
ubicaciones (antes de la versin 9).
Se puede solucionar este inconveniente y hacer la vida ms fcil, creando
algunos enlaces simblicos de los nuevos lugares a los anteriores.
Enlace 1: Enlace simblico para el directorio binario. Esto es particularmente
til ya que es la ubicacin del archivo de pg_config.
1.
38
shared_buffers = 256MB
temp_buffers = 16MB
temp_buffers: La memoria temporal utilizada por cada sesin para las tablas
temporarias y para apertura de tablas en cada sesin de cada base de datos,
tome en cuenta que este valor depender obviamente de la cantidad de datos
que carga cada sesin y depender muchsimo del sistema que se utiliza.
3.
work_mem = 16MB
max_stack_depth = 8MB
shared_preload_libraries = '$libdir/plpython2.so'
39
6.
bgwriter_delay = 500ms
9. vm.dirty_bytes = 67108864
10. vm.dirty_background_bytes = 134217728
Al instalar la BD, cambiamos los parmetros del comando initdb para Inicializar
el Cluster en el directorio creado anteriormente:
4. -bash-4.1$ /usr/pgsql-9.2/bin/initdb -D /srv/postgresql
Se utiliza para ampliar el espacio que contiene las Bases de Datos o para tener
los ndices y las tablas en discos separados para mejorar los procesos de
acceso i/o.
Entramos al usuario postgres
1. [root@server1 ~]# su - postgres
Entramos al psql
2. -bash-4.1$ psql
WITH
ENCODING='UTF8'
OWNER=postgres
42
Ubicacin
Ejecutables
/usr/bin
Libreras
/usr/lib
Documentacin
/usr/share/doc/postgresql-x.y. z
/usr/share/doc/postgresql-x.y . z/contrib
Contrib
/usr/share/pgsql/Contrib
rea de Datos
/var/lib/pgsql/data
rea de Backup
/var/lib/pgsql/backup
Templates
/usr/share/pgsql
Lenguajes Procedurales
/usr/lib/pgsql
Development Headers
/usr/include/pqsql
/usr/share/ pqsql
Pruebas de Regresin
Documentacin SGML
/usr/share/doc/postgresql-docs-x.y.z
Descripcin
PG_VERSION
base
global
pg_clog
pg_multixact
pg_notify
pg_serial
pg_snapshots
pg_stat_tmp
pg_subtrans
pg_tblspc
pg_twophase
Directorio con
preparadas.
pg_xlog
archivos
de
estado
para
transacciones
postmaster.pid
tem
Descripcin
(este archivo no est presente despus que el servidor se
detiene).
Limite
base de datos
tabla
32 TB.
fila
400 GB.
campo
1 GB.
Sin lmites.
Sin lmites.
utilizando la tabla de particionado. Una limitacin es que los ndices no pueden ser
creados en columnas ms largas que alrededor de 2.000 caracteres.
Afortunadamente, esos ndices son raramente necesarios. La Singularidad es la
mejor garanta por una funcin de un ndice hash MD5 el largo de la columna, y la
indexacin de texto completo permite la bsqueda de las palabras dentro de la
columna.
-bash-4.1$
-bash-4.1$
-bash-4.1$
total 28
drwx-----drwx-----drwx------
cd /var/lib/pgsql/9.2/data/base
ls -l
ls l
2 postgres nogroup 12288 2011-10-04 17:53 1
2 postgres nogroup 4096 2011-10-04 17:53 11939
2 postgres nogroup 4096 2011-10-04 17:53 11947
En el directorio base existen otros con nombres numricos y cada uno es una
base de datos diferente. Para saber a qu base de datos corresponden se ejecuta:
1. postgres=# SELECT datid,datname from pg_stat_database;
2. datid | datname
3. -------+-------------4.
1 | template1
5. 11939 | template0
6. 11947 | postgres
7. (3 rows)
46
-bash-4.1$
total 24
drwx-----drwx-----drwx-----drwx------
ls -l /var/lib/pgsql/9.2/data/base/
2
2
2
2
postgres
postgres
postgres
postgres
nogroup
nogroup
nogroup
nogroup
postgres=# \c test_interno
You are now connected to database "test_interno" as user "postgres".
test_interno=# CREATE TABLE test001 (id INTEGER, code INTEGER, primary key(id));
NOTICE: CREATE TABLE/PRIMARY KEY will create implicit index "test001_pkey
CREATE TABLE
test_interno=# \d test001
Table "public.test001"
Column | Type
| Modifiers
--------+---------+----------id | integer | not null
code | integer |
Indexes:
"test001_pkey" PRIMARY KEY, btree (id)
47
2. pg_relation_filenode('test001'),pg_relation_filepath('test001');
3.
4. pg_relation_filenode | pg_relation_filepath
5. ----------------------+-------------------------6.
16465 | base/16407/16465
7. (1 row)
test_interno=# SELECT
pg_relation_filenode('test001_pkey'),pg_relation_filepath('test001_pkey');
pg_relation_filenode | pg_relation_filepath
----------------------+--------------------------16468 | base/16407/16468
(1 row)
Si la tabla o ndice llegan a ser mayores que 1GB, se dividirn a nivel del sistema
de ficheros en ficheros con un mximo de 1GB cada uno. Si por ejemplo, la tabla
llega a ser de 3,5GB, se ver algo similar a esto:
1.
2.
3.
4.
5.
-bash-4.1$
-rw-------rw-------rw-------rw-------
ls -l /var/lib/pgsql/9.2/data/base/16407/16465*
1 postgres pgdba 1073741824 Jul 5 15:11 base/16407/16465
1 postgres pgdba 1073741824 Jul 6 15:11 base/16407/16465.1
1 postgres pgdba 1073741824 Jul 7 15:11 base/16407/16465.2
1 postgres pgdba 536870912 Jul 8 15:11 base/16407/16465.3
48
49
Para una completa descripcin de estas cabeceras y las estructuras usadas para
almacenar los datos en el disco se puede consultar la documentacin y el cdigo
fuente.
Los ndices no requieren tanta sobrecarga, pero contienen los datos que se estn
indexando, por lo que pueden ser muy grandes tambin.
Los valores NULL se almacenan como mapas de bits, por lo que usan muy poco
espacio.
Tipos de Tablas
En Linux, PostgreSQL almacena las bases de datos en el directorio
/var/lib/pgsql/data/base y a partir de ah un directorio para cada base. En
Windows PostgreSQL almacena los archivos de las bases de datos en el directorio
C:\Archivos de Programa\PostgreSQL\9.2\data\Base.
50
Cada tabla es considerada un archivo, as como los ndices. Los nombres de las
tablas pertenecientes al sistema llevan el prefijo pg_. Por ejemplo, el archivo
PG_VERSION (presente en cada base de datos) contiene la versin mayor con la
que fue creada la base y al cambiar de versin de PostgreSQL es importante
respaldar este archivo.
A continuacin se muestra el contenido de las tablas que PostgreSQL utiliza
como catlogos para mantener el sistema. Cada base de datos que se crea, tiene
estas mismas tablas, salvo la primera (pg_database) que es nica para todas las
bases de datos:
Nombre tabla
pg_database
Bases de datos
pg_class
Clases o tablas
pg_attribute
pg_index
ndices secundarios
pg_proc
Procedimientos
pg_type
pg_user
Usuarios de PostgreSQL
pg_operator
Tabla: Contenido de las tablas que se usan como catlogos del sistema
Por ejemplo, para saber que bases de datos hay en el sistema se ejecuta la
consulta:
1. postgres=# SELECT * FROM pg_database;
Tipos de Datos
Como todos los manejadores de bases de datos, PostgreSQL implementa los
tipos de datos definidos para los estndares SQL/92 y SQL3 (SQL/99) y aumenta
algunos otros.
51
Correspondiente en
SQL3
Descripcin
Bool
boolean
Char(n)
character(n)
Date
date
Float8
real, double
precision
int2
smallint
int4
int, integer
money
decimal(9,2)
cantidad monetaria
Time
time
timespan
interval
intervalo de tiempo
timestamp
varchar(n)
character varying(n)
Descripcin
Box
Cidr
circle
crculo en el plano
Inet
int8
Line
Lseg
Path
52
point
polygon
serial
53
54
Descripcin
CREATE TABLE
INSERT INTO
SELECT
Desplegar datos.
WHERE
Filas especficas.
DELETE
Remover datos.
UPDATE
ORDER BY
Ordenar el resultado.
DROP
Destruir.
Tipo
Cadena de
caracteres
CHAR(long)
VARCHAR(long)
INTEGER
FLOAT
NUMERIC
(precisin, decimal)
DATE
Fecha.
TIME
Hora.
TIMESTAMP
Fecha y hora.
Nmero
Fecha/hora
Descripcin
Opcin (flag)
Descripcin
--help
-U USUARIO
-d [BASE DE
DATOS]
-h EQUIPO
-p PUERTO
-l
-o [ARCHIVO]
-L [ARCHIVO]
-H
-A
-t
-e
-E
-x
-F [CADENA]
-t
Generar un archivo tipo CSV (delimitado por comas) con el resultado de una
consulta. Este archivo se puede abrir desde Excel.
1.
2.
3.
4.
5.
6.
7.
8.
9.
57
Descripcin
\c BASE DE
Permite reconectarse. Recibe como parmetros la base de
DATOS USUARIO
datos, usuario, equipo y puerto.
EQUIPO PUERTO
\q
Sale de psql.
\timing
\! COMANDO
\e ARCHIVO
Descripcin
\g ARCHIVO
\p
\w ARCHIVO
\s ARCHIVO
\i ARCHIVO
\o ARCHIVO
\dt
\d TABLA
-bash-4.1$ psql
psql (8.4.13)
Type "help" for help.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
postgres=# \l
List of databases
Name
| Owner
|Encoding| Collation |
Ctype
|
Acces
------------+----------+--------+-------------+-------------+----------------Pruebas
| pruebas | UTF8
| en_US.UTF-8 | en_US.UTF-8 |
dbadmision | postgres | UTF8
| en_US.UTF-8 | en_US.UTF-8 |
fiscal
| fiscal
| UTF8
| en_US.UTF-8 | en_US.UTF-8 |
postgres
| postgres | UTF8
| en_US.UTF-8 | en_US.UTF-8 |
template0 | postgres | UTF8
| en_US.UTF-8 | en_US.UTF-8 | =c/postgres
: postgres=CTc/postgres
template1 | postgres | UTF8
| en_US.UTF-8 | en_US.UTF-8 | =c/postgres
: postgres=CTc/postgres
test
| testuser | UTF8
| en_US.UTF-8 | en_US.UTF-8 | =CTc/testuser
: testuser=CTc/testuser
7 (rows)
postgres=#\c test
You are now connected to database "test".
59
19. test=#
test=# \! vi cp.sql
select * from testtable;
select col2,col1 from testtable;
~
~
:wq
test=# \i cp.sql
id | col1
| col2
-----+---------+------100 | hola
| mundo
101 | ciao
| mondo
102 | hello
| world
103 | bonjour | monde
(4 rows)
col2 | col1
-------+--------mundo | hola
mondo | ciao
world | hello
monde | bonjour
(4 rows)
test=#
test=# \dt
List of relations
Eschem |
Name
| Type | Owner
---------+--------------+-------+---------public | amigos
| tabla | testuser
public | clientes
| tabla | testuser
public | cuentas
| tabla | testuser
public | invitaciones | tabla | testuser
public | testtable
| tabla | testuser
public | usuarios
| tabla | postgres
(6 rows)
test=#\d testable
Table public.testtable
Column |
Type
| Modifiers
---------+-------------------+-----------id
| integer
|
col1
| character varying |
col2
| character varying |
60
1.
2.
En este caso test es el nombre de la base de datos, pero puede ser cualquier otro.
Hay que diferenciar entre maysculas y minsculas
Una vez conectados al servidor PostgreSQL, teclear lo siguiente:
4.
5.
6.
7.
8.
9.
10.
test=>SELECT CURRENT_USER;
current_user
-------------testuser
(1 row)
test=>
test=>SELECT CURRENT_TIMESTAMP;;
now
---------------------------2013-05-31 23:03:15.578-05
(1 row)
test=>
test=# SELECT
test-# 1 + 3
test -#;
column
--------4
(1 row)
test=#
61
Con las teclas de las flechas derecha e izquierda se puede recorrer lo que se
escribe, con las flechas arriba y abajo se recuperan las lneas previamente
escritas.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
62
NULL vs BLANK
Una columna tipo cadena de caracteres adems de ser NULL, tambin puede ser
blank.
Un campo numrico no puede ser blank, solo NULL.
12.
13.
14.
15.
16.
test
test
test
test
test
=#
-#
-#
=#
=#
INSERT
VALUES
VALUES
SELECT
SELECT
Valores DEFAULT
Cuando no se da un valor a la columna se le asigna un NULL.
Cuando creamos una tabla, con la palabra clave DEFAULT en la columna,
podemos dar un valor cuando no se asigne alguno.
Por ejemplo, para la columna timestamp el valor de default puede ser una
variable interna de PostgrSQL que regresa la fecha y la hora actual.
1.
2.
3.
4.
5.
6.
7.
8.
9.
test=#
test-#
test-#
test-#
test-#
test=#
test=#
test-#
test=#
Ejemplos
63
1.
2.
3.
4.
5.
6.
7.
pg_dump y pg_dumpall
Las herramientas clientes pg_dump y pg_dumpall nos ayudan tanto para respaldar
las tablas o bases de datos o para migrarlas de un sistema a otro en un formato
transportable. Estas utilidades vienen incluidas en el paquete de instalacin
PostgreSQL para Windows o Linux y tienen el mismo tipo de licencia que el
paquete PostgreSQL, es decir BSD (Berkeley Software Distribution). Se instalan
en el directorio "\bin" dentro del directorio de instalacin de PosgreSQL.
La utilidad pg_dump apareci en la versin "release 0.02" de Postgres95, pero se
mejor desde la versin de PostgreSQL "release 7.1".
En algunos casos al actualizar la versin de PostgreSQL ser necesario primero
respaldar las tablas con estas herramientas para posteriormente volverlas a
cargar; pg_dump se emplea para respaldar una base de datos o una tabla en
particular, mientras que pg_dumpall respalda todas las bases de datos del
sistema. Su sintaxis es la siguiente:
pg_dump [opciones.] [nombre_base_datos]
A continuacin se muestran algunas de sus opciones ms tiles:
-a: Respalda solo los datos en un archivo de texto plano, no las definiciones
(esquema).
-f formato: Selecciona el formato de salida para el archivo que puede ser:
p: Es el formato predeterminado; el archivo se genera en un archivo plano de
texto de tipo "SQL script".
t: La salida se genera en un archivo ".tar"; este formato puede ser modificado
en la entrada del programa que recupera respaldos pg_restore. Usando este
formato de archivo se permite excluir objetos de la base de datos en el
momento en que se restaura.
c: El archivo de salida se genera en un formato modificable para la entrada
en el programa pg_restore. Este es el formato ms flexible para reordenar la
64
carga de datos con las definiciones de los objetos (esquema). Este formato
se comprime por defecto.
-s: Solamente respalda el esquema de la base de datos (definiciones de
objetos), no los datos.
-t tabla: Respalda los datos y el esquema de la tabla especificada.
La forma ms general de emplear pg_dump para respaldar slo una tabla, es la
siguiente:
pg_dump -t mitabla mibase > mibase.mitabla.dump
Con lo cual en el archivo "mibase.mitabla.dump" tenemos un archivo con los datos
y el esquema de la tabla 'mitabla' para poder recuperar toda la informacin de la
misma.
Al respaldar una tabla de esta manera, lo primero que hace pg_dump es tratar de
identificar al usuario creador de la tabla, luego crea la tabla, fija los permisos
existentes, copia los datos y finalmente crea el ndice si es que la tabla tiene un
ndice asociado.
Es mejor comprimir los archivos para ocupar el mnimo espacio posible. Por
ejemplo, podemos hacerlo as:
pg_dump -t mitabla mibase | gzip -9c > mibase.mitabla.dump.gz
pg_dump -t mitabla mibase | bzip2 -c > mibase.mitabla.dump.bz
Ambos programas de compresin (gzip y bzip2) pueden ser consultados con el
sistema man (de manual) en Linux. Para recuperar la informacin en la base de
datos, podemos emplear la siguiente instruccin en la lnea de comandos:
gunzip -c mibase.mitabla.dump.gz
bunzip2 -c mibase.mitabla.dump.bz
pg_restore
Esta herramienta restaura o recupera una base de datos PostgreSQL desde un
archivo creado con la herramienta pg_dump. Pg_restore apareci por primera vez
en la versin 7.1 de PostgreSQL. Al igual que las anteriores, esta utilidad se
instala en el directorio "\bin" dentro del directorio de instalacin de PosgreSQL y
tiene el mismo tipo de licencia (BSD) que el paquete PostgreSQL.
65
createdb y dropdb
66
Una de las primeras operaciones para probar la conexin y correcta instalacin del
servidor de bases de datos PostgreSQL es crear una base de datos. Para crear
una base de datos se puede utilizar la aplicacin createdb y para eliminarla del
servidor se utiliza dropdb.
Estas aplicaciones se instalan en el directorio "\bin" dentro del directorio de
instalacin de PosgreSQL y su sintaxis es la siguiente:
createdb nombre_base_datos
dropdb nombre_base_datos
Un ejemplo de cmo crear una base de datos (mydb) mediante la aplicacin
createdb se muestra a continuacin:
createdb mydb
Createdb es una aplicacin alternativa al comando SQL "CREATE DATABASE" y
luego de ejecutarse esta aplicacin se muestra la respuesta "CREATE
DATABASE".
Si se recibe un mensaje similar a "createdb: command not found" puede ser
porque PostgreSQL no fue instalado apropiadamente o porque no se encuentra la
ruta de la aplicacin en el directorio "\bin" del directorio de instalacin de
PostgreSQL, entonces se debe probar escribiendo la ruta completa en donde se
encuentra la aplicacin y ejecutarla.
En Linux por ejemplo, la aplicacin createdb se encuentra en "/usr/bin/createdb"
mientras que en Windows se encuentra en "C:\Archivos de programa\PostgreSQL\
8.1\bin\createdb".
Otra respuesta de error al ejecutar createdb puede ser la siguiente:
psql: could not connect to server: Connection refused
Is the server running on host "nombre_server" and accepting
TCP/IP connections on port 5432?
En cuyo caso deberemos revisar los archivos de configuracin de PostgreSQL
(pg_hba.conf, pg_ident.conf y postgresql.conf) ubicados en el directorio "/Data"
donde se instal el servidor PostgreSQL o debemos reinstalar el servidor
PostgreSQL porque no se puede establecer una conexin al servidor.
Para eliminar una base de datos fsicamente del servidor se utiliza la aplicacin
dropdb, la misma que es una aplicacin alternativa al comando SQL "DROP
DATABASE".
67
Al eliminar una base de datos se eliminan tambin todos los objetos que contiene
la base de datos, adems se debe tener cuidado porque no se puede recuperar
una base de datos una vez que esta se elimine.
Postmaster y pg_ctl
Luego de instalar PostgreSQL y antes de acceder a cualquier base de datos se
debe arrancar el servidor PostgreSQL. Esta operacin se la puede realizar
mediante el programa llamado postmaster, indicndole al mismo donde se
encuentra el directorio "\Data" de PostgreSQL mediante la opcin -D. Este
programa se encuentra en el directorio "bin" donde se instal PostgreSQL
(/usr/bin/postmaster) y la manera ms comn de arrancar el servidor mediante la
aplicacin postmaster es:
postmaster -D /var/lib/pgsql/data
Pg_ctl es una aplicacin incluida tambin en el directorio "bin" donde se instala
PostgreSQL, y se proporciona para simplificar algunas tareas como iniciar y
detener al servidor PostgreSQL. Por ejemplo:
pg_ctl start -l logfile
Esta operacin arranca el servidor y coloca las transacciones en el archivo
especificado (logfile). La opcin de -D le indica al servidor PostgreSQL donde se
encuentra el directorio "\Data" que es donde normalmente se guardan las bases
de datos.
PgAdmin
PgAdmin es una aplicacin con interfaz grfica comprensible para el diseo y
administracin total de bases de datos PostgreSQL; esta aplicacin est diseada
para ejecutarse en sistemas operativos como GNU/Linux y Windows. PgAdmin
versin 3 se ejecuta desde la versin de la base de datos PostgreSQL 7.3 y
superiores. Para versiones anteriores de la base de datos, se debe usar la versin
de PgAdmin2.
68
70
Administracin de Sesiones
Inicio y Tipos de sesiones:
Los usuarios pueden iniciar sesiones al acceder a una base de datos PostgreSQL
utilizando diversos tipos de procesos frontend:
Ejecutando el programa de terminal interactiva psql, que permite introducir,
editar y ejecutar sentencias SQL sobre una base de datos.
Utilizando una herramienta grfica como PgAdmin III para crear y manipular
bases de datos.
Mediante un programa de aplicacin hecho a medida que incorpore
sentencias SQL para acceder a la base de datos.
En nuestras prcticas utilizaremos la terminal interactiva psql y PgAdmin III para
conectarnos a una base de datos y practicar sobre ella el lenguaje SQL.
Control de sesiones:
Proceso:
En primer lugar, nos conectamos a nuestro servidor de bases de datos
PostgreSQL.
1.
2.
3.
4.
5.
Retorna:
71
Retorna:
6.
postgres=#
select datname, pid, usename, application_name, client_addr, query from
pg_stat_activity;
Que regresa:
8.
postgres=#
select datname, pid, usename, application_name, client_addr, query from
pg_stat_activity;
73
Que regresa:
Para eliminar todas las conexiones de una determinada base de datos, con una
nica instruccin:
10. postgres=#
'test';
http://www.postgresql.org/docs/8.2/interactive/functions-admin.html#FUNCTIONSADMIN-SIGNAL-TABLE
74
Caso de Estudio
El diagrama siguiente es un modelo pequeo, pero servir para las
demostraciones de la administracin de la estructura de los objetos con el uso de
Sentencias DDL, manipulacin de la informacin con el uso de Sentencias DML,
administracin de los procesos transaccionales con el uso de Sentencias TCL y
administracin de privilegios en los objetos con el uso de Sentencias DCL en
PostgreSQL.
Descripcin: Una universidad realiza el registro de contactos, que son las
personas que podran ser potenciales postulantes a diferentes carreras. Los
postulantes debern pertenecer a un periodo acadmico y debern elegir una
modalidad as como la carrera a la que quieren postular. Por lo general en un ao
solo existen dos periodos acadmicos, por ejemplo los periodos acadmicos del
ao 2008 fueron: 2008-1 y 2008-2. El contacto debe tener los datos personales del
sujeto as como la fecha de creacin. El postulante debe tener registrado si asisti
a su examen de admisin, y si ingres o no, debe tener tambin establecido el
puntaje que alcanz en el examen.
Con esos datos podemos comenzar a elaborar la estructura de nuestro sistema de
informacin y las relaciones que existen entre todos sus objetos: DBAdmision,
Admisin, Persona, carrera, peracad (perodo acadmico), modalidad, postulante
y contacto
75
Sentencias DDL
El Lenguaje de Definicin de Datos (Data Definition Language - DDL) sirve para
modificar la estructura de los objetos en una base de datos.
El DDL se utiliza para describir todas las estructuras de informacin y los
programas que se usan para construir, actualizar e introducir la informacin que
contiene una base de datos. El DDL permite al administrador de la base
especificar los elementos de datos que la integran , su estructura y las relaciones
que existen entre ellos, las reglas de integridad, los controles a efectuar antes de
autorizar el acceso a la base.
Estas sentencias bsicamente son: CREATE, ALTER, DROP y TRUNCATE.
name
user_name
template
Parmetros de Entrada
Nombre de la Base de Datos
Nombre del propietario de la Base de Datos, default usuario que crea la base de datos
template1: default - con locales adicionados.
template0: base de datos virgen con los objetos estndar
77
encoding
78
1.
CREATE
CREATE
CREATE
SELECT
SCHEMA cine
TABLE films (titulo text, fecha date, premios text[])
VIEW ganadores AS
titulo, fecha FROM films WHERE premios IS NOT NULL;
CREATE
CREATE
CREATE
SELECT
SCHEMA cine;
TABLE films (titulo text, fecha date, premios text[]);
VIEW ganadores AS
titulo, fecha FROM films WHERE premios IS NOT NULL;
TEMP
name
increment
minvalue
maxvalue
start
cache
CYCLE
Parmetros de Entrada
Si se especifica, la secuencia se crea solo para esta sesin y
se elimina al salir.
Nombre de la Secuencia.
Especifica el incremento. Un valor positivo har una
secuencia ascendente, uno negativo har una secuencia
descendente. El valor por omisin es uno (1).
Valor mnimo que una secuencia puede generar. El valor por
omisin es 1 y -2147483647 para secuencias ascendentes y
descendentes, respectivamente.
Valor mximo para una secuencia. Por omisin son
2147483647 y -1 para secuencias ascendentes y
descendentes, respectivamente.
Habilita la secuencia para que comience en cualquier lugar. El
valor de inicio por omisin es minvalue para secuencias
ascendentes y maxvalue para las descendentes.
Permite que los nmeros de la secuencia sean alojados
(preallocated) y almacenados en memoria para un acceso
mas rpido. El valor mnimo es 1 (solo se puede generar un
valor cada vez, i.e. sin cache) y es tambin el valor por
omisin.
Permite a la secuencia continuar cuando el valor de maxvalue
o el de minvalue ha sido alcanzado por una secuencia
ascendente o descendente respectivamente. Si el lmite es
alcanzado, el siguiente numero generado ser cualquiera que
para minvalue o maxvalue sea tomado como apropiado
Salidas ms usuales
CREATE SEQUENCE
Mensaje devuelto si la orden se completa satisfactoriamente.
ERROR: user username is not allowed to create/drop sequences.
Ha de tener el privilegio especial CREATE en la Base de Datos.
Uso:
Crea una secuencia ascendente llamada serial, comenzando en 101:
1. CREATE SEQUENCE serial START 101;
5. 101
Cambiar por:
10. IDContacto SERIAL,
Tambin
11. IDModalidad int default nextval('Admision.seq_idmodalidad'),
Cambiar por:
12. IDModalidad SERIAL,
Con estos cambios, no ser necesario realizar el paso 3, pero en realidad postgres
si realiza implcitamente la creacin de secuencias.
Para el propsito de la prctica:
13. CREATE SEQUENCE Persona.seq_idcontacto START 1;
--empieza desde 1
14. CREATE SEQUENCE Admision.seq_idmodalidad START 1; --empieza desde 1
82
CREATE TABLE introducir una nueva clase o tabla en la base de datos actual.
El propietario de la tabla ser del usuario que ejecuta el comando.
Cada type puede ser un tipo simple, un tipo complejo (set) o un tipo array. Cada
atributo puede ser especificado para ser no nulo, y puede tener un valor por
defecto, especificado por la Clusula DEFAULT.
Una tabla no puede tener ms de 1600 campos (realmente, esto viene limitado por
el hecho que el mximo tamao de una tupla debe ser menor que 8192 bytes)
Parmetros de Entrada
Si se especifica, la tabla se crea solo para esta sesin
y es eliminada al salir. Si existen tablas con el mismo
TEMP
nombre, no son visibles mientras exista la tabla
temporal
table
Nombre de la clase o tabla.
El tipo del campo. Puede incluir especificadores de
column
array..
Valor por defecto para el campo:
un literal
una funcin de usuario
DEFAULT value
CURRENT_USER
CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
La clusula opcional CONSTRAINT especifica una
lista de restricciones de integridad que las nuevas
inserciones o las actualizaciones debern satisfacer
para que una sentencia insert o update tenga xito.
Cada restriccin debe ser evaluada a una expresin
table_constraint_clause booleana. Se pueden referenciar mltiples campos
con una nica restriccin. Slo se puede definir una
nica clusula PRIMARY KEY por tabla; PRIMARY
KEY column(una restriccin de tabla) and PRIMARY
KEY (una restriccin de campo) son mutuamente
excluyentes.
La clusula opcional INHERITS especifica una
coleccin de nombres de tabla de las cuales esta tabla
hereda todos los campos. Si algn campo heredado
INHERITS
aparece ms de una vez, Postgres informa de un
inherited_table
error. Postgres permite automticamente a la tabla
creada heredar funciones de las tablas superiores a
ella en la jerarqua de herencia.
83
Salidas ms usuales
CREATE TABLE
Mensaje devuelto si la orden se completa satisfactoriamente.
ERROR:
Mensaje devuelto si la creacin de la tabla falla. Este mensaje viene
normalmente acompaado por algn texto explicativo, como:
ERROR: user username is not allowed to create/drop tables.
Ha de tener el privilegio especial CREATE en la Base de Datos.
ERROR: DEFAULT: type mismatched
Si el tipo de datos o el valor por defecto no corresponde al tipo de datos de
la definicin del campo.
Para nuestro caso prctico::
Con FechaCreacion date not null default now(), asignaremos la fecha actual por
defecto al campo FechaCreacion por medio de la funcin now().
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
84
34.
35.
36.
37.
38.
name
condition
Parmetros de Entrada
Nombre de la Restriccin.
Cualquier expresin condicional vlida que se evalu a un
resultado booleano.
Salidas ms usuales
ALTER TABLE
Mensaje devuelto si la orden se completa satisfactoriamente.
ERROR:
Mensaje devuelto si la creacin de la restriccin falla. Este mensaje viene
normalmente acompaado por algn texto explicativo, como:
ERROR: user username is not allowed to create/drop constraints.
Ha de tener el privilegio especial CREATE en la Base de Datos.
ERROR: the constraint check is violated for some row.
Si algunas filas que existen violan la regla que se impone.
Para nuestro caso prctico:
Los valores dentro de CHECK, por ejemplo CHECK (Genero in (0,1)), son los
nicos que sern permitidos insertar en el campo establecido, en este caso se le
asigna esa restriccin al campo Genero.
1. ALTER TABLE Persona.Contacto
2. ADD CONSTRAINT ck_Genero
3. CHECK (Genero in ('0','1'));
4. ALTER TABLE Persona.Postulante
5. ADD CONSTRAINT ck_asistioexamen
6. CHECK (asistioexamen in ('0','1'));
7. ALTER TABLE Persona.Postulante
8. ADD CONSTRAINT ck_ingreso
9. CHECK (ingreso in ('0','1'));
85
10.
11.
12.
13.
14.
15.
16.
name
( column [, ...] )
Parmetros de Entrada
Nombre de la Restriccin.
Columnas a las que se aplica la restriccin.
Salidas ms usuales
ALTER TABLE
Mensaje devuelto si la orden se completa satisfactoriamente.
ERROR:
Mensaje devuelto si la creacin de la restriccin falla. Este mensaje viene
normalmente acompaado por algn texto explicativo, como:
ERROR: user username is not allowed to create/drop constraints.
Ha de tener el privilegio especial CREATE en la Base de Datos.
ERROR: the relationship already exists.
Si ya existe la restriccin.
Las restricciones UNIQUE, por ejemplo UNIQUE(Modalidad) , aseguran que en
los datos en la misma columna, en este caso en el campo Modalidad, no sean
repetidas, ya que no puede haber registradas 2 modalidades con el mismo
nombre. Otro ejemplo se da en las tablas usuario, donde no permiten asignar el
mismo login o nick a ms de una persona.
86
name
( column [, ...] )
Parmetros de Entrada
Nombre de la Restriccin.
Columnas a las que se aplica la restriccin.
Salidas ms usuales
ALTER TABLE
Mensaje devuelto si la orden se completa satisfactoriamente.
ERROR:
Mensaje devuelto si la creacin de la restriccin falla. Este mensaje viene
normalmente acompaado por algn texto explicativo, como:
ERROR: user username is not allowed to create/drop constraints.
Ha de tener el privilegio especial CREATE en la Base de Datos.
ERROR: the relationship already exists.
Si ya existe la restriccin.
Para nuestro caso:
1. ALTER TABLE Admision.PerAcad
2. ADD CONSTRAINT pk_IDPerAcad
3. PRIMARY KEY(IDPerAcad);
87
fkey_name
column_name
reftable
refcolumn
MATCH FULL
MATCH
PARTIAL
MATCH SIMPLE
action
Parmetros de Entrada
Nombre de la Restriccin.
Nombre de la columna afectada por la restriccin.
Tabla de referencia desde la cual se aplica se aplica la
restriccin.
Si se omite, se usa la primary key de reftable
No permite columnas null .
No implementada.
Permite columnas null. Opcin predeterminada.
NO ACTION RESTRICT: Produce un error que indica que
DELETE o UPDATE creara una violacin de restriccin.
CASCADE: Actualiza el valor de la columna referenciada.
SET NULL: Ajusta la columna(s) de referenciad a null.
SET DEFAULT: Ajuste la columna(s) de referencia a sus
valores predeterminados.
88
Salidas ms usuales
ALTER TABLE
Mensaje devuelto si la orden se completa satisfactoriamente.
ERROR:
Mensaje devuelto si la creacin de la restriccin falla. Este mensaje viene
normalmente acompaado por algn texto explicativo, como:
ERROR: user username is not allowed to create/drop constraints.
Ha de tener el privilegio especial CREATE en la Base de Datos.
ERROR: the relationship already exists.
Si ya existe la restriccin.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
ELIMINACIN DE RESTRICCIONES
ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ]
DROP CONSTRAINT [ IF EXISTS ] constraint_name
[ RESTRICT | CASCADE ]
89
Nombre de la Tabla.
constraint_name
Nombre de la Restriccin.
IF EXIST
ONLY
*
RESTRICT
CASCADE
90
Nombre de la Tabla.
91
IF EXIST
RESTRICT
CASCADE
Salidas ms usuales
DROPTABLE
Mensaje devuelto si la orden se completa satisfactoriamente.
ERROR:
Mensaje devuelto si la creacin de la restriccin falla. Este mensaje viene
normalmente acompaado por algn texto explicativo, como:
ERROR: user username is not allowed to create/drop constraints.
Ha de tener el privilegio especial CREATE en la Base de Datos.
1.
2.
3.
4.
5.
DROP
DROP
DROP
DROP
DROP
TABLE
table
table
Table
TABLE
Admision.Carrera;
Persona.Contacto;
Persona.Postulante;
Admision.PerAcad;
Admision.Modalidad;
92
IF EXIST
RESTRICT
CASCADE
IF EXIST
RESTRICT
CASCADE
93
IF EXIST
ELIMINACION DE OBJETOS:
--1) Eliminar la base de datos con todos sus objetos:
1. DROP DATABASE DBAdmision; --en modo desconectados
--2) Eliminar una secuencia que est siendo utilizada por una tabla:
1. DROP SEQUENCE Persona.seq_idcontacto CASCADE;
2. DROP SEQUENCE Admision.seq_idmodalidad CASCADE;
--3) Eliminar una tabla con todos los constraints que posea:
1.
2.
3.
4.
5.
DROP
DROP
DROP
DROP
DROP
TABLE
Table
TABLE
table
table
Admision.Carrera CASCADE;
Admision.PerAcad CASCADE;
Admision.Modalidad CASCADE;
Persona.Contacto CASCADE;
Persona.Postulante CASCADE;
94
TRUNCATE
TRUNCATE [ TABLA ] name
TRUNCATE remueve rpidamente todas las filas de una tabla. Tiene el mismo
efecto que el DELETE pero al no recorrer la tabla resulta ms rpido. Es ms
efectivo en tablas grandes.
name
Parmetros de Entrada
Nombre de la tabla a truncar.
Salidas ms usuales
TRUNCATE
Mensaje devuelto si la orden se completa satisfactoriamente.
ERROR:
Mensaje devuelto si la orden TRUNCATE falla. Este mensaje viene
normalmente acompaado por algn texto explicativo, como:
ERROR: user username is not allowed to truncate constraints.
Ha de tener el privilegio especial CREATE en la Base de Datos..
Uso:
Truncar la tabla tablagrande:
1. TRUNCATE TABLE tablagrande;
95
Sentencias DML
El lenguaje de Manipulacin de Datos (Data Manipulation Language DML) sirve
para llevar a cabo las transacciones en las base de datos, entindase por
transacciones los procesos de insercin, actualizacin, eliminacin, seleccin.
Es utilizado para escribir programas que crean, actualizan y extraen informacin
de las bases de datos. Siempre de acuerdo con las especificaciones y las
normas de seguridad dictadas por al administrador.
Un lenguaje de manipulacin de datos es un lenguaje que permite a los
usuarios acceder o manipular los datos organizados mediante el modelo de datos
apropiado.
Hay dos tipos bsicamente:
DMLs procedimentales. Requieren que el usuario especifique qu datos se
necesitan y cmo obtener esos datos.
DMLs declarativos (o no procedimentales). Requiere que el
usuario especifique qu datos se necesitan sin especificar cmo obtener
esos datos.
Una consulta es una instruccin de solicitud para recuperar informacin. La parte
de un DML se llama lenguaje de consultas.
Ejemplo:
1. Select nombre, direccion
2. from cliente
3. where id_cliente = 2;
y/o
96
expression
name
TEMPORARY
TEMP
new_table
table
condition
column
select
Parmetros de Entrada
El nombre de una columna de la tabla o una expresin..
Especifica otro nombre para una columna o una expresin que
utilice la clusula AS. Este nombre se utiliza principalmente
como etiqueta para la columna de salida.
El nombre no puede ser utilizado en las clusulas WHERE,
GROUP BY o HAVING. Sin embargo, puede ser referenciado
en clusulas ORDER BY
La tabla se crea solamente para esta sesin, y es
automticamente descartada al finalizar la misma.
Si se utiliza la clusula INTO TABLE, el resultado de la
consulta se almacenar en otra tabla con el nombre indicado.
La tabla objetivo (new_table) ser creada automticamente y
no deber existir previamente a la utilizacin de este comando.
Consulte el comando SELECT INTO para ms informacin.
Nota: La declaracin CREATE TABLE AS tambin crear una
nueva tabla a partir de la consulta.
Un nombre alternativo para la tabla precedente table. Se utiliza
para abreviar o eliminar ambigedades en uniones dentro de
una misma tabla.
Una expresin booleana que da como resultado verdadero o
falso (true or false). Consulte la clusula WHERE.
El nombre de una columna de la tabla.
Una declaracin de seleccin (select) exceptuando la clusula
ORDER BY.
97
Salidas ms usuales
Registros
El conjunto completo de registros (filas) que resultan de la especificacin
de la consulta..
count:
La cantidad de registros (filas) devueltos por la consulta.
SELECT devuelve registros de una o ms tablas. Los candidatos a ser
seleccionados son aquellos registros que cumplen la condicin especificada con
WHERE; si se omite WHERE, se retornan todos los registros. (Consulte Clusula
WHERE.)
DISTINCT elimina registros duplicados del resultado. ALL (predeterminado)
devolver todos los registros, que cumplan con la consulta, incluyendo los
duplicados.
DISTINCT ON elimina los registros que cumplen con todas las expresiones
especificadas, manteniendo solamente el primer registro de cada conjunto de
duplicados. Note que no se puede predecir cul ser "el primer registro" a menos
que se utilice ORDER BY para asegurar que el registro eseado es el que
efectivamente aparece primero. Por ejemplo:
1. SELECT DISTINCT ON (location) location, time, report
2. FROM weatherReports
3. ORDER BY location, time DESC;
los registros del dcimo al vigsimo, pero del dcimo al vigsimo en qu orden?
Usted no conoce el orden a menos que utilice ORDER BY.
Ya en Postgres 7.0, el optimizador de consultas toma en cuenta a LIMIT cuando
genera un plan de consulta, as que es muy factible que usted obtenga diferentes
planes (abarcando diferentes criterios de ordenamiento de registros) dependiendo
de los valores dados a LIMIT y OFFSET. Por lo tanto, utilizar diferentes valores
para LIMIT/OFFSET para seleccionar diferentes subconjuntos del resultado de
una consulta, provocar resultados inconsistentes a menos que usted se asegura
un resultado predecible ordenando con ORDER BY. Esto no es un bug; es una
consecuencia inherente al hecho de que SQL no establece ningn compromiso de
entregar los resultados de una consulta en un orden en particular a menos que se
utilice ORDER BY para especificar un criterio de orden explcitamente.
Uso
Para unir la tabla films con la tabla distributors:
1. SELECT f.title, f.did, d.name, f.date_prod, f.kind
2. FROM distributors d, films f
3. WHERE f.did = d.did
Para sumar la columna len (duracin) de todos los filmes y agrupar los resultados
segn la columna kind (tipo):
1. SELECT kind, SUM(len) AS total FROM films GROUP BY kind;
Para sumar la columna len de todos los filmes, agrupar los resultados segn la
columna kind y mostrar los totales de esos grupos que sean menores a 5 horas:
1.
2.
3.
4.
Este ejemplo muestra cmo obtener la unin de las tablas distributors y actors,
restringiendo los resultados a aquellos que comienzan con la letra W en cada
tabla. No se quieren duplicados, as que la palabra clave ALL se omite.
1. - distributors: actors:
2. - did|
name id
|name
3. - ---+--------------+--------------102
4.
5.
6.
7.
108|Westward 1
|Woody Allen
111|Walt Disney 2 |Warren Beatty
112|Warner Bros. 3|Walter Matthau
... ...
column_name
104
column_name
expression
from_lista
105
Salidas ms usuales
UPDATE #
Mensaje obtenido si ha habido xito. El smbolo # representa el nmero de
filas que han sido actualizadas. Si # es igual a 0, ninguna fila fue actualizada.
Si el comando UPDATE tiene RETURNING el resultado ser similar a la sentencia
SELECT que contenga las columnas y valores definidos en la lista RETURNING,
calculadas sobre la fila (s) que se inserta por el comando.
Uso:
Para cambiar la palabra "Drama" por "Dramatica" en la columna categora:
1.
2.
3.
4.
5.
106
alias
Uso:
Borra todos los films excepto los musicales:
1. DELETE FROM films WHERE kind <> 'Musical';
2. SELECT * FROM films;
108
Sentencias TCL
El Lenguaje de Control Transacciones (Transaction Control Language - TCL) se
utiliza para administrar los procesos transaccionales en una base de datos en
relacin a los requerimientos de atomicidad, consistencia, aislamiento y
durabilidad.
Las clusulas TCL que se utilizan en PostgreSQL para este fin son: COMMIT,
SAVEPOINT, RELEASE SAVEPOINT, ROLLBACK.
COMMIT
COMMIT [ WORK | TRANSACTION ]
COMMIT realiza la transaccin actual. Todos los cambios realizados por la
transaccin son visibles a las otras transacciones, y se garantiza que se
conservan si se produce una cada de la mquina.
Notas:
Las palabras clave WORK y TRANSACTION son informativas, y pueden ser
omitidas.
Use ROLLBACK para abortar una transaccin.
Uso:
COMMIT;
SAVEPOINT
SAVEPOINT savepoint
SAVEPOINT establece un nuevo punto de salvaguarda dentro de la transaccin
actual.
Un punto de salvaguarda es una marca especial dentro de una transaccin que
permite a todos los comandos que se ejecutan despus revertirse, restaurando el
estado de la transaccin a lo que era en el momento que se estableci el punto de
salvaguarda.
Notas
Utilice ROLLBACK TO SAVEPOINT para revertir a un punto de salvaguarda.
Utilice RELEASE SAVEPOINT para destruir un punto de salvaguarda.
109
RELEASE SAVEPOINT
RELEASE [ SAVEPOINT ] savepoint
RELEASE SAVEPOINT destruye todos los puntos de salvaguarda (savepoints)
que se establecieron en el intervalo de creacin y liberacin, manteniendo el
efecto de los comandos ejecutados en este intervalo.
genera un error.
No es posible liberar un punto de retorno cuando la transaccin se ha revertido.
Si varios puntos de salvaguarda tienen el mismo nombre, slo el que se ha definido
ms recientemente se libera.
Ejemplo:
Establecer y posteriormente destruir un punto de salvaguarda. La transaccin
siguiente inserta los valores 4 y 5:
110
BEGIN;
INSERT INTO table1 VALUES (4);
SAVEPOINT mi_savepoint;
INSERT INTO table1 VALUES (5);
RELEASE SAVEPOINT mi_savepoint;
COMMIT;
ROLLBACK
ROLLBACK [ WORK | TRANSACTION ] [ TO SAVEPOINT savepoint ]
ROLLBACK deshace la transaccin actual y provoca que todas las modificaciones
originadas por la misma sean descartadas.
ROLLBACK TO SAVEPOINT Deshace todas las transacciones que se han
ejecutado despus del establecimiento del punto de salvaguarda (savepoint). El
punto de retorno permanece y si se necesita, ms adelante se puede revertir de
nuevo.
ROLLBACK TO SAVEPOINT destruye implcitamente a todos los puntos de
salvaguarda que se establecieron despus de que el punto utilizado.
Notas:
Uso:
ROLLBACK; -- Cancelar todos los cambios.
ROLLBACK TO SAVEPOINT my_savepoint; -- Cancela los cambios
posteriores a my_savepoint
111
CASO PRCTICO:
Transaccin para transferir 50 desde una cuenta A a una cuenta B:
1- CREACIN DE TABLA Y CHECK:
1.
2.
3.
4.
5.
6.
2- SECUENCIA DE EJECUCIN:
1. leer(A)
2. A = A - 50
3. escribir(A)
4. leer(B)
5. B = B + 50
6. escribir(B)
3- CREACIN DE LA FUNCIN:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
4- COMPROBANDO:
1. SELECT * FROM transaccion1();
2. SELECT * FROM tblCuenta;
EL hecho de transferir dinero de una cuenta a otra requiere que toda la operacin
sea ejecutado como un todo, HACE TODO O NADA, de esa manera
112
113
Instalar Script
Instalar Script dbadmin_insert.sql desde pgAdminIII en
Windows
Si an no tienes preparada la base de datos, utilizar el script dbadmin_insert.sql
que es la unin de las sentencias DDL y DML creadas y poblada con datos. El
script crear el entorno en el que se realizarn las demostraciones.
Copiar el archivo dbadmin_insert.sql al directorio del usuario en Mis
documentos.
Ejecutar pgAdminIII.
Crear la Base de Datos desde el cono Database:
Ejecutar el Script
115
-f dbadmin.sql
116
Admisin
Marketing
Empleado
Inicio de
Sesin
Cecilia Caldern
Ccaldero
n
Patito
Jefe
Carmen Peralta
Cperalta
Perrito
Jefe
Yovana Vargas
Yvargas
Muchachita
Operador
Liz Castro
Lcastro
Michimichi
Operador
Katty Suarez
Ksuarez
Loquita
Jefe
Martha Carrion
Mcarrion
Love
Operador
Contrasea
Tipo de
Usuario
Se tiene desarrollada una aplicacin que acceda a la base de datos con el usuario
y contrasea concedidos a cada uno de los usuarios (Autenticacin SQL). Con
respecto a la aplicacin la oficina de Admisin est solicitando que se implemente:
118
Sentencias DCL
El Lenguaje de Control de Datos (Data Control Language DCL) es utilizado
para llevar a cabo la administracin de privilegios en los objetos de la base de
datos el cual ayuda a garantizar la accesibilidad y seguridad dentro de los objetos
de la base de datos.
Las clusulas DCL que se usan para el control de accesos en PostgreSQL son:
GRANT, REVOKE.
GRANT
GRANT privilegio [, ...] ON objeto [, ...]
TO { PUBLIC | GROUP grupo | usuario }
GRANT permite al creador de un objeto asignarle permisos especficos a todos los
usuarios (PUBLIC), a un cierto usuario o grupo. Usuarios distintos al creador
pueden no tener permisos de acceso a menos que el creador se los conceda, una
vez que el objeto ha sido creado.
Una vez que un usuario tiene privilegios sobre un objeto, tiene la posibilidad de
ejecutar ese privilegio. No hay necesidad de conceder privilegios al creador de un
objeto; el creador obtiene automticamente TODOS los privilegios, y puede
tambin eliminar el objeto.
Parmetros de Entrada
SELECT Acceder a todas las columnas de una tabla o vista.
INSERT
privilegio
usuario
ALL
Otorgar todos los privilegios.
El nombre de un objeto al que se quiere conceder el acceso. Los
posibles objetos son: tabla, vista, secuencia, ndice.
El nombre de un grupo al cual se otorga privilegios. El grupo debe
haber sido creado explcitamente.
El nombre de un usuario al que se quiere conceder privilegios.
PUBLIC
objeto
grupo
Salidas ms usuales
119
CHANGE
Mensaje devuelto si la orden se completa satisfactoriamente.
ERROR: ChangeAcl: class "object" not found
Mensaje que se devuelve si el objeto no est disponible o si es imposible
dar los privilegios al grupo o a los usuarios.
Uso:
Concede privilegios de insercin a todos los usuarios de la tabla testtable:
GRANT INSERT ON testtable TO PUBLIC;
Concede todos los privilegios al usuario testuser sobre la vista clases:
GRANT ALL ON clases TO testuser;
Consulte el comando psql \z para obtener ms informacin sobre permisos en
objetos existentes:
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
REVOKE
REVOKE privilegio [, ...]
ON objeto [, ...]
FROM { PUBLIC | GROUP grupo | usuario }
REVOKE permite al creador de un objeto revocar permisos asignados anteriormente a todos los usuarios (mediante PUBLIC), a un usuario o a un grupo.
Parmetros de Entrada
privilegio SELECT Acceder a todas las columnas de una tabla o vista.
120
INSERT
grupo
ALL
Rescindir todos los privilegios.
El nombre de un objeto sobre el que revocar el acceso. Los posibles
objetos son: tabla, vista, secuencia, ndice.
El nombre de un grupo al cual se revocan privilegios.
usuario
PUBLIC
objeto
Salidas ms usuales
CHANGE
Mensaje devuelto si la orden se completa satisfactoriamente.
ERROR:
Mensaje que se devuelve si el objeto no est disponible o si es imposible
revocarprivilegios al grupo o a los usuarios.
Uso:
Revoca el privilegio de insercin a todos los usuarios de la tabla testtable:
REVOKE INSERT ON testtable TO PUBLIC;
Revoca todos los privilegios al usuario testuser sobre la vista clases:
REVOKE ALL ON clases TO testuser;
Usamos la base de datos dbadmision y nos enfocamos en un caso real de
implementacin para asignar los privilegios en los objetos para garantizar la
accesibilidad y seguridad del sistema para una Universidad usando las sentencias
GRANT y REVOKE de acuerdo a los requerimientos establecidos en la seccin
anterior.
SUGERENCIA:
Si has utilizado la base de datos dbadmision en ejercicios previos es mejor volver
a crearla.
Utilizar el Script: dbadmin.sql
121
DESARROLLO
PARTE 1: CREACIN DE ROLES Y USUARIOS DE LOGIN
CREANDO ROLES
1.
2.
3.
4.
CREATE
CREATE
CREATE
CREATE
ROLE
ROLE
ROLE
ROLE
JefeADM;
OpeADM;
JefeMKT;
OpeMKT;
CREANDO LOGINS
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
122
123
COMPROBANDO DERECHOS
(DE LOS OPERADORES DE ADM)
1. SET SESSION AUTHORIZATION OpeADM;
124
6.
7.
8.
9.
10.
,'Anonymous'
,0
,00000000
,'10/11/2000'
,now());
11.
12.
13.
14.
15.
SELECT
SELECT
SELECT
SELECT
*
*
*
*
FROM
FROM
FROM
FROM
REQ_ADM.pa_r1()
REQ_ADM.pa_r2()
REQ_ADM.pa_r3()
REQ_ADM.pa_r4()
AS
AS
AS
AS
(column1
(column1
(column1
(column1
unknown);
unknown);
unknown);
unknown);
125
SELECT
SELECT
SELECT
SELECT
*
*
*
*
FROM
FROM
FROM
FROM
REQ_ADM.pa_r1()
REQ_ADM.pa_r2()
REQ_ADM.pa_r3()
REQ_ADM.pa_r4()
AS
AS
AS
AS
(column1
(column1
(column1
(column1
unknown);
unknown);
unknown);
unknown);
SELECT
SELECT
SELECT
SELECT
*
*
*
*
FROM
FROM
FROM
FROM
REQ_MKT.pa_r1()
REQ_MKT.pa_r2()
REQ_MKT.pa_r3()
REQ_MKT.pa_r4()
AS
AS
AS
AS
(column1
(column1
(column1
(column1
unknown);
unknown);
unknown);
unknown);
SELECT
SELECT
SELECT
SELECT
*
*
*
*
FROM
FROM
FROM
FROM
REQ_MKT.pa_r1()
REQ_MKT.pa_r2()
REQ_MKT.pa_r3()
REQ_MKT.pa_r4()
AS
AS
AS
AS
(column1
(column1
(column1
(column1
unknown);
unknown);
unknown);
unknown);
cambiarlo por:
6. SET SESSION AUTHORIZATION Yvargas;
126
127
Sentencias XML
La tecnologa XML nos ha facilitado constantemente en lograr compatibilidad entre
diversos formatos y permitir compartirlos entre distintas aplicaciones y sin duda en
bases de datos su funcionalidad tambin es muy til.
Veremos el uso del tipo de dato XML, el uso de las funciones XML y la exportacin
de consultas hacia XML con PostgreSQL.
El esquema que habr que respetar en el entorno de bases de datos, y en el caso
especfico de postgres es el siguiente:
1. <catalogname>
2.
<schemaname>
3.
<tablename>
4.
<row>
5.
<colname1>value</colname1>
6.
<colname2 xsi:nil=true/>
7.
...
8.
</row>
9.
...
10.
</tablename>
11.
...
12. </schemaname>
13. ...
14. </catalogname>
XMLCOMMENT
XMLCONCAT
XMLELEMENT
XMLFOREST
XMLAGG
QUERY_TO_XML
TABLE_TO_XML
129
4- Creamos una tabla que contenga un campo de tipo XML, veremos luego
una manera especial de manipularlas.
1.
2.
3.
4.
5.
6.
Recursos Utilizados:
SQLXML-For-Postgres-Developers
XML Document Support
XML and Databases
XML Type
130
PL/pgSQL
Introduccin
Ya hemos visto que SQL (DML) es un lenguaje simple y poderoso para manipular
datos en una base de datos. PL/pgSQL es un lenguaje procedimental que permite
crear funciones, procedimientos y triggers con el fin de realizar operaciones y
computaciones ms complejas dentro de la base de datos. Realizar dichas
operaciones dentro de la base de datos, y no en las aplicaciones, puede mejorar el
rendimiento del sistema puesto que se disminuye la comunicacin entre la
aplicacin y el SGBD.
Antes de iniciar
Para los ejemplos descritos en este taller se requieren las siguientes tablas y
datos:
CREATE TABLE CLIENTES (ID SERIAL PRIMARY KEY,
CC VARCHAR(10) NOT NULL,
NOMBRE VARCHAR(50) NOT NULL);
CREATE TABLE CUENTAS (ID SERIAL PRIMARY KEY,
SALDO REAL DEFAULT 0,
CLI_ID INT NOT NULL REFERENCES CLIENTES(ID),
FECHA_SOBREGIRO DATE,
INTERESES REAL DEFAULT 0);
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INTO
INTO
INTO
INTO
INTO
INTO
Estructura
La estructura general de un bloque PL/PgSQL es la siguiente:
[ <<label>> ]
[ DECLARE
declarations ]
BEGIN
statements
END [ label ];
131
DECLARE:
Las variables, en caso de ser necesarias, deben ser declaradas en la clusula
DECLARE:
/* Concatenando el nombre y el apellido y adicionando mayusculas */
CREATE OR REPLACE FUNCTION CONCAT_NOMBRE(NOMBRE VARCHAR, APELLIDO VARCHAR)
RETURNS VARCHAR AS $$
DECLARE
TEMP VARCHAR;
BEGIN
TEMP:= NOMBRE || ' ' || APELLIDO;
RETURN INITCAP(TEMP);
END;
$$
LANGUAGE plpgsql;
Un ejemplo de uso:
select concat_nombre('carlos','olarte');
concat_nombre
--------------Carlos Olarte
132
RETURNS VOID AS $$
INSERT INTO CLIENTES (CC,NOMBRE) VALUES ($1,$2);
$$
LANGUAGE SQL;
Un ejemplo de uso:
SELECT INS_CLIENTES('44444','CLIENTE 4');
Ejemplo de uso:
postgres=# select transfer(3,2,1000);
transfer
----------1000
(1 row)
133
Es posible realizar algunas validaciones. Por ejemplo, se debe verificar que las
dos cuentas existan y que el monto de la segunda sea suficiente para realizar la
transferencia.
/* Funcin que transfiere dinero de una cuenta a otra */
/* Versin2: Validacion de los datos de entrada */
CREATE FUNCTION TRANSFER2
(CTA1 CUENTAS.ID%TYPE, CTA2 CUENTAS.ID%TYPE, MONTO CUENTAS.SALDO%TYPE)
RETURNS CUENTAS.SALDO%TYPE AS $$
DECLARE
NUEVO_SALDO CUENTAS.SALDO%TYPE;
SALDO_DISPONIBLE CUENTAS.SALDO%TYPE;
TEST_EXISTS INT;
BEGIN
SELECT COUNT(*) INTO TEST_EXISTS FROM CUENTAS WHERE ID=CTA1;
IF TEST_EXISTS <> 1 THEN
RAISE EXCEPTION 'La cuenta de origen % no existe', CTA1;
ELSE
SELECT COUNT(*) INTO TEST_EXISTS FROM CUENTAS WHERE ID=CTA2;
IF TEST_EXISTS <> 1 THEN
RAISE EXCEPTION 'La cuenta destino % no existe', CTA2;
ELSE
SELECT SALDO INTO SALDO_DISPONIBLE FROM CUENTAS WHERE ID = CTA1;
IF SALDO_DISPONIBLE < MONTO THEN
RAISE EXCEPTION 'No hay fondos suficientes para la transferencia';
ELSE
/* realizando la transferencia */
UPDATE CUENTAS SET SALDO = SALDO - MONTO WHERE ID=CTA1;
UPDATE CUENTAS SET SALDO = SALDO + MONTO WHERE ID=CTA2;
/* Consultando y retornando el nuevo saldo de CTA2 */
SELECT SALDO INTO NUEVO_SALDO FROM CUENTAS WHERE ID=CTA2;
RETURN NUEVO_SALDO;
END IF;
END IF;
END IF;
END
$$
LANGUAGE PLPGSQL;
La siguiente funcin actualiza los intereses de mora en las cuentas que estn
sobregiradas. Los intereses que se cobran son proporcionales al saldo de la
cuenta y se utiliza el porcentaje que se pasa como parmetro.
/*
Actualizando los intereses de las cuentas de acuerdo con el numero de dias en mora
*/
134
Ejemplo de uso:
bdi00=> SELECT COBRAR_INTERESES(0.01);
Ejemplo de uso:
bdi00=> Select INF_CUENTA(1);
inf_cuenta
---------------------------------------------------La cuenta pertenece a CLIENTE 1. El saldo es 5000
(1 row)
135
En este caso, note que la clusula SELECT INTO puede asignar varias
variables al tiempo.
Cursores
Un cursor es una estructura que permite recuperar los datos de una consulta fila
por fila.
Asuma una tabla con una serie de transacciones bancarias pendientes, i.e.,
transacciones que deben ser realizadas y afectar las cuentas de los clientes:
CREATE TABLE PENDIENTES (
ID SERIAL PRIMARY KEY,
MONTO REAL NOT NULL,
CTA_ID INT NOT NULL REFERENCES CUENTAS(ID),
FECHA DATE DEFAULT NOW(),
OPERACION CHAR(1),
REALIZADA BOOL DEFAULT FALSE);
INSERT INTO PENDIENTES (MONTO,CTA_ID,OPERACION)
(300,1,'D'), (400,2,'R'), (233,3,'D');
VALUES
136
OPEN CUR_PEN;
LOOP
-- Extraer una fila del cursor
FETCH CUR_PEN INTO ACCION;
IF ACCION IS NULL THEN EXIT;
END IF;
IF ACCION.OPERACION = 'D' THEN
UPDATE CUENTAS SET SALDO = SALDO + ACCION.MONTO WHERE ID = ACCION.CTA_ID;
ELSE
UPDATE CUENTAS SET SALDO = SALDO - ACCION.MONTO WHERE ID = ACCION.CTA_ID;
END IF;
-- Actualizar una fila de acuerdo con la posicin del cursor
UPDATE PENDIENTES SET REALIZADA=TRUE WHERE CURRENT OF CUR_PEN;
END LOOP;
-- Cierre del cursor.
CLOSE CUR_PEN;
END;
$$ LANGUAGE plpgsql;
La clusula FOR UPDATE evita que otras transacciones estn modificando las
filas seleccionadas.
Ejemplo de uso:
bdi00=> select * from CUENTAS;
id | saldo | cli_id | fecha_sobregiro | intereses
----+-------+--------+-----------------+----------1 | 5000 |
1 |
|
0
2 | -2000 |
2 |
|
0
3 | 3000 |
3 |
|
0
(3 rows)
bdi00=> select * from PENDIENTES;
id | monto | cta_id |
fecha
| operacion | realizada
----+-------+--------+------------+-----------+----------1 |
300 |
1 | 2010-04-26 | D
| f
2 |
400 |
2 | 2010-04-26 | R
| f
3 |
233 |
3 | 2010-04-26 | D
| f
(3 rows)
bdi00=> SELECT UPD_PENDIENTES();
upd_pendientes
---------------(1 row)
bdi00=> select * from CUENTAS;
id | saldo | cli_id | fecha_sobregiro | intereses
----+-------+--------+-----------------+----------1 | 5300 |
1 |
|
0
2 | -2400 |
2 |
|
0
3 | 3233 |
3 |
|
0
bdi00=> select * from PENDIENTES;
id | monto | cta_id |
fecha
| operacion | realizada
----+-------+--------+------------+-----------+----------1 |
300 |
1 | 2010-04-26 | D
| t
2 |
400 |
2 | 2010-04-26 | R
| t
3 |
233 |
3 | 2010-04-26 | D
| t
137
(3 rows)
Para este caso particular, un lector atento hubiera podido descubrir que el
ejercicio se poda realizar con una sola sentencia del DML:
UPDATE CUENTAS SET INACTIVA = FALSE WHERE CLI_ID IN (SELECT CLI_ID FROM
USUARIOS_FRAUDE);
Triggers
Un trigger es una accin que se lanza cuando se inserta, elimina o actualiza
una o varios registros de una tabla. En PL/pgSQL, los triggers son funciones sin
argumentos en las cuales se crean las siguientes variables:
NEW: Es un Record con los datos del registro que se est insertando
(actualizando).
OLD: Datos del registro que se est eliminando (o actualizando).
TG_OP: Operacin que se est realizando, puede ser INSERT, UPDATE,
DELETE, o TRUNCATE.
138
Un ejemplo de Auditoria
Suponga que cada que se modifica una cuenta, se debe registrar la accin en la
siguiente tabla:
CREATE TABLE AUDITORIA(
OPERACION CHAR(1),
FECHAUPD TIMESTAMP,
USUARIO TEXT,
ID INT,
SALDO REAL,
CLI_ID INT,
FECHA_SOBREGIRO DATE,
INTERESES REAL,
INACTIVA BOOL);
Ahora se crea el trigger sobre la tabla CUENTAS que se activa cada que se
inserta, actualiza o elimina una (o varias) fila(s) en CUENTAS:
CREATE TRIGGER cue_audit
AFTER INSERT OR UPDATE OR DELETE ON CUENTAS
FOR EACH ROW EXECUTE PROCEDURE process_cue_audit();
Algunos ejemplos:
bdi00=> insert into cuentas (saldo,cli_id) values (3500,2);
INSERT 0 1
bdi00=> select * from auditoria;
operacion |
fechaupd
| usuario | id | saldo | cli_id | fecha_sobregiro | intereses
-----------+----------------------------+---------+----+-------+--------+-----------------+---------I
| 2010-04-26 10:30:18.081372 | bdi00
| 6 | 3500 |
2 |
|
0
(1 row)
bdi00=> update cuentas set fecha_sobregiro = now() where id =1;
UPDATE 1
bdi00=> select * from auditoria;
operacion |
fechaupd
| usuario | id | saldo | cli_id | fecha_sobregiro | intereses
-----------+----------------------------+---------+----+-------+--------+-----------------+---------I
| 2010-04-26 10:30:18.081372 | bdi00
| 6 | 3500 |
2 |
|
0
139
U
(2 rows)
| 2010-04-26 10:31:23.2547
| bdi00
1 |
4067 |
1 | 2010-04-26
Validacin
Los triggers son muy tiles cuando se requieren hacer validaciones que que no
se pueden realizar con las restricciones de integridad referencial (PK, FK,
UK,CK). Por ejemplo, asume que un cliente por poltica del banco, no puede
tener ms de 3 cuentas activas. Cada que se inserta una nueva cuenta, o se
actualiza el titular de la cuenta, se debe verificar que no se incumple esta
propiedad. Primero implementamos la funcin:
/* Funcion que verifica que el numero de cuentas de un cliente no
sea mayor a 3 */
CREATE OR REPLACE FUNCTION FUN_CK_NUM_CLIENTES() RETURNS TRIGGER AS $$
DECLARE
NUM_CUENTAS INT;
BEGIN
IF (TG_OP = 'UPDATE' AND OLD.CLI_ID <> NEW.CLI_ID ) OR TG_OP='INSERT' THEN
SELECT COUNT(*) INTO NUM_CUENTAS FROM CUENTAS
WHERE CLI_ID = NEW.CLI_ID;
IF NUM_CUENTAS >= 3 THEN
RAISE EXCEPTION 'LIMITE DEL NUMERO DE CUENTAS ALCANZADO POR EL CLIENTE';
ELSE
RETURN NEW;
END IF;
ELSE
RETURN NEW;
END IF;
END;
$$ LANGUAGE plpgsql;
/* Creacion del Trigger */
CREATE TRIGGER TRG_NUM_CLIENTES
AFTER INSERT OR UPDATE ON CUENTAS
FOR EACH ROW EXECUTE PROCEDURE FUN_CK_NUM_CLIENTES();
Valores Calculados
Los triggers tambin pueden ser utilizados para mantener valores calculados.
Por ejemplo, asumamos que en la tabla CLIENTES se desea mantener el
acumulado en dinero que tiene el cliente en sus distintas cuentas. Para esto,
modificamos la tabla:
ALTER TABLE CLIENTES ADD COLUMN SALDO REAL DEFAULT 0.0;
DECLARE
CLIENTE_SALDO REAL;
CLIENTE_ID REAL;
BEGIN
FOR CLIENTE_ID, CLIENTE_SALDO IN SELECT CLI_ID, SUM(SALDO) FROM CUENTAS GROUP BY
CLI_ID LOOP
UPDATE CLIENTES SET SALDO=CLIENTE_SALDO WHERE ID = CLIENTE_ID;
END LOOP;
RETURN;
END;$$
LANGUAGE plpgsql;
Ahora, por cada modificacin del saldo en una cuenta, actualizamos el saldo en
el cliente:
CREATE OR REPLACE FUNCTION SET_SALDO_CLIENTE() RETURNS TRIGGER AS $$
BEGIN
IF(TG_OP = 'INSERT') THEN
UPDATE CLIENTES SET SALDO = SALDO + NEW.SALDO WHERE ID = NEW.CLI_ID;
RETURN NEW;
ELSIF (TG_OP = 'UPDATE') THEN
IF NEW.CLI_ID = OLD.CLI_ID THEN
UPDATE CLIENTES SET SALDO = SALDO + NEW.SALDO - OLD.SALDO WHERE ID =
NEW.CLI_ID;
RETURN NEW;
ELSE /* LA CUENTA CAMBIO DE TITULAR */
UPDATE CLIENTES SET SALDO = SALDO - OLD.SALDO WHERE ID = OLD.CLI_ID;
UPDATE CLIENTES SET SALDO = SALDO + NEW.SALDO WHERE ID = NEW.CLI_ID;
RETURN NEW;
END IF;
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
/* Creacion del Trigger */
CREATE TRIGGER TRG_SALDO_CLIENTES
AFTER INSERT OR UPDATE ON CUENTAS
FOR EACH ROW EXECUTE PROCEDURE SET_SALDO_CLIENTE();
Manejo de Errores
Es posible lanzar y capturar errores de la siguiente manera:
CREATE OR REPLACE FUNCTION TEST(int, int) RETURNS INT AS $$
DECLARE
X INT;
BEGIN
X := $1/$2;
RETURN X;
EXCEPTION
WHEN division_by_zero THEN
141
Ejemplo de uso:
bdi00=> select test(6,2);
test
-----3
(1 row)
bdi00=> select test(6,0);
NOTICE: Division por cero
test
-----0
(1 row)
Cuando un usuario quiere ser amigo de otro, debe enviar una invitacin. Los
estados de la invitacin pueden ser pendiente, aceptado, rechazado.
1. Cree el script de tablas
2. Implemente un procedimiento que cada que se acepte una invitacin, se
adicione la relacin de amistad en la tabla amigos.
3. Por cada nuevo amigo se debe actualizar el nmero de amigos en el
campo USUARIOS.NUM_AMIGOS
4. La relacin de amigos se asume que es simtrica, es decir, si A es amigo
de B entonces B es amigo de A. Realice un trigger que evite la insercin
de (A,B) en la tabla AMIGOS si la tuple (B,A) ya se encuentra. Adems, se
deben rechazar invitaciones de A,B si A,B ya son amigos (o B,A ya son
amigos)
5. Adicione un trigger que rechace nuevas invitaciones de A a B si B ha
rechazado previamente la invitacin.
142
CREACION DE TABLAS
CREATE TABLE USUARIOS (
ID SERIAL NOT NULL,
NOMBRE VARCHAR(20),
EMAIL VARCHAR(20),
NUM_AMIGOS INT DEFAULT 0);
CREATE TABLE AMIGOS(
USR1_ID INT NOT NULL,
USR2_ID INT NOT NULL);
CREATE TABLE INVITACIONES (
ID SERIAL NOT NULL,
FECHA TIMESTAMP DEFAULT NOW(),
USR1_ID INT NOT NULL,
USR2_ID INT NOT NULL,
ESTADO CHAR(1) DEFAULT 'P');
RESTRICCIONES
ALTER TABLE USUARIOS ADD CONSTRAINT USR_PK PRIMARY KEY(ID);
ALTER TABLE AMIGOS ADD CONSTRAINT AMI_PK PRIMARY KEY(USR1_ID,USR2_ID);
ALTER TABLE INVITACIONES ADD CONSTRAINT INV_PK PRIMARY KEY(ID);
ALTER TABLE AMIGOS ADD CONSTRAINT AMI_USR_1_FK FOREIGN KEY (USR1_ID) REFERENCES USUARIOS (ID);
ALTER TABLE AMIGOS ADD CONSTRAINT AMI_USR_2_FK FOREIGN KEY (USR2_ID) REFERENCES USUARIOS (ID);
ALTER TABLE INVITACIONES ADD CONSTRAINT INV_USR_1_FK FOREIGN KEY (USR1_ID) REFERENCES USUARIOS
(ID);
FUNCION ADD_FRIENDSHIP
Adiciona la relacin de amistad si se acepta la invitacin. Se asume que los dos
usuarios no son amigos
CREATE OR REPLACE FUNCTION ADD_FRIENDSHIP() RETURNS TRIGGER AS $$
BEGIN
IF NEW.ESTADO = 'A' THEN
INSERT INTO AMIGOS (USR1_ID,USR2_ID) VALUES (NEW.USR1_ID,NEW.USR2_ID);
END IF;
RETURN NEW;
END;
$$ LANGUAGE PLPGSQL;
CREATE TRIGGER TRG_ADD_FRIENDSHIP AFTER UPDATE ON INVITACIONES
FOR EACH ROW EXECUTE PROCEDURE ADD_FRIENDSHIP();
FUNCION UPDATE_NUM_AMIGOS
143
FUNCION CHECK_SIMETRIA
Verifica que no se inserte la relacin de amigos B,A si A,B ya son amigos
CREATE OR REPLACE FUNCTION CHECK_SIMETRIA() RETURNS TRIGGER AS $$
DECLARE
NUM INT;
BEGIN
IF TG_OP = 'INSERT' THEN
SELECT COUNT(*) INTO NUM FROM AMIGOS WHERE USR2_ID = NEW.USR1_ID AND USR1_ID = NEW.USR2_ID;
IF NUM >0 THEN
RAISE EXCEPTION 'YA EXISTE LA RELACION DE AMIGOS ENTRE % Y %',NEW.USR2_ID,NEW.USR1_ID;
END IF;
ELSIF TG_OP = 'UPDATE' THEN
SELECT COUNT(*) INTO NUM FROM AMIGOS WHERE USR2_ID = NEW.USR1_ID AND USR1_ID = NEW.USR2_ID;
IF NUM >0 THEN
RAISE EXCEPTION 'YA EXISTE LA RELACION DE AMIGOS ENTRE % Y %',NEW.USR2_ID,NEW.USR1_ID;
END IF;
END IF;
RETURN NEW;
END;
$$ LANGUAGE PLPGSQL;
FUNCIONE CHECK_INVITACION
Verifica que no se inserte una nueva invitacin que haya sido previamente
rechazada o que las personas ya son amigas
CREATE OR REPLACE FUNCTION CHECK_INVITACION() RETURNS TRIGGER AS $$
DECLARE
NUM INT;
BEGIN
IF TG_OP = 'INSERT' THEN
144
ALGUNAS PRUEBAS
INSERT INTO USUARIOS (NOMBRE, EMAIL) VALUES
('USUARIO 1','EMAIL1'),
('USUARIO 2','EMAIL2'),
('USUARIO 3','EMAIL3'),
('USUARIO 4','EMAIL4'),
('USUARIO 5','EMAIL5');
INSERT INTO INVITACIONES (USR1_ID, USR2_ID) VALUES (1,2);
Actualiza la Invitacin
UPDATE INVITACIONES SET ESTADO = 'R' WHERE ID =2;
146
Consultas Enumeradas
Son consultas que retornan registros con una columna adicional que enumera
todas las filas.
En este ejemplo se hace uso de la base de datos DBAdmision poblada, el CASO
DE ESTUDIO de la pgina 75 y se explica la consulta detalladamente.
SUGERENCIA:
Si has utilizado la base de datos dbadmision en ejercicios previos es mejor volver
a crearla.
Utilizar el Script: dbadmin.sql
Crear una funcin que liste todos los postulantes, la lista debe estar
enumerada y ordenada por apellido paterno, materno y nombres.
N
Apellidos y Nombres
Alarcon
Andres
10
11
Castro
Gustavo
Claudio
Primero debemos crear una funcin que nos retorne una tipo de dato numrico, la
llamaremos rownumber, para ello tambin se realizar la creacin temporal de un
objeto SEQUENCE, cuyo nombre ser el timestamp actual, por ejemplo: SELECT
current_timestamp retorna algo como: 2009-11-17 06:18:53.057964-05. La
funcin nextval realizar el retorno del valor siguiente de dicha secuencia, lo que
har que por cada llamada que reciba el valor ir incementando de uno un uno.
147
148
101
309
310
Total
2005-1
15
2005-2
13
12
25
2006-1
17
18
35
2006-2
23
22
45
2007-1
27
28
55
101
2005-1
309
310
Total
15
149
2005-2
13
12
25
2006-1
17
18
35
2006-2
23
22
45
2007-1
27
28
55
TOTAL
87
87
175
FUNCIONES:
3) Crear una funcin que liste todos los postulantes, la lista debe estar
enumerada y ordenada por apellido paterno, materno y nombres.
N
Apellidos y Nombres
150
END LOOP;
RETURN;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
--SELECT * FROM f_ejemplo_4() AS ("Numero" INTEGER, "Apellidos y Nombres" TEXT);
CREATE OR REPLACE FUNCTION rownumber() RETURNS integer AS $$
BEGIN
EXECUTE 'CREATE TEMP SEQUENCE "'||current_timestamp||'"';
RETURN nextval('"'||current_timestamp||'"');
EXCEPTION WHEN duplicate_table THEN RETURN nextval('"'||current_timestamp||'"');
END
$$ LANGUAGE 'plpgsql';
PROCEDIMIENTOS ALMACENADOS:
4) Crear un procedimiento almacenado que permita eliminar los postulantes
registrados correspondientes a una modalidad.
--SELECT * FROM Persona.Postulante ORDER BY IDModalidad;
CREATE OR REPLACE FUNCTION sp_ejemplo_12(p_IDModalidad integer) RETURNS integer
AS $$
BEGIN
DELETE FROM Persona.Postulante
WHERE IDModalidad=p_IDModalidad;
return p_IDModalidad;
END;
$$ LANGUAGE plpgsql;
--SELECT sp_ejemplo_12(2);
--SELECT * FROM Persona.Postulante ORDER BY IDModalidad;
VISTAS:
5) Crear una vista que muestre un resumen como el siguiente:
Nombre
2005-1
2005-2
2006-1
2006-2
2007-1
Administracin
TOTAL
12
14
23
62
Contabilidad
13
17
22
65
Ingeniera
Informtica
TOTAL
11
15
25
31
45
127
151
152
1) Crear una funcin que liste todos los postulantes, la lista debe estar
enumerada y ordenada por apellido paterno, materno y nombres.
N
Apellidos y Nombres
153
Apellidos y Nombres
Postulantes
Promedio
Puntaje
Administracin
73.065
97
Administracin
73.065
93
Administracin
73.065
89
Contabilidad
Benito
74.369
98
Dionisio
Melissa
154
Katherine
Contabilidad
74.369
98
Contabilidad
74.369
98
155
Automatizacin de Backups
SUGERENCIA:
Si has utilizado la base de datos dbadmision en ejercicios previos es mejor volver
a crearla.
Utilizar el Script: dbadmin.sql
El proceso de creacin de backups en postgres se realiza por medio de pg_dump,
y la automatizacin para su ejecucin se puede lograr por medio de herramientas
como las que se incluye en PGADMIN haciendo uso de los jobs, steps y schedules
o mediante el sistema operativo, como veremos en este ejemplo.
1- CREACIN DE SCRIPT
Script para Linux: pg_backup.sh
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
#!/bin/bash
#-Por: sAfOrAsPG_BIN='/usr/bin/pg_dump'
PG_HOST='localhost'
PG_PORT='5432'
PG_DATABASE='dbadmision'
PG_USER='postgres'
export PGPASSWORD='postgres'
PG_PATH='/var/PGBACKUP'
FECHAYHORA=$(date + "%d-%m-%Y-%H-%M-%S")
PG_FILENAME= "${PG_PATH}/${PG_DATABASE}-${FECHAYHORA}.backup"
${PG_BIN} -i -h ${PG_HOST} -p ${PG_PORT} -U ${PG_USER}
${PG_FILENAME} ${PG_DATABASE}
-F
-b
-v
-f
@echo off
::-Por: sAfOrAsSET PG_BIN=C:\PostgresPlus\8.3R2AS\postgresstudio\pg_dump.exe
SET PG_HOST=localhost
SET PG_PORT=5432
SET PG_DATABASE=dbadmision
156
7.
8.
9.
10.
11.
12.
13.
14.
SET PG_USER=postgres
SET PGPASSWORD=postgres
SET PG_PATH=C:\PGBACKUP\
SET FECHAYHORA=%date:/=-%-%time:~0,8%
SET FECHAYHORA=%FECHAYHORA::=-%
SET FECHAYHORA=%FECHAYHORA: =0%
SET PG_FILENAME=%PG_PATH%\%PG_DATABASE%-%FECHAYHORA%.backup
%PG_BIN% -i -h %PG_HOST% -p %PG_PORT% -U %PG_USER% -F c -b -v -f %PG_FILENAME%
%PG_DATABASE%
# crontab -e
0 0 * 12 *
/home/usuario/pg_backup.sh
<<Guardar>> CTRL + O
<<Salir>> CRTL + X
descripcin
Ubicacion de pg_dump, es el binario que realiza los backups
direccin del host
puerto del servidor
nombre de la base de datos
nombre del usuario
Contrasea del servidor: Es una variable especial registrada
PGPASSWORD en el sistema, el nombre de esta variable debe permanecer
inmutable en el sistema operativo.
157
Bibliografia
http://www.postgresql.org/
http://www.postgresql.org/docs/
http://www.postgresql.org/about/casestudies/
http://www.postgresql.org/docs/7.3/interactive/diskusage.html
http://www.postgresql.org.es/node/667
http://www.pgadmin.org/
http://es.wikipedia.org/wiki/Anexo:Comparaci%C3%B3n_de_sistemas_administrad
ores_de_bases_de_datos_relacionales
http://www.davidghedini.com/pg/entry/install_postgresql_9_on_centos
http://www.if-not-true-then-false.com/2012/install-postgresql-on-fedora-centos-redhat-rhel/
http://blog.neobytec.com/instalando-postgresql-en-centos-6-2-6-3/
http://phenobarbital.wordpress.com/2012/07/24/postgresql-una-instalacion-depostgresql-basica-pero-mejor/
http://tuxapuntes.com/instalar-postgresql-en-centos-6-3/
http://cic.puj.edu.co/wiki/doku.php?id=materias:taller_pl_pgsql
http://help.arcgis.com/es/arcgisdesktop/10.0/help/index.html#//001s000000010000
00
http://wiki.centos.org/es/HowTos/Network/IPTables
158