Treinamento PostgreSQL - Aula 03 Eduardo Ferreira dos Santos SparkGroup Treinamento e Capacitação em Tecnologia eduardo.edusantos@gmail.com eduardosan.com 29 de Maio de 2013 Eduardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 1 / 38 edua
Cronograma Semana 1: 27 de Maio a 4 de Junho Administração de Dados Semana 2: 5-11 de Junho Administração de Banco de Dados Semana 3: 13-18 de Junho Alta disponibilidade Semana 4: 19-24 de Junho Performance Tuning Eduardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 2 / 38 edua
Sumário 1 Consultas Criando a base de dados 2 Funções e Operadores Operadores de data Tipo inet Eduardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 3 / 38 edua
1 Consultas Criando a base de dados 2 Funções e Operadores Operadores de data Tipo inet Eduardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 4 / 38 edua
Denindo a base de dados Modelo da base de dados Eduardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 5 / 38 edua
Criando a base de dados 1 Consultas Criando a base de dados 2 Funções e Operadores Operadores de data Tipo inet Eduardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 6 / 38 edua
Criando a base de dados Relembrando a criação da base Listing 1: Cria usuário, banco e SCHEMA PostgreSQL> c r e a t e u s e r u s u a r i o S h a l l t h e new r o l e be a s u p e r u s e r? ( y /n ) n S h a l l t h e new r o l e be a l l o w e d t o c r e a t e d a t a b a s e s? ( y /n ) n S h a l l t h e new r o l e be a l l o w e d t o c r e a t e more new r o l e s? ( y /n ) n PostgreSQL> createdb O u s u a r i o primeiro_banco CREATE DATABASE PostgreSQL> p s q l U u s u a r i o p r i m e i r o _ b a n c o p s q l ( 9. 1. 9 ) Type " h e l p " f o r h e l p. primeiro_banco=> CREATE SCHEMA usr_ escola ; CREATE SCHEMA p r i m e i r o _ b a n c o=>\q q u i t Eduardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 7 / 38 edua
Criando a base de dados Permissões Listing 2: Ajusta permissões vim / e t c / p o s t g r e s q l / 9. 0 / main /pg_hba. c o n f # A s e g u i n t e l i n h a : l o c a l a l l p o s t g r e s i d e n t # A l t e r a para f i c a r a s s i m : l o c a l a l l p o s t g r e s i d e n t l o c a l p r i m e i r o _ b a n c o u s u a r i o t r u s t l o g o u t # Como root, r e i n i c i e o banco / e t c / i n i t. d/ p o s t g r e s q l r e s t a r t s u p o s t g r e s Eduardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 8 / 38 edua
Criando a base de dados Cria estrutura da base Primeiro baixe os arquivos SQL: Estrutura da base: https://seacloud.cc/f/20677b5257/ Carga inicial de dados: https://seacloud.cc/f/20677b5257/ Em seguida execute os arquivos no banco de dados: Listing 3: Cria base PostgreSQL> p s q l U u s u a r i o f c r i a banco. s q l p r i m e i r o _ b a n c o BEGIN SET p s q l : / tmp/ c r i a banco. s q l : 1 2 : NOTA: CREATE TABLE / PRIMARY KEY á c r i a r í n d i c e í i m p l c i t o " p k _ a l u n o " na t a b e l a " a l u n o " CREATE TABLE p s q l : / tmp/ c r i a banco. s q l : 2 0 : NOTA: CREATE TABLE / PRIMARY KEY á c r i a r í n d i c e í i m p l c i t o " p k _ d i s c i p l i n a " na t a b e l a " d i s c i p l i n a " CREATE TABLE p s q l : / tmp/ c r i a banco. s q l : 2 8 : NOTA: CREATE TABLE / PRIMARY KEY á c r i a r í n d i c e í i m p l c i t o " p k _ a l u n o _ n a _ d i s c i p l i n a " na t a b e l a " a l u n o _ n a _ d i s c i p l i n a " CREATE TABLE p s q l : / tmp/ c r i a banco. s q l : 3 3 : NOTA: CREATE TABLE / PRIMARY KEY á c r i a r í n d i c e í i m p l c i t o " p k _ c u r s o " na t a b e l a " c u r s o " CREATE TABLE p s q l : / tmp/ c r i a banco. s q l : 4 0 : NOTA: CREATE TABLE / PRIMARY KEY á c r i a r í n d i c e í i m p l c i t o " p k _ c o n c e i t o " na t a b e l a " g r a d e _ c o n c e i t o " CREATE TABLE ALTER TABLE COMMIT Eduardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 9 / 38 edua
Criando a base de dados Carga inicial dos dados Listing 4: Alimenta base áííáííáííáííáíí PostgreSQL> p s q l U u s u a r i o f c r i a banco. s q l p r i m e i r o _ b a n c o BEGIN SET INSERT 0 1 INSERT 0 1 INSERT 0 1 INSERT 0 1 INSERT 0 1 INSERT 0 1 INSERT 0 1 (.. ) INSERT 0 1 INSERT 0 1 INSERT 0 1 COMMIT Eduardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 10 / 38 edua
1 Consultas Criando a base de dados 2 Funções e Operadores Operadores de data Tipo inet Eduardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 11 / 38 edua
Junção de duas tabelas (reais ou derivadas) de acordo com as regras do tipo particular de JOIN: INNER JOIN A tabela resultado contém todos os resultados de ambas as tabelas que satisfazam a condição fornecida; OUTER JOIN A tabela resultado contém todas os resultados de ambas as tabelas, ainda que a condição não seja satisfeita; CROSS JOIN Produto cartesiano dos campos das duas tabelas. Eduardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 12 / 38 edua
INNER JOIN Listing 5: Primeiro exemplo de INNER JOIN SELECT d. c o d _ d i s c i p l i n a, d. d e s c r i c a o, c. cod_curso, d. c o d _ d i s c i p l i n a _ r e q u i s i t o, c. d e s c r i c a o FROM u s r _ e s c o l a. d i s c i p l i n a d INNER JOIN u s r _ e s c o l a. c u r s o c ON d. cod_curso = c. cod_curso ORDER BY c. cod_curso ; Eduardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 13 / 38 edua
INNER JOIN Listing 6: Segundo exemplo de INNER JOIN SELECT d. d e s c r i c a o, c. cod_curso, c. d e s c r i c a o, a. m a t r i c u l a FROM u s r _ e s c o l a. d i s c i p l i n a d INNER JOIN u s r _ e s c o l a. c u r s o c ON d. cod_curso = c. cod_curso INNER JOIN u s r _ e s c o l a. a l u n o _ n a _ d i s c i p l i n a a ON d. c o d _ d i s c i p l i n a = a. c o d _ d i s c i p l i n a ORDER BY c. cod_curso ; Eduardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 14 / 38 edua
INNER JOIN Listing 7: Terceiro exemplo de INNER JOIN SELECT d. d e s c r i c a o, c. cod_curso, c. d e s c r i c a o, a. m a t r i c u l a, a l. nome FROM u s r _ e s c o l a. d i s c i p l i n a d INNER JOIN u s r _ e s c o l a. c u r s o c ON d. cod_curso = c. cod_curso INNER JOIN u s r _ e s c o l a. a l u n o _ n a _ d i s c i p l i n a a ON d. c o d _ d i s c i p l i n a = a. c o d _ d i s c i p l i n a INNER JOIN u s r _ e s c o l a. a l u n o a l ON a l. m a t r i c u l a = a. m a t r i c u l a ORDER BY c. cod_curso ; Eduardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 15 / 38 edua
INNER JOIN SELECT d. d e s c r i c a o, c. cod_curso, c. d e s c r i c a o, a. m a t r i c u l a, a l. nome FROM u s r _ e s c o l a. d i s c i p l i n a Listing 8: INNER JOIN com ltro d INNER JOIN u s r _ e s c o l a. c u r s o c ON d. cod_curso = c. cod_curso INNER JOIN u s r _ e s c o l a. a l u n o _ n a _ d i s c i p l i n a a ON d. c o d _ d i s c i p l i n a = a. c o d _ d i s c i p l i n a INNER JOIN u s r _ e s c o l a. a l u n o a l ON a l. m a t r i c u l a = a. m a t r i c u l a WHERE c. cod_curso = 'MAT' ; Eduardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 16 / 38 edua
Considerações sobre performance Carregue o PGAdmin 1 e execute a consulta no banco de dados; Execute a consulta no modo Analyze; O que foi custoso para a consulta? 1 Ferramenta de administração para bases de dados PostgreSQL: http://www.pgadmin.org/ duardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 17 / 38 edua
Considerações sobre performance Carregue o PGAdmin 1 e execute a consulta no banco de dados; Execute a consulta no modo Analyze; O que foi custoso para a consulta? Aplique o ltro utilizando o exemplo 8. O que mudou? 1 Ferramenta de administração para bases de dados PostgreSQL: http://www.pgadmin.org/ duardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 17 / 38 edua
Considerações sobre performance Carregue o PGAdmin 1 e execute a consulta no banco de dados; Execute a consulta no modo Analyze; O que foi custoso para a consulta? Aplique o ltro utilizando o exemplo 8. O que mudou? Utilize o comando EXPLAIN ANALYZE; Copie e cole os resultados no site http://explain.depesz.com/ Quais os procedimentos que mais consomem recursos do banco de dados? 1 Ferramenta de administração para bases de dados PostgreSQL: http://www.pgadmin.org/ Eduardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 17 / 38 edua
OUTER JOIN Listing 9: Exemplo de OUTER JOIN SELECT d. c o d _ d i s c i p l i n a, d. d e s c r i c a o, c. cod_curso, d. c o d _ d i s c i p l i n a _ r e q u i s i t o FROM u s r _ e s c o l a. d i s c i p l i n a d FULL OUTER JOIN u s r _ e s c o l a. c u r s o c ON d. cod_curso = c. cod_curso ; Eduardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 18 / 38 edua
OUTER JOIN Listing 10: Exemplo de OUTER JOIN com ltro SELECT d. c o d _ d i s c i p l i n a, d. d e s c r i c a o, d. c o d _ d i s c i p l i n a _ r e q u i s i t o, c. cod_curso FROM u s r _ e s c o l a. d i s c i p l i n a d FULL OUTER JOIN u s r _ e s c o l a. c u r s o c ON d. cod_curso = c. cod_curso WHERE c. cod_curso = 'DAN' ; Eduardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 19 / 38 edua
LEFT OUTER JOIN Listing 11: Exemplo de LEFT OUTER JOIN SELECT d. c o d _ d i s c i p l i n a, d. d e s c r i c a o, c. cod_curso, d. c o d _ d i s c i p l i n a _ r e q u i s i t o FROM u s r _ e s c o l a. d i s c i p l i n a d LEFT OUTER JOIN u s r _ e s c o l a. c u r s o c ON d. cod_curso = c. cod_curso ; Eduardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 20 / 38 edua
LEFT OUTER JOIN Listing 12: Exemplo de LEFT OUTER JOIN com ltro SELECT d. c o d _ d i s c i p l i n a, d. d e s c r i c a o, c. cod_curso, d. c o d _ d i s c i p l i n a _ r e q u i s i t o FROM u s r _ e s c o l a. d i s c i p l i n a d LEFT JOIN u s r _ e s c o l a. c u r s o c ON d. cod_curso = c. cod_curso WHERE c. cod_curso = 'DAN' ; Eduardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 21 / 38 edua
Exercício Considerando o modelo da gura 5, construa uma consulta que traga a lista de alunos e a lista de disciplinas, incluindo os alunos que não estão matriculados em nenhuma disciplina. Eduardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 22 / 38 edua
Solução Listing 13: Exercício 1 SELECT a. m a t r i c u l a AS m1, a. nome, a l. m a t r i c u l a AS m2 FROM u s r _ e s c o l a. a l u n o a LEFT OUTER JOIN u s r _ e s c o l a. a l u n o _ n a _ d i s c i p l i n a a. m a t r i c u l a = a l. m a t r i c u l a ; a l ON Eduardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 23 / 38 edua
Exercício Adicione a informação do nome da disciplina ao exemplo anterior Eduardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 24 / 38 edua
Solução Listing 14: Exercício 2 SELECT a. m a t r i c u l a AS m1, a. nome, a l. m a t r i c u l a AS m2, d. d e s c r i c a o, a l. c o d _ d i s c i p l i n a FROM u s r _ e s c o l a. a l u n o a LEFT OUTER JOIN u s r _ e s c o l a. a l u n o _ n a _ d i s c i p l i n a a. m a t r i c u l a = a l. m a t r i c u l a LEFT OUTER JOIN u s r _ e s c o l a. d i s c i p l i n a d ON a l. c o d _ d i s c i p l i n a = d. c o d _ d i s c i p l i n a a l ON Eduardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 25 / 38 edua
Exercício Troque o segundo LEFT OUTER JOIN por INNER JOIN e veja o que acontece. Eduardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 26 / 38 edua
Solução Listing 15: Exercício 3 SELECT a. m a t r i c u l a AS m1, a. nome, a l. m a t r i c u l a AS m2, d. d e s c r i c a o, a l. c o d _ d i s c i p l i n a FROM u s r _ e s c o l a. a l u n o a LEFT OUTER JOIN u s r _ e s c o l a. a l u n o _ n a _ d i s c i p l i n a a. m a t r i c u l a = a l. m a t r i c u l a INNER JOIN u s r _ e s c o l a. d i s c i p l i n a d ON a l. c o d _ d i s c i p l i n a = d. c o d _ d i s c i p l i n a a l ON Eduardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 27 / 38 edua
Funções e Operadores 1 Consultas Criando a base de dados 2 Funções e Operadores Operadores de data Tipo inet Eduardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 28 / 38 edua
Funções e Operadores Introdução Objetivos: Realizar operações com tipos de dados diferentes; Comparar valores em diferentes formatos; Conversão de dados; Operadores complexos e dados abstratos. Eduardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 29 / 38 edua
Funções e Operadores Operadores de data 1 Consultas Criando a base de dados 2 Funções e Operadores Operadores de data Tipo inet Eduardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 30 / 38 edua
Funções e Operadores Operadores de data Operadores de data Listing 16: Conversão de dados SELECT c o d _ d i s c i p l i n a, to_char ( p e r i o d o, 'MM/YYYY ' ) as mes FROM u s r _ e s c o l a. a l u n o _ n a _ d i s c i p l i n a ; Eduardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 31 / 38 edua
Funções e Operadores Operadores de data Operadores de data Listing 17: Operadores de data SELECT c o d _ d i s c i p l i n a, age ( p e r i o d o ) as mes FROM u s r _ e s c o l a. a l u n o _ n a _ d i s c i p l i n a ; SELECT c o d _ d i s c i p l i n a, age ( now ( ), p e r i o d o ) as mes FROM u s r _ e s c o l a. a l u n o _ n a _ d i s c i p l i n a ; Eduardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 32 / 38 edua
Funções e Operadores Operadores de data Operadores de data Listing 18: Funções de data SELECT c l o c k _ t i m e s t a m p ( ), current_date, current_timestamp, l o c a l t i m e, l o c a l t i m e s t a m p, now ( ), statement_timestamp ( ), t i m e o f d a y ( ), t r a n s a c t i o n _ t i m e s t a m p ( ) ; Eduardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 33 / 38 edua
Funções e Operadores Tipo inet 1 Consultas Criando a base de dados 2 Funções e Operadores Operadores de data Tipo inet Eduardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 34 / 38 edua
Funções e Operadores Tipo inet Adiciona tipo BEGIN ; Listing 19: Insere tipo inet ALTER TABLE usr_ escola. aluno ADD COLUMN e n d e r e c o _ i p i n e t ; UPDATE usr_ escola. aluno SET e n d e r e c o _ i p = ' 1 9 2. 1 6 8. 1. 1 ' WHERE m a t r i c u l a = ' 1 ' ; UPDATE usr_ escola. aluno SET e n d e r e c o _ i p = ' 1 9 2. 1 6 8. 1. 2 ' WHERE m a t r i c u l a = ' 2 ' ; UPDATE usr_ escola. aluno SET e n d e r e c o _ i p = ' 1 9 2. 1 6 8. 1. 3 ' WHERE m a t r i c u l a = ' 3 ' ; UPDATE usr_ escola. aluno SET e n d e r e c o _ i p = ' 1 9 2. 1 6 8. 1. 1 0 0 ' WHERE m a t r i c u l a = ' 4 ' ; UPDATE usr_ escola. aluno SET e n d e r e c o _ i p = ' 1 9 2. 1 6 8. 2. 1 ' WHERE m a t r i c u l a = ' 5 ' ; END ; Eduardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 35 / 38 edua
Funções e Operadores Tipo inet Funções Listing 20: Funções básicas SELECT a b b r e v ( e n d e r e c o _ i p ), b r o a d c a s t ( e n d e r e c o _ i p ), f a m i l y ( e n d e r e c o _ i p ), h o s t ( e n d e r e c o _ i p ), netmask ( e n d e r e c o _ i p ) FROM u s r _ e s c o l a. a l u n o ; Eduardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 36 / 38 edua
Funções e Operadores Tipo inet Operadores Listing 21: Operadores para endereço IP SELECT m a t r i c u l a, nome FROM u s r _ e s c o l a. a l u n o WHERE e n d e r e c o _ i p = '192.168.1.1 ' : : i n e t ; SELECT m a t r i c u l a, nome FROM u s r _ e s c o l a. a l u n o WHERE e n d e r e c o _ i p >= '192.168.2.1 ' : : i n e t ; SELECT m a t r i c u l a, nome FROM u s r _ e s c o l a. a l u n o WHERE e n d e r e c o _ i p < '192.168.2.1 ' : : i n e t ; Eduardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 37 / 38 edua
Funções e Operadores Tipo inet Contato Eduardo Ferreira dos Santos Sparkgroup Lightbase Consultoria em Software Público eduardo.santos@lightbase.com.br eduardo.edusantos@gmail.com www.postgresql.org.br www.eduardosan.com +55 61 3347-1949 Eduardo Ferreira dos Santos (SparkGroup TreinamentoePostgreSQL Capacitação- Aula em Tecnologia 03 eduardo.edusantos@gmail.com 29 de Maio de 2013 38 / 38 edua