Sie sind auf Seite 1von 123

PostgreSQL Prtico

Contedo
1

PostgreSQL Prtico/Introduo

1.1

1 - Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

PostgreSQL Prtico/Instalao

2.1

2 - Instalao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

PostgreSQL Prtico/Instalao/No Linux

3.1

Pr-requisitos para instalao do PostgreSQL num UNIX . . . . . . . . . . . . . . . . . . . . . .

3.2

Instalao no Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

PostgreSQL Prtico/Instalao/No Windows

4.1

2 Instalao no Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

PostgreSQL Prtico/DDL

5.1

3 - DDL (Data Denition Language) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

PostgreSQL Prtico/DDL/Criao e Excluso de Bancos, Esquemas, Tabelas, Views, Constraints, etc 10

PostgreSQL Prtico/DDL/Alteraes nos objetos dos bancos

16

PostgreSQL Prtico/DDL/ndices, Tipos de Dados e Integridade Referencial

18

PostgreSQL Prtico/DML

22

9.1

22

4 - DML (Data Manipulation Language) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

10 PostgreSQL Prtico/DML/Consultas

23

10.1 DML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

23

10.2 Consultas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

23

10.3 Trabalhando corretamente com select . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

26

11 PostgreSQL Prtico/DML/Consultas Join


11.1 4.2 - Junes de Tabelas ou Consultas

27
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

27

11.2 INNER JOIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

28

11.3 Operao JOIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

29

11.4 LEFT OUTER JOIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

29

11.5 RIGHT OUTER JOIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

29

ii

CONTEDO

12 PostgreSQL Prtico/DML/Sub Consultas

31

12.1 4.3 Sub consultas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


13 PostgreSQL Prtico/Funes Internas
13.1 5 - Funes Internas

33

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

14 PostgreSQL Prtico/Funes Internas/Strings


14.1 5.1 Funes de Strings

31

33
34

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

15 PostgreSQL Prtico/Funes Internas/Matemticas

34
36

15.1 5.2 Funes Matemticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

36

15.2 NULL ou no NULL, eis a questo! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

37

16 PostgreSQL Prtico/Funes Internas/Agrupamento

38

16.1 5.3 Funes de Agrupamento (Agregao) . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


17 PostgreSQL Prtico/Funes Internas/Data e Hora
17.1 5.4 Funes de Data/Hora

39

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

18 PostgreSQL Prtico/Funes Internas/Formatao de Tipos de Dados


18.1 5.5 - Formatao de Tipos de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19 PostgreSQL Prtico/Funes Internas/Converso de Tipos
19.1 5.6 - Converso Explcita de Tipos (CAST)

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

20 PostgreSQL Prtico/Funes Denidas pelo Usurio e Triggers


20.1 6 - Funes Denidas pelo Usurio e Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21 PostgreSQL Prtico/Funes Denidas pelo Usurio e Triggers/SQL
21.1 6 - Funes no PostgreSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
22 PostgreSQL Prtico/Funes Denidas pelo Usurio e Triggers/PlpgSQL
22.1 6.2 - Funes em Pl/pgSQL

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

23 PostgreSQL Prtico/Funes Denidas pelo Usurio e Triggers/Triggers


23.1 6.3 - Triggers (Gatilhos)

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

24 PostgreSQL Prtico/DCL
24.1 7 - DCL (Data Control Language) - Administrao

. . . . . . . . . . . . . . . . . . . . . . . . .

25.1 7.1 - Usurios, grupos e privilgios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


26 PostgreSQL Prtico/Transaes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

27 PostgreSQL Prtico/Administrao

39
41
41
42
42
44
44
45
45
47
47
49
49
51

25 PostgreSQL Prtico/DCL/Administrao de usurios, grupos e privilgios

26.1 8 Transaes

38

51
52
52
54
54
56

CONTEDO

iii

27.1 9 - Administrao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
28 PostgreSQL Prtico/Administrao/Backup e Restore
28.1 9.1 - Backup e Restore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
29 PostgreSQL Prtico/Administrao/Importar e Exportar
29.1 9.2 - Importar e Exportar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
30 PostgreSQL Prtico/Administrao/Converter
30.1 9.3 - Converter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
31 PostgreSQL Prtico/Administrao/Otimizao e Desempenho

56
57
57
60
60
61
61
62

31.1 Otimizao e Desempenho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

62

31.2 How to optimize PostgreSQL database size . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

62

31.3 Uma tima fonte de consulta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

62

31.4 VACUUM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

62

31.5 ANALYZE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

62

31.6 Recomendao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

62

31.7 Dicas de Desempenho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

63

31.8 Separando bancos e Logs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

63

31.9 Plano de Consulta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

63

31.10Reincio do ID de Transaes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

64

31.11Alerta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

64

32 PostgreSQL Prtico/Replicao

65

32.1 10 - Replicao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

65

32.2 Cluster != Replicao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

66

33 PostgreSQL Prtico/Conguraes
33.1 11 - Conguraes

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

34 PostgreSQL Prtico/Conguraes/Congurar acessos


34.1 11.1 - pg_hba.conf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
35 PostgreSQL Prtico/Conguraes/Conguraes Diversas
35.1 11.2 - postgresql.conf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
36 PostgreSQL Prtico/Metadados
36.1 12 - Metadados (Catlogo) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
37 PostgreSQL Prtico/Conectividade
37.1 13 - Conectividade

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

38 PostgreSQL Prtico/Ferramentas
38.1 14 - Ferramentas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

67
67
68
68
71
71
73
73
79
79
81
81

iv

CONTEDO

39 PostgreSQL Prtico/Ferramentas/psql

82

39.1 14.1 - psql . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


40 PostgreSQL Prtico/Ferramentas/phpPgAdmin

84

40.1 14.2 - phpPgAdmin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


41 PostgreSQL Prtico/Ferramentas/PgAdmin
41.1 14.3 PgAdmin

42 PostgreSQL Prtico/Ferramentas/EMS PostgreSQL


. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

88
89

44.1 14.6 DbVisualizer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


45 PostgreSQL Prtico/Ferramentas/OpenOce Base

89
90

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

46 PostgreSQL Prtico/Apndices

90
91

46.1 15 - Apndices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
47 PostgreSQL Prtico/Apndices/Planejamento e Projeto de Bancos de Dados
47.1 15.1 Planejamento e Projeto de Bancos de Dados

86
88

44 PostgreSQL Prtico/Ferramentas/dbVisualizer

45.1 14.7 Openoce2 Base

85
86

43 PostgreSQL Prtico/Ferramentas/Azzurry Clay


43.1 14.5 - Azzurry Clay (modelagem)

84
85

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

42.1 14.4 - EMS PostgreSQL Manager

82

. . . . . . . . . . . . . . . . . . . . . . . . .

48 PostgreSQL Prtico/Apndices/Implementao de Banco de Dados com o PostgreSQL


48.1 15.2 Implementao de Banco de Dados com o PostgreSQL - Modelo Fsico . . . . . . . . . . .
49 PostgreSQL Prtico/Apndices/Integridade Referencial - PostgreSQL
49.1 15.3 - Integridade Referencial - Postgresql . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
50 PostgreSQL Prtico/Apndices/Dicas Prticas de uso do SQL

91
92
92
95
95
98
98
100

50.1 15.4 - Dicas Prticas de uso do SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100


51 PostgreSQL Prtico/Apndices/Dicas sobre Desempenho e Otimizaes do PostgreSQL

105

51.1 15.5 Dicas sobre Desempenho e Otimizaes do PostgreSQL . . . . . . . . . . . . . . . . . . . 105


52 PostgreSQL Prtico/Exerccios

109

52.1 16 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109


53 PostgreSQL Prtico/Referncias

112

53.1 17 - Referncias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112


53.2 Fontes, contribuidores e licenas de texto e imagem . . . . . . . . . . . . . . . . . . . . . . . . . 115
53.2.1 Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
53.2.2 Imagens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117

CONTEDO

53.2.3 Licena . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117

Captulo 1

PostgreSQL Prtico/Introduo
1.1 1 - Introduo

Os bancos de dados so utilizados em muitas aplicaes,


abrangendo praticamente todo o campo dos programas
de computador. Os bancos de dados so o mtodo de
armazenamento preferencial para aplicaes multiusuHistria dos SGDBs
rio, nas quais necessrio haver coordenao entre vAnos 60 - utilizados sistemas gerenciadores de arquivos rios usurios. Entretanto, so convenientes tambm para
(ISAM e VSAM), usados at hoje.
indivduos, e muitos programas de correio eletrnico e
Anos 70 - Gerenciadores de Bancos de dados de rede. organizadores pessoais baseiam-se em tecnologias padronizadas de bancos de dados.
Desapareceram nos anos 90.
Em Maro, 2004, AMR Research (como citado em um
artigo da CNET News.com listado na seco de RefeAnos 90 - SGBDOR (Oracle, DB2, PostgreSQL e Infor- rncias) previu que aplicaes de banco de dados de cmix)
digo aberto seriam amplamente aceitas em 2006.
Anos 90 - SGBDOO (Cach)
Esquemas so subdivises de bancos de dados, cuja
Anos 80 - SGBDRs (Oracle, DB2, SQLServer)

SGBD = Composto por programas de gerenciamento, ar- funo permitir um melhor nvel de organizao.
mazenamento e acesso aos dados, com a nalidade de Projetos de mesma categoria, que precisem acessar uns
tornar gil e eciente a manipulao dos dados.
aos outros devem car em um mesmo banco, podendo Dicionrio de dados - metadados, dados sobre os dados, car em esquemas separados. Tabelas so subdivises
ou seja, informaes sobre a estrutura dos bancos de da- de um esquema, nelas realmente cam armazenados os
dados de um banco. Uma tabela parece realmente com
dos (nomes de tabelas, de campos, tipos de dados, etc).
uma tabela em papel, tipo planilha, com linhas e coluDBA - Database Administrator, com as funes de: - Denas. Cada linha representa um registro de banco de danir e modicar esquemas, estruturas de armazenamento
dos e cada cruzamento de coluna com linha representa
e mtodos de acesso - Liberar privilgios de acesso - Esum campo de tabela.
pecicao de restrio de integridade
Tipo de Dados de um campo restringe o conjunto de valoSimplicando temos (no PostgreSQL), em termos de
res (domnio) que pode ser atribudo ao campo e atribui
estrutura:
semntica aos dados armazenados. Um campo do tipo
- O SGBD formado por bancos de dados, tablespaces, numrico no aceita dados do tipo texto ou similar.
usurios e alguns programas auxiliares;
Citao da Introduo do documento sobre otimizao do
- Um banco de dados formado pelos esquemas e lingua- PostgreSQL
gens;
POSTGRESQL um SGBD objeto-relational (SGB- Um esquema formado por funes de agrupamento, DOR) desenvolvido via Internet por um grupo de desenfunes do usurio, triggers, procedures, sequncias, ta- volvedores espalhados pelo globo. uma alternativa de
belas e views; - Tabelas so formadas por campos, cons- cdigo fonte-aberta para SGBDs comerciais como Oracle
traints, ndices e triggers.
e Informix.
- Em termos de dados uma tabela formada por registros O POSTGRESQL foi desenvolvido originalmente na
e campos.
Universidade de Califrnia em Berkeley. Em 1996, um
Segundo a Wikipedia (http://pt.wikipedia.org): ... A grupo comeou o desenvolvimento do SGBD na Interapresentao dos dados pode ser semelhante de uma net. Eles usam e-mail para compartilhar idias e serplanilha eletrnica, porm os sistemas de gesto de banco vidores de arquivos para compartilhar cdigo. POSTde dados possuem caractersticas especiais para o arma- GRESQL agora comparvel SGBDs comerciais em
termos de caractersticas, desempenho e conana. Hoje
zenamento, classicao e recuperao dos dados.
1

CAPTULO 1. POSTGRESQL PRTICO/INTRODUO

tem transaes, views, procedimentos armazenados, e


constranints de integridade referencial. Apia um nmero grande de interfaces de programao, como ODBC,
Java (JDBC), TCL/TK, PHP, Perl e Python, entre outros. POSTGRESQL continua avanando a um tremendo
passo, graas a um grupo talentoso de desenvolvedores
via Internet. (Bruce Momjian - 16th January 2003)

Mtodos de ndice

O PostgreSQL aniversariou no dia 08/07/2006, quando


completou 10 anos (08/07/1996). Seu dcimo aniversrio foi comemorado nos dias 08 e 09 de julho prximo,
em Toronto, Canad, com algumas conferncias sobre o
mesmo. Atualmente est na verso 8.1.4 (14/09/2006).

Mohawk Software

Linguagens Procedurais (Stored Procedures)


Licena

Sua licena BSD, portanto pode ser utilizado, modicado e distribudo por qualquer pessoa ou empresa para
qualquer nalidade, sem encargo, em quaisquer dos sisProjeto POSTGRES (1986-1994): Partiu do projeto do temas operacionais suportados.
SGBD Ingres de Berkeley. Projetista: Michael Stonebra- Algumas Empresas que Utilizam PostgreSQL
ker.
BASF (PDF format)
Em 1995 dois estudantes de Berkeley (Jolly Chen e Andrew Yu) adicionam suporte a SQL. Seu novo nome: Fujitsu
Postgres95. Foi totalmente reescrito em C e tam- Apple
bm adotou a SQL. Foi originalmente patrocinado pelo
RedHat
DARPA, ARO, NSF e ESL Inc.
Sun
Em 1996: Disponibilizado na Internet sob o nome de
Pervasive
PostgreSQL.
Proximity
Radio Paradise
Shannon Medical Center

Para saber mais sobre a histria do PostgreSQL vi- Spiros Louis Stadium
site o site ocial em: http://www.postgresql.org/docs/
The Dravis Group OSS Report
current/interactive/history.html
Ou em portugus em: http://pgdocptbr.sourceforge. Vanten Inc.
net/pg80/history.html

SRA

Caractersticas:

Rambler

O PostgreSQL suporta grande parte do SQL ANSI, in- Netezza


clusive do SQL 2003, alm de oferecer outros recursos VA Software
importantes, como:
Travel Post
Comandos complexos
National Weather Service
Chaves estrangeiras (Foreign Key)
Aplicaes Corporativas de Alto Volume: Uma Solu Gatilhos (Triggers)
o com o PostgreSQL
Vises (views)
A utilizao da dupla PostgreSQL+Linux nas empresas
Integridade de Transaes
cresce rapidamente e um exemplo de como produtos
Open Source podem ajudar empresas a racionalizar os
Controle de Simultaneidade Multiverso (MVCC)
custos de TI. Uma das caractersticas do PostgreSQL a
Suporta mltiplas transaes online concorrentes entre sua capacidade de lidar com um grande volume de dados.
usurios.
Existem aplicaes em produo com tabelas possuindo
Suporte a Rules (sistema de regras que reescreve dire- mais de 100 milhes de linhas. No Brasil, existem casos
de sucesso de empresas lidando com bases com dezenas
tivas SQL)
de milhes de registros gerenciadas pelo PostgreSQL.
Criao de tabelas temporrias (CREATE TEMP TAUma das maiores implantaes de PostgreSQL no Brasil
BLE nome(listadecampos tipos);)
na Atrium Telecom, empresa de telefonia corporativa
Traz tambm opes de extenso pelo usurio para:
de So Paulo. O PostgreSQL utilizado como banco de
dados do sistema de billing e tem uma base de dados de
Tipos de dados
mais de 100GB e efetua 1 milho de transaes dirias.
Funes
As maiores tabelas do sistema contam com mais de 70
Operadores
milhes de linhas.
Funes de Agregao (Agrupamento)

A utilizao do banco de dados PostgreSQL cada


vez mais ampla nas empresas que buscam um ser-

1.1. 1 - INTRODUO
vidor de banco de dados altamente sosticado, com
alta performance, estvel e capacitado para lidar com
grandes volumes de dados. O fato de ser um produto Open Source, sem custos de licena para nenhum
uso, torna o PostgreSQL uma alternativa extremamente
atraente para empresas que buscam um custo total de
propriedade (TCO) menor para os ativos de TI. Citao de: http://www.dib.com.br/dib%20cd/LC2003/P%
C3%A1ginas/LC2003_Conf.html
Metr de So Paulo e DATAPREV tambm utilizam o
PostgreSQL.

Captulo 2

PostgreSQL Prtico/Instalao
2.1 2 - Instalao
1. No Linux
2. No Windows

Captulo 3

PostgreSQL Prtico/Instalao/No Linux


O PostgreSQL roda em uma conta de usurio, chamada voc.
de postgres. Esta conta no a mesma dos utilizadores Idealmente mude para o superusurio logo aqui.
das bases de dados: os usurios da base de dados devem
./congure make make install groupadd postgres
ser criados pelo prprio PostgreSQL.
useradd -g postgres -d /usr/local/pgsql postgres mkdir /usr/local/pgsql/data chown postgres:postgres
/usr/local/pgsql/data passwd postgres su - postgres
3.1 Pr-requisitos para instalao /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
/usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/data
do PostgreSQL num UNIX
>logle 2>&1 & /usr/local/pgsql/bin/pg_ctl -D
/usr/local/pgsql/data start /usr/local/pgsql/bin/createdb
make do GNU (gmake ou make)
test /usr/local/pgsql/bin/psql test
compilador C, preferido GCC mais recente
Copiar o script de inicializao linux para o /etc/init.d
gzip
(Nos Debians):
biblioteca readline (para psql)

De
/usr/local/src/postgresql-8.1.4/contrib/startscript/linux para /etc/init.d/postgresql

gettext (para NLS)

Dar permisso de
/etc/init.d/postgresql

kerberos, openssl e pam (opcional, para autenticao)

execuo:

chmod

u+x

Se no Ubuntu ou outro Debian:

3.2 Instalao no Linux

sudo gedit /etc/prole (e adicione


PATH=/usr/local/pgsql/bin:$PATH

linha):

Vrias distribuies j contam com binrios para ins- Depois execute:


talao do PostgreSQL (Ubuntu, Debian, Slackware,
source /etc/prole
RedHat, Fedora, etc).
Agora o postgres est no path.
Em uma instalao padro do Ubuntu veja o que precisa
Ps Instalao (sh, bash, ksh e zsh):
para instalar os fontes:
LD_LIBRARY_PATH=/usr/local/pgsql/lib
LD_LIBRARY_PATH

Antes de instalar:

export

sudo apt-get install build-essential libreadline5-dev


Ou no ~/.bash_prole do usurio postgres
zlib1g-dev gettext
E use make ao invs de gmake.

initdb inicializa o cluster, cria os scripts de congurao default.

Faa o download de http://www.postgresql.org/ftp/


source/

postmaster inicia o processo do servidor responsvel por escutar por pedidos de conexo.

e descompacte (gosto de descompactar em /usr/local/src


e instalar no diretrio default, que /usr/local/pgsql).
Instalar pelos binrios da distribuio tem as vantagens
de j instalar e congurar praticamente tudo automaticamente, mas instalar dos fontes d um maior controle
sobre as conguraes (voc sabe que tudo car no
/usr/local/pgsql) e temos a possibilidade de instalar sempre a ltima verso. Reita sobre a melhor opo para

Para suporte aos locales do Brasil usar:


/usr/local/pgsql/bin/initdb
/usr/local/pgsql/data

--locale=pt_BR

-D

A instalao via fontes (sources) em algumas distribuies muito enxutas, voltadas para para desktop, pode no
5

CAPTULO 3. POSTGRESQL PRTICO/INSTALAO/NO LINUX

funcionar da primeira vez, pois faltaro algumas biblio- anterior


tecas, compiladores, etc.
mv /usr/local/pgsql /usr/local/pgsql.old
Aps a instalao est criado o agrupamento principal
Ento instale a nova verso, crie o diretrio de dados e
(cluster main) de bancos de dados do PostgreSQL.
einicie o novo servidor.
Caso no se tenha conana nos usurios locais reco- /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
mendvel utilizar a opo -W, --pwprompt ou pwle do
/usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/data
initdb, que atribuir uma senha ao superusurio.
No arquivo pg_hba.conf utilizar autenticao tipo md5, Finalmente, restore seus dados usando o novo servidor
password ou cript, antes de iniciar o servidor pela pri- com:
meira vez.
/usr/local/pgsql/bin/psql -d postgres -f bancos.sql
Quando o programa que inicia o servidor (postmaster) Para mais detalhes sobre os procedimentos de instalao,
est em execuo, criado um PID e armazenado dentro veja itens 14.5 e 14.6 do manual.
do arquivo postmaster.pid, dentro do subdiretrio data.
Ele impede que mais de um processo postmaster seja exe- Plataformas Suportadas
cutado usando o mesmo cluster e diretrio de dados.
Atualmente o PostgreSQL suporta muitas plataformas,
entre elas o Windows, Linux, FreeBSD, NetBSD,
Baixar PostgreSQL via Anonymous CVS:
OpenBSD, Mac OS e diversos outros. Plataformas suBaixar CVS de - http://www.nongnu.org/cvs/
portadas e as no suportadas na seo 14.7 do manual
ocial.
Instalar e Logar com qualquer senha:
cvs
-d
:pserver:anoncvs@anoncvs.postgresql.org: No PostgreSQL o processo postmaster escuta por conexes dos clientes.
/projects/cvsroot login Baixar fontes:
cvs -z3 -d :pserver:anoncvs@anoncvs.postgresql.org: Existem mais dois processos tambm iniciados, ambos
/projects/cvsroot co -P pgsql Isto ir instalar o Post- com nome postgres. Eles cuidam da gravao dos logs ou
tabelas e da manuteno das estatsticas.
greSQL num subdiretrio pgsql do diretrio atual.
Para cada conexo com uma aplicao cliente criado
Atualizar a ltima instalao via CVS:
um novo processo com o mesmo nome do usurio da coAcesse o diretrio pgsql e execute - cvs -z3 update -d -P nexo. Por isso importante que cada aplicativo tenha
Isto ir baixar somente as alteraes ocorridas aps a l- seu usurio e se tenha um maior controle.
tima instalao.
Os arquivos de congurao (postgresql.conf,
Tambm podemos criar um arquivo .cvsrc no home do pg_hba.conf e pg_ident.conf) a partir da verso 8
podem car em diretrio diferente do PGDATA.
usurio com as duas linhas:
cvs -z3

Sugesto de Padro

update -d -P

Nomes de bancos no plural

Atualizao do PostgreSQL entre Verses

Nomes de tabelas no singular

Caso voc tenha uma verso que no seja 8.1.x e esteja


querendo instalar a 8.1.4, ento precisa fazer um backup
dos seus dados e restaurar logo aps a instalao como
sugerido em seguida. Ser assumido que sua instalao
foi em:

Exemplo:
banco clientes
tabela - cliente

Criar Novo Cluster


/usr/local/pgsql e seus dados no sub diretrio data. Caso Caso sinta necessidade pode criar outros clusters, especontrrio faa os devidos ajustes.
cialmente indicado para grupos de tabelas com muito
1 Ateno para que seus bancos no estejam recebendo acesso.
atualizao durante o backup. Se preciso proba acesso O comando para criar um novo cluster na verso atual
no pg_hba.conf.
(8.1.3) do PostgreSQL :
2 Efetuando backup:
pg_dumpall > bancos.sql .Para preservar os OIDs use a
opo -o no pg_dumpall.
3 Pare o servidor
pg_ctl stop ou outro comando
Caso queira instalar a nova verso no mesmo diretrio da

banco=# \h create tablespace


Comando: CREATE TABLESPACE
Descrio: dene uma nova tablespace
Sintaxe:

3.2. INSTALAO NO LINUX


CREATE TABLESPACE nome_tablespace [ OWNER
usurio ] LOCATION 'diretrio'
Exemplo:
CREATE TABLESPACE ncluster OWNER usurio
LOCATION '/usr/local/pgsql/nc'; CREATE TABLESPACE ncluster [OWNER postgres] LOCATION
'c:\\ncluster';
O diretrio deve estar vazio e pertencer ao usurio.
Criando um banco no novo cluster:
CREATE DATABASE bdcluster TABLESPACE =
ncluster;
Obs: Podem existir numa mesma mquina vrios agrupamentos de bancos de dados (cluster) gerenciados por um
mesmo ou por diferentes postmasters.
Se usando tablespace o gerenciamento ser de um mesmo
postmaster, se inicializados por outro initdb ser por outro.
Setar o Tablespace default:
SET default_tablespace = tablespace1;
Listar os Tablespaces existentes:
\db SELECT spcname FROM pg_tablespace;
Detalhes extras no item 14.5 do manual ocial.
Somente Caso de ter que repetir os procedimentos use:
make distclean
e repita a sequncia acima.

Captulo 4

PostgreSQL Prtico/Instalao/No
Windows
4.1 2 Instalao no Windows

- Painel de controle - Ferramentas administrativas - Gerenciamento do computador - Usurios e grupos locais Usurios. Remova o postgres

Instalao no Windows XP

- Agora clique em Prximo e Sim

Lembrar que: Precisa instalar em sistema de arquivos - Na tela Inicializar o agrupamento de bancos de dados":
NTFS e no instala no XP Start Edition (onde falta su- - Caso precise acessar sua mquina de outra remota marporte a redes).
que Endereos
- Fazer download do site ocial (www.postgresql.org) - Em Locale selecione Portugus Brasil
(hoje postgresql-8.2.zip)
- Em Codicao selecione LATIN1
- Executar o arquivo postgresql-8.1.msi
- Entre com uma senha e repita. Altere o usurio se for o
- Selecionar idioma e Start. Depois em Prximo.
caso e Prximo.
- Na tela Informaes de Instalao existem muitas in- - Na tela Habilitar Linguagens Procedurais deixe marformaes importantes:
cada PL/pgsql (caso pretenda utilizar) e Prximo
- Sugere a leitura da FAQ
- Na tela Habilitar Mdulos Contrib marque os deseja- Fala das licenas dos diversos softwares a serem insta- dos e Prximo
lados
- Na tela Habilitar PostGIS em templae1 marque so- As verses 95, 98 e Me do Windows no so suportadas mente se precisar que todos os bancos tragam o PostGIS
e Prximo e Prximo novamente.
pelo PostgreSQL
- Aps instalar, na tela Instalao concluda
- Usar obrigatoriamente em sistema de arquivos NTFS
recomenda-se que voc se cadastrar na lista pgsql- Instalar como servio (mesmo que deixe como manual) announce, que envia informaes semanais sobre novas
- O PostgreSQL no executa com usurio que tenha pri- verses e correes de erros. Basta clicar no boto, fazer
o cadastro e Concluir.
vilgios de administrador
- Os drivers jdbc esto no subdiretrio \jdbc, que deve
ser adicionada ao CLASSPATH
- Na Tela Opes de Instalao marque:
- Suporte para idioma nativo (importante para ter as mensagens em pt_BR)
- E outros que considere importantes e clique em Prximo
- Na tela Congurao do Servio":
- Poder optar por instalar como servio ou no. Como
servio mais prtico. Clique em Prximo (ele criar
uma senha)
- Obs.: Caso j tenha instalado o PostgreSQL antes nesta
mquina dever remover o usurio postgres antes de
continuar:
8

Captulo 5

PostgreSQL Prtico/DDL
5.1 3 - DDL (Data Denition Language)
1. Criao e Excluso de Bancos, Esquemas, Tabelas,
Views, Constraints, etc
2. Alteraes nos objetos dos bancos
3. ndices, Tipos de Dados e Integridade Referencial

Captulo 6

PostgreSQL Prtico/DDL/Criao e
Excluso de Bancos, Esquemas, Tabelas,
Views, Constraints, etc
DDL o conjunto de comandos SQL responsveis pela Descrio: cria um novo banco de dados
denio dos dados, ou seja, pela criao de bancos, esSintaxe:
quemas, tabelas, campos, tipos de dados, constraints, etc.
CREATE DATABASE nome
3.1 - Criao e excluso de bancos, esquemas, tabelas,
[ [ WITH ] [ OWNER [=] dono_bd ] [ TEMPLATE [=]
views, etc
modelo ] [ ENCODING [=] codicao ] [ TABLESObs.: Nomes de objetos e campos no podem usar hfen PACE [=] tablespace ] ] [ CONNECTION LIMIT [=]
(-). Alternativamente usar sublinhado (_).
limite_con ] ]
campo-1 Invlido
CREATE DATABASE nomebanco;
campo_1 Vlido

Excluindo Um Banco

Nomes de Identicadores

DROP DATABASE nomebanco;


Utiliza-se por conveno as palavras chaves do SQL em Listar os bancos existentes:
maisculas e os identicadores dos objetos que criamos
\l - - No psql
em minsculas.
Identicadores digitados em maisculas sero gravados psql -l (no prompt)
em minsculas, a no ser que venham entre aspas .
SELECT datname FROM pg_database;
Revises da Linguagem SQL
SQL 1989
SQL 1992
SQL 1999
SQL 2003
Divises da SQL
DML Linguagem de Manipulao de Dados

Quando se cria um novo banco de dados sem indicar o


modelo, o que de fato estamos fazendo clonar o banco
de dados template1.
Criar um banco para outro usurio:
CREATE DATABASE nomebanco OWNER nomeuser;
createdb -O nomeusuario nomebanco
Obs.: requer ser superusurio para poder criar banco para
outro usurio.

DDL Linguagem de Denio de Dados

Criar Tabela
DCL Linguagem de Controle de Dados (autorizao postgres=# \h create table
de dados e licena de usurios para controlar quem tem
Comando: CREATE TABLE
acesso aos dados).
DQL Linguagem de Consulta de Dados (Tem apenas Descrio: dene uma nova tabela
um comando: SELECT).
Sintaxe:
Criar Banco
banco=# \h create database
Comando: CREATE DATABASE

CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY |


TEMP } ] TABLE nome_tabela ( [
{ nome_coluna tipo_dado [ DEFAULT expresso_padro ] [ restrio_coluna [ ... ] ] | restrio_tabela
10

11
| LIKE tabela_pai [ { INCLUDING | EXCLUDING } CREATE TABLE produtos (
DEFAULTS ] } [, ... ]
produto_no integer, descricao text, preco numeric DE])
FAULT 9.99
[ INHERITS ( tabela_pai [, ... ] ) ]

);

[ WITH OIDS | WITHOUT OIDS ]

Constraints (Restries)

[ ON COMMIT { PRESERVE ROWS | DELETE CHECK


ROWS | DROP } ]
Ao criar uma tabela podemos prever que o banco exija
[ TABLESPACE tablespace ]
que o valor de um campo satisfaa uma expresso
onde restrio_coluna :

CREATE TABLE produtos (

[ CONSTRAINT nome_restrio ]

produto_no integer, descricao text, preco numeric


CHECK (preco > 0)

{ NOT NULL |
NULL | UNIQUE [ USING INDEX TABLESPACE tablespace ] | PRIMARY KEY [ USING INDEX TABLESPACE tablespace ] | CHECK (expresso) | REFERENCES tabela_ref [ ( coluna_ref ) ] [ MATCH FULL
| MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE ao ] [ ON UPDATE ao ] }

);
Dando nome restrio check. Isso ajuda a tornar mais
amigveis as mensagens de erro e a poder referenciar de
uma consulta.
CREATE TABLE produtos (

produto_no integer, descricao text, preco numeric


[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY
CONSTRAINT preco_positivo CHECK (preco > 0)
DEFERRED | INITIALLY IMMEDIATE ]
);
e restrio_tabela :
CREATE TABLE produtos (
[ CONSTRAINT nome_restrio ]
produto_no integer, descricao text, desconto numeric
{ UNIQUE ( nome_coluna [, ... ] ) [ USING INDEX CHECK (desconto > 0 AND desconto < 0.10), preco nuTABLESPACE tablespace ] |
meric CONSTRAINT preco_positivo CHECK (preco >
PRIMARY KEY ( nome_coluna [, ... ] ) [ USING IN- 0), check (preco > desconto)
DEX TABLESPACE tablespace ] | CHECK ( expresso );
) | FOREIGN KEY ( nome_coluna [, ... ] ) REFERENCES tabela_ref [ ( coluna_ref [, ... ] ) ] [ MATCH Constraint NOT NULL
FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON Obrigar o preenchimento de um campo. Ideal para camDELETE ao ] [ ON UPDATE ao ] }
pos importantes que no devem car sem preenchimento.
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY Mas devemos ter em mente que at um espao em branco
atende a esta restrio.
DEFERRED | INITIALLY IMMEDIATE ]
Obs.: Ateno: nesta verso (8.1.3) WITH OID opcio- CREATE TABLE produtos (
nal. As tabelas so criadas sem OID.
cod_prod integer NOT NULL CHECK (cod_prod > 0),
nome text NOT NULL, preco numeric NOT NULL
\d visualizar tabelas e outros objetos
);
\d nometabela visualizar estrutura da tabela
campo1 integer,

Obs importante: nulos no so checados. UNIQUE no


aceita valores repetidos, mas aceita vrios nulos (j que
estes no so checados). Cuidado com NULLs.

campo2 text

Unique Constraint

);
Excluindo Tabela

Obrigar valores exclusivos para cada campo em todos os


registros

DROP TABLE primeira_tabela;

CREATE TABLE produtos (

Valor Default (padro) Para Campos

cod_prod integer UNIQUE, nome text, preco numeric

Ao denir um valor default para um campo, ao ser cadastrado o registro e este campo no for informado, o
valor default assumido. Caso no seja declarado explicitamente um valor default, o valor nulo (NULL) ser o
valor default.

);

CREATE TABLE tabela (

CREATE TABLE produtos (


cod_prod integer, nome text, preco numeric, UNIQUE
(cod_prod)

12CAPTULO 6. POSTGRESQL PRTICO/DDL/CRIAO E EXCLUSO DE BANCOS, ESQUEMAS, TABELAS, VIEWS, CONSTRAINTS


);
CREATE TABLE exemplo (

b integer,
c integer,
PRIMARY KEY (a, c)

a integer,
b integer,
c integer,
UNIQUE (a, c)

);
Chave Estrangeira (Foreign Key)
Criadas com o objetivo de relacionar duas tabelas,
mantendo a integridade referencial entre ambas. Especica que o valor da coluna (ou grupo de colunas) deve
);
corresponder a algum valor existente em um registro
CREATE TABLE produtos (
da outra tabela. Normalmente queremos que na tabela
estrangeira existam somente registros que tenham um
cod_prod integer CONSTRAINT unq_cod_prod UNI- registro relacionado na tabela principal. Como tambm
controla a remoo de registros na tabela principal que
QUE,
tenha registros relacionados na estrangeira.
nome text,
Tabela principal
preco numeric
);
Evitando duplicao com nulos:
create table teste(
id serial not null,
parent integer null,
component integer not null
);
postgres=# create unique index naoduplic on teste using
btree (component) where (parent is null);
Chaves Primrias (Primary Key)
A chave primria de uma tabela formada internamente
pela combinao das constraints UNIQUE e NOT
NULL. Uma tabela pode ter no mximo uma chave
primria. A teoria de bancos de dados relacional dita que
toda tabela deve ter uma chave primria. O PostgreSQL
no obriga que uma tabela tenha chave primria, mas
recomendvel, a no ser que esteja criando uma tabela
para importar de outra que contenha registros duplicados
para tratamento futuro ou algo parecido ou apenas para
testes.
CREATE TABLE produtos (
cod_prod integer UNIQUE NOT NULL,
nome text,
preco numeric

CREATE TABLE produtos (


cod_prod integer PRIMARY KEY,
nome text,
preco numeric
);
Tabela referenciada
CREATE TABLE pedidos (
cod_pedido integer PRIMARY KEY,
cod_prod integer,
quantidade integer,
CONSTRAINT
pedidos_fk
FOREIGN
KEY
(cod_prod) REFERENCES produtos (cod_prod)
);
CREATE TABLE t0 (
a integer PRIMARY KEY,
b integer,
c integer,
FOREIGN KEY (b, c) REFERENCES outra_tabela - a coluna de destino ser a PK

);
CREATE TABLE produtos (

);
CREATE TABLE t1 (

cod_prod integer PRIMARY KEY,


nome text,
preco numeric

a integer PRIMARY KEY,


b integer,
c integer,
FOREIGN KEY (b, c) REFERENCES outra_tabela
(c1, c2)

);
Composta (formada por mais de um campo)
CREATE TABLE exemplo (
a integer,

);

13
Obs.: O nmero de colunas e tipo na restrio devem ser blic.
semelhantes ao nmero e tipo das colunas referenciadas. Criando Um Esquema
Simulando ENUM no PostgreSQL
CREATE SCHEMA nomeesquema;
Excluindo Um Esquema
Para simular a constraint enum do MySQL, podemos DROP SCHEMA nomeesquema;
Aqui, quando o esquema tem tabelas em seu interior, no
usar a constraint check.
possvel apagar dessa forma, temos que utilizar:
Dica do site PostgreSQL & PHP Tutorials.
DROP SCHEMA nomeesquema CASCADE;
Que apaga o esquema e todas as suas tabelas, portanto
CREATE TABLE pessoa(
muito cuidado.
codigo int null primary key,
Obs.: O padro SQL exige que se especique RESTRICT
cor_favorita varchar(255) not null,
(default no PostgreSQL) OU CASCADE, mas nenhum
check (cor_favorita IN ('vermelha', 'verde', 'azul'))
SGBD segue esta recomendao.
);
Obs.: recomendado ser explcito quanto aos campos a
INSERT INTO pessoa (codigo, cor_favorita) values (1, serem retornados, ao invs de usar * para todos, entrar
com os nomes de todos os campos. Assim ca mais claro.
'vermelha'); -- OK
INSERT INTO pessoa (codigo, cor_favorita) values (1, Alm do mais a consulta ter um melhor desempenho.
'amarela'); -- Erro, amarelo no consta
Acessando Tabelas Em Esquemas
Herana
SELECT * FROM nomeesquema.nometabela;
Podemos criar uma tabela que herda todos os campos de
Privilgios Em Esquemas
outra tabela existente.
CREATE TABLE cidades (
\dp visualizar permisses
nome text,
REVOKE CREATE ON SCHEMA public FROM PUpopulacao oat,
BLIC; - - Remove o privilgio CREATE de todos os
altitude int -- (em ps)
usurios.
);
CREATE TABLE capitais (

Obtendo Informaes sobre os Esquemas:


\dn
\df current_schema*

estado char(2)

SELECT current_schema();
SELECT current_schemas(true);

) INHERITS (cidades);
capitais assim passa a ter tambm todos os campos da
tabela cidades.
Segundo uma entrevista (vide DBFree Magazine No. 2)
com a equipe de desenvolvimento do PostgreSQL, evite
utilizar herana de tabelas.
Esquemas (Schema)
\dn visualizar esquemas
Um banco de dados pode conter vrios esquemas e dentro de cada um desses podemos criar vrias tabelas. Ao
invs de criar vrios bancos de dados, criamos um e criamos esquemas dentro desse. Isso permite uma maior
exibilidade, pois uma nica conexo ao banco permite
acessar todos os esquemas e suas tabelas. Portanto devemos planejar bem para saber quantos bancos precisaremos, quantos esquemas em cada banco e quantas tabelas
em cada esquema.
Cada banco ao ser criado traz um esquema public, que
onde cam todas as tabelas, caso no seja criado outro
esquema. Este esquema public no padro ANSI. Caso
se pretenda ao portvel devemos excluir este esquema public e criar outros. Por default todos os usurios criados
tem privilgio CREATE e USAGE para o esquema pu-

SELECT current_schemas(false);
Vises (views)
\dp visualizar views e outros objetos
Que so VIEWS?
So uma maneira simples de executar e exibir dados selecionados de consultas complexas em bancos. Em que
elas so teis? Elas economizam grande quantidade de
digitao e esforo e apresentam somente os dados que
desejamos.
Criando Uma View
CREATE VIEW recent_shipments
AS
SELECT
count(*)
AS
num_shipped,
max(ship_date), title FROM shipments JOIN editions
USING (isbn) NATURAL JOIN books AS b (book_id)
GROUP BY b.title ORDER BY num_shipped DESC;
Usando Uma View
SELECT * FROM recent_shipments;
SELECT * FROM recent_shipments

14CAPTULO 6. POSTGRESQL PRTICO/DDL/CRIAO E EXCLUSO DE BANCOS, ESQUEMAS, TABELAS, VIEWS, CONSTRAINTS


ORDER BY max DESC LIMIT 3;
DROP VIEW nomeview;

consulta toda vez que for necessria, ento possvel criar


uma view baseada na consulta, atribuindo um nome a
esta consulta pelo qual ser possvel referenci-la como
se fosse uma tabela comum.

Criar as Tabelas que serviro de Base

CREATE VIEW minha_view AS

CREATE TABLE client (


clientid SERIAL NOT NULL PRIMARY KEY,

SELECT cidade, temp_min, temp_max, prcp, data, localizacao FROM clima, cidades WHERE cidade = nome;

clientname VARCHAR(255)

SELECT * FROM minha_visao;

);

Fazer livre uso de vises um aspecto chave de um bom


projeto de banco de dados SQL. As vises permitem encapsular, atrs de interfaces que no mudam, os detalhes
da estrutura das tabelas, que podem mudar na medida em
que as aplicaes evoluem.

Destruindo Uma View

CREATE TABLE clientcontact (


contactid SERIAL NOT NULL PRIMARY KEY,

clientid int CONSTRAINT client_contact_check REFEAs vises podem ser utilizadas em praticamente todos os
RENCES client(clientid),
lugares onde uma tabela real pode ser utilizada. Construir
name VARCHAR(255),
vises baseadas em vises no raro.
phone VARCHAR(255),
RULES
fax VARCHAR(255),
O comando CREATE RULE cria uma regra aplicada
emailaddress VARCHAR(255)
tabela ou viso especicada.
);
CREATE VIEW client_contact_list AS

Uma regra faz com que comandos adicionais sejam executados quando um determinado comando executado
em uma determinada tabela.

SELECT client.clientid, clientname, name, emailaddress


importante perceber que a regra , na realidade, um
FROM client, clientcontact
mecanismo de transformao de comando, ou uma macro
WHERE client.clientid = clientcontact.clientid;
de comando.
Estando no psql e digitando \d podemos visualizar tam- possvel criar a iluso de uma viso atualizvel debm as views.
nindo regras ON INSERT, ON UPDATE e ON DEO nome da viso deve ser distinto do nome de qualquer LETE, ou qualquer subconjunto destas que seja suciente
outra viso, tabela, seqncia ou ndice no mesmo es- para as nalidades desejadas, para substituir as aes de
quema. A viso no materializada sicamente. Em vez atualizao na viso por atualizaes apropriadas em oudisso, a consulta executada toda vez que a viso re- tras tabelas.
ferenciada em uma consulta. Fazer livre uso de vises Existe algo a ser lembrado quando se tenta utilizar regras
um aspecto chave de um bom projeto de banco de dados condicionais para atualizao de vises: obrigatrio haSQL.
ver uma regra incondicional INSTEAD para cada ao
As vises podem ser utilizadas em praticamente todos os que se deseja permitir na viso. Se a regra for condicilugares onde uma tabela real pode ser utilizada. Cons- onal, ou no for INSTEAD, ento o sistema continuar
truir vises baseadas em vises no raro. Atualmente, a rejeitar as tentativas de realizar a ao de atualizao,
as vises so somente para leitura: o sistema no permite porque acha que poder acabar tentando realizar a ao
insero, atualizao ou excluso em uma viso. poss- sobre a tabela ctcia da viso em alguns casos.
vel obter o efeito de uma viso atualizvel criando regras banco=# \h create rule
que reescrevem as inseres, etc. na viso como aes
apropriadas em outras tabelas. Para obter informaes Comando: CREATE RULE
adicionais consulte o comando CREATE RULE.
Descrio: dene uma nova regra de reescrita
CREATE VIEW vista AS SELECT 'Hello World';

Sintaxe:

ruim por dois motivos: o nome padro da coluna ?column?, e o tipo de dado padro da coluna unknown. Se
for desejado um literal cadeia de caracteres no resultado
da viso deve ser utilizado algo como CREATE VIEW
vista AS SELECT text 'Hello World' AS hello;

CREATE [ OR REPLACE ] RULE nome AS ON evento

Veja captulo 4 do Livro Pratical PostgreSQL

TO tabela [ WHERE condio ] DO [ ALSO | INSTEAD


] { NOTHING | comando | ( comando ; comando ... ) }
O comando CREATE RULE cria uma regra aplicada
tabela ou viso especicada.

evento
Supondo que uma consulta seja de particular interesse
para uma aplicao, mas que no se deseja digitar esta Evento um entre SELECT, INSERT, UPDATE e DE-

15
LETE.

\c testes

condio

postgres=# UPDATE pg_database SET datistemplate=false WHERE datname='template1';

Qualquer expresso condicional SQL (retornando boolean). A expresso condicional no pode fazer referncia testes=# DROP DATABASE template1;
a nenhuma tabela, exceto NEW e OLD, e no pode con- testes=# CREATE DATABASE template1 TEMPLATE
ter funes de agregao.
template0 ENCODING 'latin1';
INSTEAD
testes=# \c template1
INSTEAD indica que os comandos devem ser executados
template1=# VACUUM FULL FREEZE;
em vez dos (instead of) comandos originais.
template1=# VACUUM FULL;
ALSO
template1=# UPDATE pg_database SET datistemALSO indica que os comandos devem ser executados adi- plate=true WHERE datname='template1';
cionalmente aos comandos originais. Se no for especiAgora temos um template1 original e limpo.
cado nem ALSO nem INSTEAD, ALSO o padro.
comando
O comando ou comandos que compem a ao da regra.
Os comandos vlidos so SELECT, INSERT, UPDATE,
DELETE e NOTIFY.
Dentro da condio e do comando, os nomes especiais de
tabela NEW e OLD podem ser usados para fazer referncia aos valores na tabela referenciada. O NEW vlido
nas regras ON INSERT e ON UPDATE, para fazer referncia nova linha sendo inserida ou atualizada. O OLD
vlido nas regras ON UPDATE e ON DELETE, para
fazer referncia linha existente sendo atualizada ou excluda.
Obs.: necessrio possuir o privilgio RULE na tabela
para poder denir uma regra para a mesma.
Exemplos:
CREATE RULE me_notique AS ON UPDATE TO datas DO ALSO NOTIFY datas;
CREATE RULE r1 AS ON INSERT TO TBL1 DO
(INSERT INTO TBL2 VALUES (new.i); NOTIFY
TBL2);
CREATE RULE "_RETURN AS ON SELECT TO minha_viso DO INSTEAD
SELECT * FROM minha_tabela; -- Ao invs de selecionar da viso seleciona da tabela.
Banco de dados modelo intocado
Existe um modelo de banco de dados que sempre se preserva original, que o template0. O template template1
pode incorporar objetos e acaba algumas vezes cando
invivel seu uso como modelo. Quando isso acontece podemos substitui-lo com uma cpia do template0.
Criando banco de dados baseado em outro modelo
CREATE DATABSASE nomebanco TEMPLATE template0;
createdb -T template0 nomebanco
Recriando o template1

Captulo 7

PostgreSQL Prtico/DDL/Alteraes nos


objetos dos bancos
3.2 - Alteraes nos objetos dos bancos

TYPE tipo;

Adicionar campo, remover campo, adicionar constraint,


remover constraint, alterar valor default, alterar nome de
campo, alterar nome de tabela, alterar tipo de dado de
campo (>=8.0).

ALTER TABLE produtos ALTER COLUMN preco


TYPE numeric(10,2);

Adicionar Um Campo

Mudar Nome De Campo

ALTER TABLE produtos ALTER COLUMN data


TYPE DATE USING CAST (data AS DATE);

ALTER TABLE tabela ADD COLUMN campo tipo;

ALTER TABLE tabela RENAME COLUMN


ALTER TABLE produtos ADD COLUMN descricao campo_atual TO campo_novo;
text;
ALTER TABLE produtos RENAME COLUMN
Remover Campo
cod_prod TO cod_produto;
ALTER TABLE tabela DROP COLUMN campo;

Setar/Remover Valor Default de Campo

ALTER TABLE produtos DROP COLUMN descricao;

ALTER TABLE tabela ALTER COLUMN campo SET


ALTER TABLE produtos DROP COLUMN descricao DEFAULT valor;
CASCADE; -- Cuidado com CASCADE
ALTER TABLE produtos ALTER COLUMN cod_prod
SET DEFAULT 0;
Adicionar Constraint
ALTER TABLE produtos ALTER COLUMN preco
ALTER TABLE tabela ADD CONSTRAINT nome;
SET DEFAULT 7.77;
ALTER TABLE produtos ADD COLUMN descricao
ALTER TABLE tabela ALTER COLUMN campo
text CHECK (descricao <> );
DROP DEFAULT;
ALTER TABLE produtos ADD CHECK (nome <> );
ALTER TABLE produtos ALTER COLUMN preco
ALTER TABLE produtos ADD CONSTRAINT uni- DROP DEFAULT;
que_cod_prod UNIQUE (cod_prod);
Adicionar/Remover NOT NULL
ALTER TABLE produtos ADD FOREIGN KEY
ALTER TABLE produtos ALTER COLUMN cod_prod
(cod_produtos) REFERENCES grupo_produtos;
SET NOT NULL;
ALTER TABLE produtos ADD CONSTRAINT venALTER TABLE produtos ALTER COLUMN cod_prod
das_fk FOREIGN KEY (cod_produtos) REFERENCES
DROP NOT NULL;
produtos (codigo);
Renomear Tabela
Remover Constraint
ALTER TABLE tabela DROP CONSTRAINT nome;

ALTER TABLE tabela RENAME TO nomenovo;

ALTER TABLE produtos DROP CONSTRAINT pro- ALTER TABLE produtos RENAME TO equipamentos;
Adicionar Constraint (Restrio)
dutos_pk;
ALTERAR VALOR DEFAULT DE CAMPO:
Mudar Tipo de Dados de Campo (S >=8.0):

ALTER TABLE produtos ADD CONSTRAINT produtos_pk PRIMARY KEY (codigo);

ALTER TABLE tabela ALTER COLUMN campo ALTER TABLE vendas ADD CONSTRAINT vendas_fk FOREIGN KEY (codigo) REFERENCES produ16

17
tos(codigo_produto);
ALTER TABLE vendas ADD CONSTRAINT vendas_fk FOREIGN KEY (codigo) REFERENCES produtos; -- Neste caso usa a chave primria da tabela produtos
Remover Constraint (Restrio) ALTER TABLE produtos DROP CONSTRAINT produtos_pk;
ALTER TABLE vendas DROP CONSTRAINT vendas_fk;

Captulo 8

PostgreSQL Prtico/DDL/ndices, Tipos


de Dados e Integridade Referencial
3.3 - ndices, Tipos de Dados e Integridade Referencial

Criar um ndice:

importante conhecer bem o mximo de recursos existentes no banco, especialmente aqueles relacionados s
nossas necessidades. Assim trabalhamos com mais ecincia e criamos bancos mais leves e com mais potencial.
Os tipos de dados so fatores de desempenho.

CREATE INDEX nomeindice ON tabela (campo);

Exemplo:

Regra
geral
para
nome
idx_nometabela_nomecampo

de

ndice:

Obs.: ndices no importantes ou no utilizados devem


ser removidos.

Remover ndice:
Se um campo tipo inteiro ir precisar de valores at 100 e
nunca mudar esta faixa. No devemos usar este campo DROP INDEX nomeindice;
com o tipo INT8, quando o INT2 atende e sobra.
Criar um ndice nico:
De forma semelhante escolher todos os demais campos CREATE UNIQUE INDEX nomeindice ON tabela
da tabela com bom senso. Mais Detalhes no Captulo 8 (campo);
do Manual:
Obs.: Somente os ndices tipo B-tree podem ser do tipo
http://pgdocptbr.sourceforge.net/pg80/datatype.html
Unique.
ndices
Criar um ndice com vrias colunas:
Os ndices so recursos do SGBD para melhorar o desem- CREATE INDEX idx_clientes_ps ON clientes (codigo,
penho de consultas. Mas como o uso de ndices tambm nome);
tem um preo importante planejar bem e conhecer as
Boa indicao para consultas com WHERE...AND. Ao
particularidades antes de adicionar um ndice.
usar OR o ndice no ser utilizado pelo PostgreSQL:
Cada vez que um registro inserido ou atualizado a tabela
SELECT nome FROM clientes WHERE codigo = 12
de ndices tambm atualizada.
AND nome = 'Joo';
Quando criamos consultas SQL, que pesquisam tabelas com muitos registros e esta consulta usa a clusula Usar ndices com vrias colunas com moderao. ndices
WHERE, ento os campos que fazem parte da clusula com mais de 3 colunas tem grandes possibilidades de no
WHERE so bastante indicados para ndice, para que serem utilizados internamente.
melhore o desempenho da consulta.
Tipos de ndices
Os ndices so uma forma de melhorar o desempenho
de bancos de dados. Ao invs de procurar de forma sequencial, o servidor procura pelo ndice, como se faz uma
busca em ndices de livros e vai-se diretamente pgina
procurada.

O PostgreSQL suporta atualmente quatro tipos de ndices: B-tree (rvore B), R-tree (rvore R), Hash e GiST.
B-tree -> o tipo padro (assume quando no indicamos).
So ndices que podem tratar consultas de igualdade e de
faixa, em dados que podem ser classicados.

O ndice passado para cada registro adicionado ou reIndicado para consultas com os operadores: <, <=, =, >=,
movido.
>. Tambm pode ser utilizado com LIKE, ILIKE, ~ e ~*.
difcil criar regras genricas para determinar que ndiR-tree -> tipo mais adequado a dados espaciais. Adeces devem ser denidos. Muita experincia por parte do
quado para consultas com os operadores: <<, &<, &>,
administrador e muita vericao experimental neces>>, @, ~=, &&.
sria na maioria dos casos.

18

19
Hash ->indicados para consultas com comparaes de Isso num AMD Duron 1300, 128MB de RAM).
igualdade simples. desencorajado seu uso. Em seu lu- ndice Funcional
gar recomenda-se o B-tree. GiST ->
CREATE INDEX nomeindice ON tabela (lower (nomeCriando ndices de tipos diferentes:
campo));
CREATE INDEX nome ON tabela USING tipo timo artigo no iMasters
(campo);
http://www.imasters.com.br/artigo.php?cn=1897&cc=
tipo: BTREE, RTREE, HASH, GIST
23
Obs.: Somente os tipos B-tree e GiST suportam ndices
http://www.imasters.com.br/artigo.php?cn=1922&cc=
com vrias colunas. ndices com mais de um campo so- 23
mente ser utilizado se as clusulas com os campos indexados forem ligados por AND. Um ndice com mais de 3 http://www.imasters.com.br/artigo.php?cn=1959&cc=
23
campos dicilmente ser utilizado.
ndice Parcial

Vide manual ocial, captulo 11 para detalhes.

Criado apenas sobre um subconjunto dos registros de


uma tabela, denido numa expresso durante a criao
do ndice parcial. um recurso para melhorar o desempenho dos ndices, j que atualiza somente parte dos registros.

Boleanos
Representaes:
't', 'true', 'y', 'yes e '1'
FALSE

Obs.: na maioria dos casos a vantagem de um ndice par- Representaes:


cial sobre um ndice integral no muita.
'f', 'false', 'n', 'no', '0'
Exemplos:
Apenas um dos dois estados. O terceiro estado, descoExaminando a Utilizao dos ndices
nhecido, representado pelo NULL.
A vericao de uso de ndices deve ser feita com os comandos EXPLAIN e ANALYZE, sendo que o comando
ANALYZE sempre deve ser executado antes. O comando ANALYZE coleta estatsticas sobre a distribuio
dos valores na tabela. Devem ser utilizados dados reais e
o conjunto de dados de teste nunca deve ser pequeno.
Atentar para usar ndices nos campos das Clusulas
- FOREIGN KEY
- ORDER BY
- WHERE
- ON
- GROUP BY
- HAVING
Exemplos prtico da vantagem do ndice

Exemplo de consulta com boolean:


CREATE TABLE teste1 (a boolean, b text);
INSERT INTO teste1 VALUES (TRUE, 'sic est');
INSERT INTO teste1 VALUES (FALSE, 'non est');
SELECT * FROM teste1;
Retorno:
a|b
---+--------t | sic est f | non est
Alerta: a entrada pode ser: 1/0, t/f, true/false,
TRUE/FALSE, mas o retorno ser semp re t/f.
Obs.: Para campos tipo data que permitam NULL, devemos prever isso na consulta SQL e passar NULL sem
delimitadores e valores no NULL com delimitadores.

- Uma tabela contendo os CEPs do Brasil, com 633.401


Obs2: Evite o tipo MONEY que est em obsolescncia.
registros.
Em seu lugar use NUMERIC. Prera INT (INTEGER)
Esta tabela sem nenhum ndice executa a consulta abaixo:
em lugar de INT4, pois os primeiros so padro SQL. Em
\timing
geral evitar os nomes INT2, INT4 e INT8, que no so
SELECT * FROM cep_tabela WHERE cep = padro. O INT8 ou bigint no padro SQL. Em ndices
utilize somente INT, evitando smallint e bigint, que nunca
60420440;
sero utilizados.
Em 7691 ms
Tipos SQL Padro
- Ps adicionar um ndice:
bit, bit varying, boolean, char, character varying, characALTER TABLE cep_tabela ADD CONSTRAINT ter, varchar, date, double precision, integer, interval, nucep_pk PRIMARY KEY (cep);
meric, decimal, real, smallint, time (com ou sem zona
horria), timezone (com ou sem zona horria).
A mesma consulta anterior agora gasta apenas 10 ms.

20 CAPTULO 8. POSTGRESQL PRTICO/DDL/NDICES, TIPOS DE DADOS E INTEGRIDADE REFERENCIAL


O tipo NUMERIC pode realizar clculos exatos. Recomendado para quantias monetrias e outras quantidades
onde a exatido seja importante. Isso paga o preo de
queda de desempenho comparado aos inteiros e utuantes.

dos os valores longos, para no interferirem no acesso dos


valores curtos da coluna. O maior valor permitido para
uma cadeia de caracteres de 1GB. Para valores maiores usar TEXT ou VARCHAR sem especicar comprimento.

Pensando em portabilidade evita usar NUMERIC(12) e Tipos de Dados Array


usar NUMERIC (12,0).
Podemos ter campos com tipos de dados que no so simAlerta: A comparao de igualdade de dois valores de ples, mas arrays.
ponto utuante pode funcionar conforme o esperado ou CREATE TABLE salario (
no.
nome text, apgamento integer[], agendamento text[][]
O PostgreSQL trabalha com datas do calendrio Juliano.
Trabalha com a faixa de meio dia de Janeiro de 4713 AC );
(ano bisexto, domingo de lua nova) at uma data bem dis- CREATE TABLE tictactoe (
tante no futuro. Leva em conta que o ano tem 365,2425
quadrado integer[3][3]
dias.
);
SERIAL
No PostgreSQL um campo criado do tipo SERIAL Entrando os valores:
internamente uma seqncia, inteiro positivo.
'{{1,2,3},{4,5,6},{7,8,9}}'
Os principais SGBDs utilizam alguma variao deste
tipo de dados (auto-incremento). Serial o tipo autoincremento do PostgreSQL. Quando criamos um campo
do tipo SERIAL ao inserir um novo registro na tabela
com o comando INSERT omitimos o campo tipo SERIAL, pois ele ser inserido automaticamente pelo PostgreSQL.

INSERT INTO sal_emp


VALUES ('Bill', '{10000, 10000, 10000, 10000}',
'{{"meeting, lunch"}, {"meeting"}}');
ERROR: multidimensional arrays must have array expressions with matching dimensions

Precisa ter a mesma quantidade de elementos.


CREATE TABLE serial_teste (codigo SERIAL, nome INSERT INTO sal_emp
VARCHAR(45));
VALUES ('Bill', '{10000, 10000, 10000, 10000}',
INSERT INTO serial_teste (nome) VALUES ('Ribamar '{{"meeting, lunch"}, {"training, presentation"}}');
FS');
INSERT INTO sal_emp
Obs.:
A regra nomear uma seqncia seVALUES ('Carol', '{20000, 25000, 25000, 25000}',
rial_teste_codigo_seq,ou seja,
'{{"breakfast, consulting"}, {"meeting, lunch"}}');
tabela_campo_seq.
SELECT * FROM sal_emp;
select * from serial_teste_codigo_seq;
name | pay_by_quarter | schedule
Esta consulta acima retorna muitas informaes importantes sobre a seqncia criada: nome, valor inicial, in- +---------------------------+-----------------------------------cremento, valor nal, maior e menor valor alm de outras ------informaes.
Bill
|
{10000,10000,10000,10000}
|
{{meeting,lunch},{training,presentation}}
Carol
Veja que foi omitido o campo cdigo mas o PostgreSQL
|
{20000,25000,25000,25000}
|
{{breakir atribuir para o mesmo o valor do prximo registro de
cdigo. Por default o primeiro valor de um serial 1, fast,consulting},{meeting,lunch}}
mas se precisarmos comear com um valor diferente veja (2 rows)
a soluo abaixo:
O construtor ARRAY tambm pode ser usado:
Setando o Valor Inicial do Serial
INSERT INTO sal_emp
ALTER SEQUENCE tabela_campo_seq RESTART
VALUES ('Bill', ARRAY[10000, 10000, 10000,
WITH 1000;
10000], ARRAY[['meeting', 'lunch'], ['training', 'presenCHAR corresponde a CHAR(1).
tation']]);
VARCHAR corresponde a uma cadeia de tamanho sem INSERT INTO sal_emp
limites.
VALUES ('Carol', ARRAY[20000, 25000, 25000,
Diferena de Desempenho
25000], ARRAY[['breakfast', 'consulting'], ['meeting',
Internamente o PostgreSQL armazena em tabelas separa- 'lunch']]);

21
Acessando:
SELECT
name
FROM
sal_emp
pay_by_quarter[1] <> pay_by_quarter[2];

WHERE

SELECT pay_by_quarter[3] FROM sal_emp;


Faixa de valores- inferior:superior:
SELECT schedule[1:2][1:1] FROM sal_emp WHERE
name = 'Bill';
SELECT array_dims(ARRAY[1,2] || 3);
SELECT array_prepend(1, ARRAY[2,3]);
SELECT array_cat(ARRAY[1,2], ARRAY[3,4]);
SELECT 1 || ARRAY[2,3] AS array;
SELECT ARRAY[1,2] || ARRAY3,4 AS array;
SELECT f1[1][2][3] AS e1, f1[1][1][5] AS e2
FROM (SELECT '[1:1][2:1][3:5]={{{1,2,3},{4,5,6}}}'::int[]
AS f1) AS ss;

Captulo 9

PostgreSQL Prtico/DML
9.1 4 - DML (Data Manipulation
Language)
1. Consultas (select, insert, update e delete)
2. Consultas Join
3. Sub Consultas

22

Captulo 10

PostgreSQL Prtico/DML/Consultas
10.1 DML

lavra, createdb, por exemplo. J de dentro do psql, eles


normalmente so formados por duas palavras, como por
o conjunto de comandos SQL responsveis pela mani- exemplo,
pulao dos dados: inserir, consultar, atualizar e excluir. CREATE DATABASE.
Os comandos a seguir sero executados na linha de comando do SO. Supondo que o super-usurio seja postgres.

10.2 Consultas

Forma mais geral de uso:


Atente para que suas consultas sejam:

nome_comando opo -U nomeuser

- simples e claras

Criar um banco de dados:

- contenham somente campos estritamente necessrios

createdb controle_estoque -U postgres

- sejam otimizadas para o desempenho mximo

Visualizar o banco criado:


SQL (Structure Query Language) - uma linguagem depsql -l -U postgres
clarativa, onde voc diz ao computador o que deseja fazer
e deixa a mquina decidir a forma correta de chegar ao Excluir o banco criado:
resultado.
dropdb controle_estoque -U postgres
Para o primeiro contato com o PostgreSQL e para ter cer- Ajuda sobre os comandos:
teza de que o mesmo est corretamente instalado e congurado, podemos digitar na linha de comando do sistema nome_comando --help
operacional (como usurio do postgresql):
psql --version

Acessar o banco criado atravs do terminal interativo de


gerenciamento do PostgreSQL (psql):

psql -l

psql controle_estoque -U postgres

O psql o programa de gerenciamento e uso do Post- D:\Arquivos de programas\PostgreSQL\8.1\bin>psql


controle_estoque -U postgres
greSQL pelo usurio local.
Com ele podemos fazer praticamente tudo que se pode Bem vindo ao psql 8.1.3, o terminal iterativo do PostgreSQL.
fazer com o PG.
Alguns programas esto disponveis na linha de comando
do sistema operacional, permitindo criar e excluir bancos, criar e excluir usurios, entre outros. Os programas
a disponveis dependem da verso instalada, do sistema
operacional e da forma que foi instalado.
Quem instala atravs dos fontes (sources) tem um subdiretrio chamado contrib, onde esto os demais programas desenvolvidos pela comunidade de programadores
do PG. Neste caso para instalar um destes programas execute make; make install estando no respectivo diretrio.
Um exemplo o pgbench.

Digite: \copyright para mostrar termos de distribuio


\h para ajuda com comandos SQL \? para ajuda com comandos do psql \g ou terminar com ponto-e-vrgula para
executar a consulta \q para sair
controle_estoque=#
Este o prompt do psql. Veja que j nos recebe com
boas vindas e com dicas de como podemos a qualquer
momento receber ajuda. Especialmente atente para os
comandos:
\h - para receber ajuda sobre comandos SQL. \h comando
- ajuda sobre um comando

Os comandos via linha de comandos do SO, normalmente


terminam com db e so formados com apenas uma pa- \? - ajuda sobre os comandos de operao do terminal
23

24

CAPTULO 10. POSTGRESQL PRTICO/DML/CONSULTAS

psql

ASC o default

Item_de pode ser um dos:


- o comando para indicar ao PG que execute nossa
[ ONLY ] nome_tabela [ * ] [ [ AS ] alias [ ( alias_coluna
seqncia de comandos
[, ...] ) ] ] ( select ) [ AS ] alias [ ( alias_coluna [,
...] ) ] nome_funo ( [ argumento [, ...] ] ) [ AS
\q - para sair do psql
] alias [ ( alias_coluna [, ...] | denio_coluna [, ...] )
Obs.: Aceita quebras de linha para uma seqncia de co- ] nome_funo ( [ argumento [, ...] ] ) AS ( denimandos.
o_coluna [, ...] ) item_de [ NATURAL ] tipo_juno
Mesmo que possamos utilizar ferramentas grcas ou item_de [ ON condio_juno | USING ( coluna_juno
Web para gerenciar o PG, altamente recomendado que [, ...] ) ]
nos familiarizemos com a sintaxe dos comandos para entender como os comandos so executados internamente
e ter maior domnio sobre o PG. Depois dessa fase, os
que resistem aos encantos do psql :) podem usar uma das
citadas ferramentas.

Sintaxe resumida:
SELECT * FROM tabela; -- retorna todos os registros da
tabela com todos os campos
A lista_de_campos o retorno da consulta.

Vamos executar alguns comandos do psql e algumas pe- Exemplos:


quenas consultas para carmos mais vontade.
1) SELECT siape AS Matricula do Servidor FROM
pessoal;
\l -- lista bancos, donos e codicao
\d -- descreve tabela, ndice, seqncia ou view (viso)
\du -- lista usurios e permisses
\dg -- lista grupos

2) SELECT
coes.lotacao

pessoal.siape,

pessoal.senha,

loca-

FROM pessoal, lotacoes WHERE pessoal.siape = lotacoes.siape ORDER BY lotacoes.lotacao;

\dp -- lista privilgios de acesso tabelas, views (vises)


DISTINCT Escrita logo aps SELECT desconsidera os
e sequncias
registros duplicados, retornando apenas registros exclusipsql controle_estoque -U postgres
vos.
controle_estoque=# SELECT version();

SELECT DISTINCT email FROM clientes;

version PostgreSQL 8.1.3 on i686-pc-mingw32, compi- ALL o contrrio de DISTINCT e o padro, retornando
led by GCC gcc.exe (GCC) 3.4.2 (mingw-special)
todos os registros, duplicados ou no.
Para distinguir convencionou-se que as palavras chave do Ao fazer uma consulta, um registro ser considerado igual
SQL sejam escritas em maisculas, mas podem ser escri- a outro se pelo menos um campo for diferente. E os todos
tas em minsculas sem problema para o interpretador de os valores NULL sero considerados iguais.
comandos.
CLUSULA WHERE - Filtra o retorno de consultas.
SELECT 25*4;
Operadores aceitos: =, >, <, <>, !=, >=, <=
SELECT current_date;
SELECT nome FROM clientes WHERE email = 'ri4.1 - Consultas Bsicas em SQL
bafs@ribafs.org';
SELECT selecionar registros de tabelas

SELECT nome FROM clientes WHERE idade > 18;

banco=# \h select -- da ajuda via psql

SELECT nome FROM clientes WHERE idade < 21;

Comando: SELECT

SELECT nome FROM clientes WHERE idade >= 18;

Descrio: recupera (retorna) registros de uma tabela ou SELECT nome FROM clientes WHERE idade <= 21;
viso (view)
SELECT nome FROM clientes WHERE UPSintaxe:
PER(estado) != 'CE';
SELECT [ ALL | DISTINCT [ ON ( expresso [, ...] ) ] SELECT nome FROM clientes WHERE email = 'ri]
bafs@ribafs.org';
* | expresso [ AS nome_sada ] [, ...] [ FROM item_de [,
...] ] [ WHERE condio ] [ GROUP BY expresso [, ...]
] [ HAVING condio [, ...] ] [ { UNION | INTERSECT
| EXCEPT } [ ALL ] select ] [ ORDER BY expresso [
ASC | DESC | USING operador ] [, ...] ] [ LIMIT {
contador | ALL } ] [ OFFSET incio ] [ FOR { UPDATE
| SHARE } [ OF nome_tabela [, ...] ] [ NOWAIT ] ]

BETWEEN, LIKE, OR, AND, NOT, EXISTS, IS


NULL, IS NOT NULL, IN
SELECT nome FROM clientes WHERE idade
BETWEEN 18 and 45;
SELECT nome FROM clientes WHERE email LIKE
'%@gmail.com';

10.2. CONSULTAS

25

SELECT nome FROM clientes WHERE idade >18 21 Exemplos:


OR idade < 21; -- entre 18 e 21
ORDER BY cliente; -- pelo cliente e ascendente
SELECT nome FROM clientes WHERE idade >= 18
ORDER BY cliente DESC; -- descendente
AND UPPER(estado) = 'CE';
ORDER BY cliente, quantidade; -- pelo cliente e sub orSELECT nome FROM clientes WHERE idade NOT denado pela quantidade
BETWEEN 18 AND 21;
ORDER BY cliente DESC, quant ASC;
SELECT * FROM datas WHERE EXISTS(SELECT *
No exemplo ordenando por dois campos:
FROM datas2 WHERE datas.data = datas2.data);
SELECT nome FROM clientes WHERE estado IS SELECT * FROM pedidos ORDER BY cliente, quantidade; A sada caria algo como:
NULL;
SELECT nome FROM clientes WHERE estado IS NOT Antnio 1
NULL;
Antnio 2
SELECT nome FROM clientes WHERE estado IN ('CE', Joo - 1
'RN');
Pedro - 1
GROUP BY - Geralmente utilizada com funes de agrupamento (de agregao), como tambm com HAVING. Pedro - 2
Agrupa o resultado dos dados por um ou mais campos de INSERT Inserir registros em tabelas.
uma tabela. Utilizado para agrupar registros (linhas) da
banco=# \h insert
tabela que compartilham os mesmos valores em todas as
Comando: INSERT
colunas (campos) da lista.
Exemplos:

Descrio: insere novos registros em uma tabela

SELECT SUM(horas) FROM empregados; -- Traz a Sintaxe:


soma das horas de todos os empregados
INSERT INTO tabela [ ( lista_de_campos ) ]
SELECT empregado, SUM(horas) FROM empregados { DEFAULT VALUES | VALUES ( { expresso | DEGROUP BY empregado; -- Traz a soma das horas de FAULT } [, ...] ) | consulta }
cada empregado. Veja que empregado deve aparecer
em GROUP BY, j que os campos de retorno diferen- DEFAULT - Se ao criar a tabela denirmos campos com
tes do usado na funo de agrupamento devem vir no valor default, ao inserir registros e omitir o valor para estes campos, o servidor os cadastrar com o valor default.
GROUP BY.
Dica: Quando se utiliza uma funo de agrupamento num Exemplo (forma completa):
campo da lista do SELECT, os demais campos da lista Na tabela o campo idade tem valor default 18.
devero ser agrupados. Exemplo:
INSERT INTO clientes (codigo, nome, idade) VALUES
SELECT codigo, nome, count(valor) FROM vendas (1, Ribamar FS);
GROUP BY codigo, nome.
Neste exemplo ser cadastrado para a idade o valor 18.
Exemplo:
Forma Abreviada:
SELECT c.nome, COUNT(p.quant) AS quantos
INSERT INTO clientes VALUES (1, Ribamar FS);
FROM clientes c, pedidos p
No recomendada, por no ser clara nem adequada para
WHERE c.codigo = p.cod_cliente
trabalho em grupo. Caso utilizemos esta forma somos
obrigados a inserir os campos na ordem original em que
GROUP BY (p.cod_cliente);
esto na tabela.
HAVING - Filtra o retorno de GROUP BY. No altera o
Inserindo com SubConsulta:
resultado,apenas ltra.
INSERT INTO clientes (codigo, nome, idade) VALUES
Exemplo:
SELECT cliente, SUM(quant) AS total
FROM pedidos GROUP BY cliente
HAVING total > 50; -- ou HAVING SUM(quant) > 50;

(SELECT fnome, dade FROM funcionarios WHERE


cli = 'S');
SELECT rstname, lastname, city, state INTO newfriend
FROM friend;

ORDER BY - Ordena o resultado da consulta por um UPDATE - Atualizar registros de tabelas


ou mais campos em ordem ascendente (ASC, default) ou
banco=# \h update
descendente (DESC).

26

CAPTULO 10. POSTGRESQL PRTICO/DML/CONSULTAS

Comando: UPDATE
Descrio: atualiza registros de uma tabela
Sintaxe:
UPDATE [ ONLY ] tabela SET coluna = { expresso |
DEFAULT } [, ...]
[ FROM lista_de ] [ WHERE condio ]
Exemplos:
UPDATE clientes SET idade = idade + 1; -- Todos os
registros de clientes sero atualizados
UPDATE pedidos SET quant = quant + 3
WHERE cliente IN (SELECT codigo FROM clientes
WHERE idade > 18);
DELETE - Remover registros de tabelas
banco=# \h delete
Comando: DELETE
Descrio: apaga registros de uma tabela
Sintaxe:
DELETE FROM [ ONLY ] tabela
[ USING lista_util ] [ WHERE condio ]
Exemplos:
DELETE FROM pedidos; -- Cuidado, excluir todos os
registros da tabela pedidos
DELETE FROM pedidos WHERE (codigo IS NULL); - Remove sem conrmao nem com opo de desfazer.

10.3 Trabalhando
com select

corretamente

Bom artigo do DeCo no PHPAvancado


http://www.phpavancado.net/node/165

Captulo 11

PostgreSQL Prtico/DML/Consultas Join


11.1 4.2 - Junes de Tabelas ou
Consultas

somente seus registros que tenham correspondentes aos


da tabela da esquerda.
Para os registros da direita que no tenham correspondentes na esquerda sero colocados valores NULL.

As junes SQL so utilizadas quando precisamos seleExemplo (voltar todos somente de pessoal):
cionar dados de duas ou mais tabelas.
SELECT p.siape, p.nome, l.lotacao FROM pessoal p
Existem as junes com estilo non-ANSI ou theta (juno
LEFT JOIN lotacoes l ON p.siape = l.siape ORDER BY
com WHERE).
p.siape;
E as junes ANSI join (com JOIN). As junes ANSI
Veja que pessoal ca esquerda em FROM pessoal p
podem ser de dois tipos, as INNER JOINS e as OUTER
LEFT JOIN lotacoes l.
JOINS. A padro a INNER JOIN. INNER JOIN pode
RIGHT OUTER JOIN
ser escrito com apenas JOIN.
Inverso do LEFT, este retorna todos os registros somente
da tabela da direita (right). Primeiro, realizada uma
SELECT p.siape, p.senha, l.lotacao FROM pessoal p
juno interna. Depois, para cada linha de T2 que no
CROSS JOIN lotacoes l;
satisfaz a condio de juno com nenhuma linha de T1,
Tipos de Junes
adicionada uma linha juntada com valores nulos nas coINNER JOIN - Onde todos os registros que satisfazem lunas de T1. o oposto da juno esquerda: a tabela resultante possui, incondicionalmente, uma linha para cada
condio sero retornados.
linha de T2.
Exemplo:
Exemplo (retornar somente os registros de lotacoes):
SELECT p.siape, p.nome, l.lotacao FROM pessoal p INNER JOIN lotacoes l ON p.siape = l.siape ORDER BY SELECT p.siape, p.nome, l.lotacao FROM pessoal p
RIGHT JOIN lotacoes l ON p.siape = l.siape ORDER
p.siape;
BY p.nome;
Exemplo no estilo theta:
FULL OUTER JOIN
SELECT p.siape, p.nome, l.lotacao FROM pessoal p, lotacoes l WHERE p.siape = l.siape ORDER BY p.siape; Primeiro, realizada uma juno interna. Depois, para
cada linha de T1 que no satisfaz a condio de juno
OUTER JOIN que se divide em LEFT OUTER JOIN e com nenhuma linha de T2, adicionada uma linha junRIGHT OUTER JOIN
tada com valores nulos nas colunas de T2. Tambm, para
LEFT OUTER JOIN ou simplesmente LEFT JOIN - So- cada linha de T2 que no satisfaz a condio de juno
mente os registros da tabela da esquerda (left) sero re- com nenhuma linha de T1, adicionada uma linha juntornados, tendo ou no registros relacionados na tabela tada com valores nulos nas colunas de T1.
da direita.
E tambm as:
Primeiro, realizada uma juno interna. Depois, para CROSS JOIN e SELF JOIN (para si mesmo).
cada linha de T1 que no satisfaz a condio de juno
com nenhuma linha de T2, adicionada uma linha jun- Vide item 7.2.1.1 do manualocial para mais detalhes e
tada com valores nulos nas colunas de T2. Portanto, a ta- exemplos.
bela juntada possui, incondicionalmente, no mnimo uma LIMIT
linha para cada linha de T1.
LIMIT (limite) juntamente com OFFSET (deslocaA tabela esquerda do operador de juno exibir cada mento) permite dizer quantas linhas desejamos retornar
um dos seus registros, enquanto que a da direita exibir
Exemplo ANSI:

27

28

CAPTULO 11. POSTGRESQL PRTICO/DML/CONSULTAS JOIN

da consulta. Podemos retornar desde apenas uma at to- com uma expresso booleana. O escopo das expresses
das.
na clusula ON inclui as tabelas correntes, e as tabelas
nos blocos de consulta externos ao SELECT corrente. No
Sintaxe:
exemplo a seguir, a clusula ON faz referncia s tabelas
SELECT lista_de_campos FROM expresso [LIMIT { correntes:
nmero | ALL }] [OFFSET inicio]
SELECT * FROM SAMP.EMPREGADOS INLIMIT ALL mesmo que imitir LIMIT.
NER JOIN SAMP.EQUIPES ON EMPREGAOFFSET inicio orienta para que a consulta retorne so- DOS.SAL?RIO < EQUIPES.SAL?RIO;
mente a partir de inicio.
A clusula ON pode fazer referncia a tabelas que no
esto sendo juntadas, e no obrigada a fazer referncia a
OFFSET 0 mesmo que omitir OFFSET.
nenhuma das tabelas sendo juntadas (embora tipicamente
LIMIT 50 OFFSET 11 Dever trazer 50 registros do o faa).
11 at o 60, caso existam.
-- Juno das tabelas ATIV_EMP e EMPREGADOS
Obs.: Quando se utiliza LIMIT importante utilizar a -- selecionar todas as colunas da tabela ATIV_EMP
clusula ORDER BY para estabelecer uma ordem nica e -- adicionar o sobrenome do empregado (Lpara as linhas do resultado. Caso contrrio, ser retor- TIMO_NOME) da tabela -- EMPREGADOS a todas
nado um subconjunto imprevisvel de linhas da consulta; as linhas do resultado SELECT SAMP.ATIV_EMP.*,
pode-se desejar obter da dcima a vigsima linha, mas da LTIMO_NOME FROM SAMP.ATIV_EMP JOIN
dcima a vigsima de qual ordem? A ordem desconhe- SAMP.EMPREGADO ON ATIV_EMP.NUM_EMP
cida a no ser que seja especicado ORDER BY. Isto = EMPREGADOS.NUM_EMP; -- Juntar as tabelas
uma conseqncia inerente ao fato do SQL no prometer EMPREGADOS e DEPARTAMENTOS, -- selecionar
retornar os resultados de uma consulta em qualquer or- o nmero do empregado (NUM_EMP), -- o sobrenome
dem especca, a no ser que ORDER BY seja utilizado do empregado (LTIMO_NOME), -- o nmero do
para impor esta ordem.
departamento (DEP_TRAB na tabela EMPREGADOS
e -- NUM_DEP na tabela DEPARTAMENTOS) -- e o
Exemplos:
nome do departamento (NOME_DEP) -- de todos os
SELECT id, name FROM products ORDER BY name
empregados nascidos (DATA_NASC) antes de 1930.
LIMIT 20 OFFSET 1;
SELECT NUM_EMP, LTIMO_NOME, DEP_TRAB,
Ir retornar os registros do 1 at o 20.
NOME_DEP FROM SAMP.EMPREGADOS JOIN
SELECT * FROM news_m LIMIT $inicio, SAMP.DEPARTAMENTOS ON DEP_TRAB =
NUM_DEP AND YEAR(DATA_NASC) < 1930; -$n_resultados
Outro exemplo de gerar novos valores de dado, -- utiliO comando SELECT * FROM news_m LIMIT zando uma consulta que seleciona da clusula VALUES
$n_resultados OFFSET $inicio
-- (que uma forma alternativa de FULLSELECT). SEir pesquisar as noticias da tabela news_m comeando LECT * FROM (VALUES (3, 4), (1, 5), (2, 6)) AS TABELA1_VALORES(C1, C2) JOIN (VALUES (3, 2), (1,
do resultado "$inicio e ir listar "$n_resultados.
2),(0, 3)) AS TABELA2_VALORES(C1, C2) ON TAExemplo: SELECT * FROM news_m LIMIT 3 OFF- BELA1_VALORES.C1 = TABELA2_VALORES.C1;
SET 2 ir exibir 3 notcias a partir da 2a. notcia da tabela, ou seja, ir exibir as notcias 2, 3 e 4 da nossa tabela O que resulta em:
news_m.
C1 |C2 |C1 |2 ---------------------------------------------- 3 |4 |3 |2 1 |5 |1 |2 -- Listar todos os departamentos, juntamente com o -- nmero do empregado
e o ltimo nome do gerente SELECT NUM_DEP,
11.2 INNER JOIN
NOME_DEP, NUM_EMP, LTIMO_NOME FROM
Denio e exemplos no site db.apache.org e muitas ou- DEPARTAMENTOS INNER JOIN EMPREGADOS
ON NUM_GER = NUM_EMP; -- Listar todos os ntras boas informaes sobre SQL:
meros do empregado e ltimo nome, juntamente -http://db.apache.org/derby/docs/dev/pt_BR/ref/
com o nmero do empregado e ltimo nome de seus
rrefsqlj35034.html
gerentes SELECT E.NUM_EMP, E.LTIMO_NOME,
INNER JOIN (juno interna) uma Operao JOIN que M.NUM_EMP, M.LTIMO_NOME FROM EMPREGADOS E INNER JOIN DEPARTAMENTOS INpermite especicar uma clusula de juno explcita.
NER JOIN EMPREGADOS M ON NUM_GER =
Sintaxe
M.NUM_EMP ON E.DEP_TRAB = NUM_DEP;
ExpressoTabela [ INNER ] JOIN ExpressoTabela {
ON ExpressoBooleana }
A clusula de juno pode ser especicada utilizando ON

11.5. RIGHT OUTER JOIN

11.3 Operao JOIN


As operaes de juno (JOIN), que esto entre as ExpressesTabela possveis na ClusulaFROM, realizam
junes entre duas tabelas (Tambm pode ser realizada a
juno entre duas tabelas utilizando um teste de igualdade
explcito na clusula WHERE, como WHERE t1.col1 =
t2.col2.) Sintaxe
Operao de juno
As operaes de juno so:
INNER JOIN: Especica a juno entre duas tabelas com uma clusula de juno explcita. Consulte
INNER JOIN.
LEFT OUTER JOIN: Especica a juno entre
duas tabelas com uma clusula de juno explcita,
preservando as linhas sem correspondncia da primeira tabela. Consulte LEFT OUTER JOIN.
RIGHT OUTER JOIN: Especica a juno entre
duas tabelas com uma clusula de juno explcita,
preservando as linhas sem correspondncia da segunda tabela. Consulte RIGHT OUTER JOIN.

29
REGIO = '?sia'; -- Juno das tabelas EMPREGADOS e DEPARTAMENTOS, -- selecionar
o nmero do empregado (NUM_EMP), -- o sobrenome do empregado (LTIMO_NOME), -- o
nmero do departamento (DEP_TRAB na tabela
EMPREGADOS e -- NUM_DEP na tabela DEPARTAMENTOS) -- e o nome do departamento
(NOME_DEP) -- de todos os empregados nascidos
(DATA_NASC) antes de 1930 SELECT NUM_EMP,
LTIMO_NOME,
DEP_TRAB,
NOME_DEP
FROM SAMP.EMPREGADOS LEFT OUTER
JOIN SAMP.DEPARTAMENTOS ON DEP_TRAB
= NUM_DEP AND YEAR(DATA_NASC) < 1930;
-- Listar todos os departamentos, juntamente com
o -- nmero do empregado e o ltimo nome do gerente, -- incluindo os departamentos sem gerente
SELECT NUM_DEP, NOME_DEP, NUM_EMP,
LTIMO_NOME FROM DEPARTAMENTOS LEFT
OUTER JOIN EMPREGADOS ON NUM_GER =
NUM_EMP;

11.5 RIGHT OUTER JOIN

RIGHT OUTER JOIN uma Operao JOIN que perEm todos os casos podem ser especicadas restries adi- mite especicar a clusula de juno. Preserva as licionais para uma ou mais tabelas sendo juntadas nas clu- nhas sem correspondncia da segunda tabela (direita),
juntando-as com uma linha nula na forma da primeira
sulas de juno externa, ou na Clusula WHERE
tabela (esquerda). (A LEFT OUTER JOIN B) equivalente a (B RIGHT OUTER JOIN A), com as colunas em
uma ordem diferente.

11.4 LEFT OUTER JOIN

LEFT OUTER JOIN uma Operao JOIN que permite


especicar a clusula de juno. Preserva as linhas sem
correspondncia da primeira tabela (esquerda), juntandoas com uma linha nula na forma da segunda tabela (direita).

Sintaxe
ExpressoTabela RIGHT [ OUTER ] JOIN ExpressoTabela { ON ExpressoBooleana }

O escopo das expresses na clusula ON inclui as tabelas


correntes, e as tabelas nos blocos de consulta externos ao
SELECT corrente. A clusula ON pode fazer referncia
a tabelas que no esto sendo juntadas, e no obrigada
Sintaxe
a fazer referncia a nenhuma das tabelas sendo juntadas
ExpressoTabela LEFT [ OUTER ] JOIN ExpressoTa(embora tipicamente o faa).
bela { ON ExpressoBooleana }
-- obter todos os pases e cidades correspondenO escopo das expresses na clusula ON inclui as tabelas tes, -- incluindo os pases sem nenhuma cidade
correntes, e as tabelas nos blocos de consulta externos ao SELECT
NOME_CIDADE,
CIDADES.PA?S
SELECT corrente. A clusula ON pode fazer referncia FROM
CIDADES
RIGHT
OUTER
JOIN
a tabelas que no esto sendo juntadas, e no obrigada PA?SES ON CIDADES.COD_ISO_PA?S =
a fazer referncia a nenhuma das tabelas sendo juntadas PA?SES.COD_ISO_PA?S; -- obter todos pases
(embora tipicamente o faa).
da ?frica e as cidades correspondentes, -- incluindo
--correspondncia entre cidades e pases SE- os pases sem cidades SELECT NOME_CIDADE,
LECT
CIDADES.PA?S,
REGIO
FROM CIDADES.PA?S FROM CIDADES RIGHT OUTER
PA?SES LEFT OUTER JOIN CIDADES ON JOIN PA?SES ON CIDADES.COD_ISO_PA?S
ID_CIDADE=ID_CIDADE WHERE REGIO = =
PA?SES.COD_ISO_PA?S;
WHERE
'?sia'; -- uso da sintaxe sinnimo, LEFT JOIN, PA?SES.REGIO = '?frica'; -- uso da sinpara obter exatamente -- os mesmos resultados taxe sinnimo, RIGHT JOIN, para obter exada exemplo acima SELECT CIDADES.PA?S, tamente -- os mesmos resultados do exemREGIO FROM PA?SES LEFT JOIN CIDA- plo acima SELECT NOME_CIDADE, CIDADES ON ID_CIDADE=ID_CIDADE WHERE DES.PA?S FROM CIDADES RIGHT JOIN

30

CAPTULO 11. POSTGRESQL PRTICO/DML/CONSULTAS JOIN

PA?SES
ON
CIDADES.COD_ISO_PA?S
=
PA?SES.COD_ISO_PA?S
WHERE
PA?SES.REGIO = '?frica'; -- a ExpressoTabela
pode ser uma OperaoJuno. Portanto, -- podem
haver vrias operaes de juno na clusula FROM -Listar todos os nmeros e ltimo nome dos empregados,
-- juntamente com os nmeros e ltimo nome de seus
gerentes SELECT E.NUM_EMP, E.LTIMO_NOME,
M.NUM_EMP, M.LTIMO_NOME FROM EMPREGADOS E RIGHT OUTER JOIN DEPARTAMENTOS RIGHT OUTER JOIN EMPREGADOS M ON
NUM_GER = M.NUM_EMP ON E.DEP_TRAB =
NUM_DEP;

Captulo 12

PostgreSQL Prtico/DML/Sub Consultas


12.1 4.3 Sub consultas

NOT IN
ANY/SOME

SELECT nome, CASE WHEN nome = ANY (SELECT


nome FROM frutas) THEN 'sim' ELSE 'no' END AS
Subconsulta escalar um comando SELECT comum, en- fruta FROM alimentos;
tre parnteses, que retorna exatamente um registro, com CASE WHEN
um campo.
EXEMPLO1
SELECT nome, (SELECT MAX(preco) FROM produtos WHERE codigo=1) AS maior preo FROM create table amigos( codigo serial primary key, nome
produtos; SELECT * FROM tabela1 WHERE ta- char(45), idade int );
bela1.col1 = (SELECT col2 FROM tabela2 WHERE insert into amigos (nome, idade) values ('Joo Brito', 25);
col2 = valor); SELECT name FROM customer WHERE insert into amigos (nome, idade) values ('Roberto', 35);
customer_id NOT IN ( SELECT customer_id FROM insert into amigos (nome, idade) values ('Antnio', 15);
salesorder ); SELECT 'test' AS test, id FROM (SELECT insert into amigos (nome, idade) values ('Francisco Quei* FROM books) AS example_sub_query; SELECT roz', 23); insert into amigos (nome, idade) values ('Berrstname, state, CASE WHEN state = 'PA' THEN 'close' nardo dos Santos, 21); insert into amigos (nome, idade)
WHEN state = 'NJ' OR state = 'MD' THEN 'far' ELSE values ('Francisca Pinto', 22); insert into amigos (nome,
'very far' END AS distance FROM friend;
idade) values ('Natanael', 55);
So consultas dentro de consultas.

Expresses de Sub Consultas

select nome, idade, case when idade >= 21 then 'Adulto'


else 'Menor' end as status from amigos order by nome;

EXISTS

-- CASE WHEN cria uma coluna apenas para exibio

SELECT campo1 FROM tabela1 WHERE EXISTS EXEMPLO2


(SELECT 1 FROM tabela2 WHERE campo2 = tacreate table amigos( codigo serial primary key, nome
bela1.campo2);
char(45), estado char(2) );
Combinando CASE e EXISTS
insert into amigos (nome, estado) values ('Joo Brito',
CREATE TEMPORARY TABLE frutas (id SERIAL 'CE'); insert into amigos (nome, estado) values ('RoPRIMARY KEY, nome TEXT); INSERT INTO frutas berto', 'MA'); insert into amigos (nome, estado) values
VALUES (DEFAULT, 'banana'); INSERT INTO frutas ('Antnio', 'CE'); insert into amigos (nome, estado) vaVALUES (DEFAULT, 'ma');
lues ('Francisco Queiroz', 'PB'); insert into amigos (nome,
CREATE TEMPORARY TABLE alimentos (id SE- estado) values ('Bernardo dos Santos, 'MA'); insert into
RIAL PRIMARY KEY, nome TEXT); INSERT INTO amigos (nome, estado) values ('Francisca Pinto', 'SP'); inalimentos VALUES (DEFAULT, 'ma'); INSERT sert into amigos (nome, estado) values ('Natanael', 'SP');
INTO alimentos VALUES (DEFAULT, 'espinafre');

select nome, estado, case when estado = 'PB' then 'FeSELECT nome, CASE WHEN EXISTS (SELECT nome chado' when estado = 'CE' or estado = 'SP' then 'FunciFROM frutas WHERE nome=a.nome) THEN 'sim' onando' when estado = 'MA' then 'Funcionando a todo
vapor' else 'Menor' end as status from amigos order by
ELSE 'no' END AS fruta FROM alimentos a;
nome;
IN
Mostrar cada nota junto com a menor nota, a maior nota,
SELECT nome, CASE WHEN nome IN (SELECT nome e a mdia de todas as notas.
FROM frutas) THEN 'sim' ELSE 'no' END AS fruta
SELECT nota, (SELECT MIN(nota) FROM notas) AS
FROM alimentos;
31

32

CAPTULO 12. POSTGRESQL PRTICO/DML/SUB CONSULTAS

menor, (SELECT MAX(nota) FROM notas) AS maior,


(ROUND(SELECT AVG(nota) FROM notas)) AS media FROM notas;

Captulo 13

PostgreSQL Prtico/Funes Internas


13.1 5 - Funes Internas
1. Strings
2. Matemticas
3. Agrupamento (Agregao)
4. Data e Hora
5. Formatao de Tipos de Dados
6. Converso de Tipos (CAST)

33

Captulo 14

PostgreSQL Prtico/Funes
Internas/Strings
14.1 5.1 Funes de Strings

SELECT TRANSLATE(string, velho, novo);

Concatenao de Strings - dois || (pipes)

SELECT TRANSLATE('Brasil', 'il', 'o'); - - Retorna


Braso

SELECT 'ae' || 'io' || 'u' AS vogais; --vogais -------- aeiou

SELECT TRANSLATE('Brasileiro', 'eiro', 'eira');

SELECT CHR(67)||CHR(65)||CHR(84) AS Dog"; -- Remover Espaos de Strings


Dog CAT
SELECT TRIM(' SQL - PADRO ');
Quantidade de Caracteres de String

Calcular MD5 de String

char_length - retorna o nmero de caracteres


SELECT CHAR_LENGTH('UNIFOR'); - -Retorna 6

SELECT
MD5('ribafs);
53cd5b2af18063bea8ddc804b21341d1

Ou SELECT LENGTH('Database'); - - Retorna 8

Repetir uma string n vezes

Converter para minsculas

SELECT REPEAT('SQL-', 3); - - Retorna SQL-SQLSQL-

SELECT LOWER('UNIFOR');
Converter para maisculas
SELECT UPPER('universidade');

Retorna

Sobrescrever substring em string


SELECT REPLACE ('Postgresql', 'sql', 'SQL'); - - Retorna PostgreSQL

Posio de caractere

Dividir Cadeia de Caracteres com Delimitador


SELECT POSITION ('@' IN 'ribafs@gmail.com'); -- SELECT SPLIT_PART( 'PostgreSQL', 'gre', 2); - Retorna 7
Retorna SQL
Ou SELECT STRPOS('Ribamar' ,'mar'); - - Retorna 5
SELECT SPLIT_PART( 'PostgreSQL', 'gre', 1); - Retorna Post
Substring
SUBSTRING(string [FROM inteiro] [FOR inteiro])

<------gre----->

SELECT SUBSTRING ('Ribamar FS' FROM 9 FOR Iniciais Maisculas


10); - - Retorna FS
INITCAP(text) - INITCAP ('ol mundo') - - Ol Mundo
SUBSTRING(string FROM padro);
Remover Espaos em Branco
SELECT SUBSTRING ('PostgreSQL' FROM '.......'); - - TRIM ([leading | trailing | both] [characters] from string)Retorna Postgre
remove caracteres da direita e da esquerda. trim (both 'b'
SELECT SUBSTRING ('PostgreSQL' FROM '...$'); - - from 'babacatebbbb'); - - abacate
Retorna SQL
RTRIM (string text, chars text) - Remove os caracteres
Primeiros ....... e ltimos ...$

chars da direita (default espao)

Ou

rtrim('removarrrr', 'r') - - remova

SUBSTR ( 'string', inicio, quantidade);

LTRIM - (string text, chars text) - Remove os caracteres


chars da esquerda

SELECT SUBSTR ('Ribamar', 4, 3); - - Retorna mar


Substituir todos os caracteres semelhantes

ltrim('abssssremova', 'abs) - - remova

34

14.1. 5.1 FUNES DE STRINGS

35

Detalhes no item 9.4 do Manual:

'abc' ~ 'abc' -- TRUE

http://pgdocptbr.sourceforge.net/pg80/functions-string.
html

'abc' ~ '^a' -- TRUE

Like e %

'abc' ~ '^(b|c)' -- FALSE

SELECT * FROM FRIENDS WHERE LASTNAME


LIKE 'M%';
O ILIKE case INsensitive e o LIKE case sensitive.
~~ equivale ao LIKE
~~* equivale equivale ao ILIKE
!~~ equivale ao NOT LIKE !~~* equivale equivale ao
NOT ILIKE
... LIKE '[4-6]_6%' -- Pegar o primeiro sendo de 4 a 6,
-- o segundo qualquer dgito,
-- o terceiro sendo 6 e os demais quaisquer
% similar a *
_ similar a ? (de arquivos no DOS)
Correspondncia com um Padro
O PostgreSQL disponibiliza trs abordagens distintas
para correspondncia com padro: o operador LIKE tradicional do SQL; o operador mais recente SIMILAR TO
(adicionado ao SQL:1999); e as expresses regulares no
estilo POSIX. Alm disso, tambm est disponvel a funo de correspondncia com padro substring, que utiliza
expresses regulares tanto no estilo SIMILAR TO quanto
no estilo POSIX.
SELECT substring('XY1234Z', 'Y*([0-9]{1,3})'); - Resultado: 123
SELECT substring('XY1234Z', 'Y*?([0-9]{1,3})'); - Resultado: 1
SIMILAR TO
O operador SIMILAR TO retorna verdade ou falso conforme o padro corresponda ou no cadeia de caracteres
fornecida. Este operador muito semelhante ao LIKE,
exceto por interpretar o padro utilizando a denio de
expresso regular do padro SQL.
'abc' SIMILAR TO 'abc' verdade
'abc' SIMILAR TO 'a' falso
'abc' SIMILAR TO '%(b|d)%' verdade
'abc' SIMILAR TO '(b|c)%' falso
SELECT 'abc' SIMILAR TO '%(b|d)%'; -- Procura b ou
d em 'abc' e no caso retorna TRUE
REGEXP
SELECT 'abc' ~ '.*ab.*';
~ distingue a de A
~* no distingue a de A !~ distingue expresses distingue
a de A !~* distingue expresses no distingue a de A

'abc' ~ '(b|j)' -- TRUE

Captulo 15

PostgreSQL Prtico/Funes
Internas/Matemticas
15.1 5.2 Funes Matemticas

a NOT BETWEEN x AND y


expresso IS NULL

Operadores Matemticos

expresso IS NOT NULL

expresso IS TRUE
+, -, *, /, % (mdulo, resto de diviso de inteiros), ^(poexpresso IS NOT TRUE
tncia), !(fatorial), @(valor absoluto)
| / - rais quadrada ( | / 25.0 = 5) | | / - raiz cbica ( | | / 27.0 expresso IS FALSE
= 3)

expresso IS NOT FALSE

Algumas funes Matemticas

expresso IS UNKNOWN

ABS(x) - valor absoluto de x

expresso IS NOT UNKNOWN

CEIL(numeric) - arredonda para o prximo inteiro supe- OPERADOR NULL


rior
Em SQL NULL para valores inexistentes. Regra geral:
DEGREES(valor) - converte valor de radianos para graus NULL se propaga, o que signica que com quem NULL
FLOOR(numeric) - arredonda para o prximo inteiro in- se combina o resultado ser um NULL. NULL no zero,
no string vazia nem string de comprimento zero.
ferior
MOD(x,y) - resto da diviso de x por y
PI() - constante PI (3,1415...)
POWER(x,y) - x elevado a y

Um exemplo: num cadastro de alunos, para o aluno que


ainda no se conhece a nota, no correto usar zero para
sua nota, mas sim NULL. No se pode efetuar clculos
de expresses onde um dos elementos NULL.

RADIANS(valor) - converte valor de graus para radianos COMPARANDO NULLs


RANDOM() - valor aleatrio entre 0 e 1

NOT NULL com NULL -- Unknown

ROUND(numeric) - arredonda para o inteiro mais pr- NULL com NULL -- Unknown
ximo
CONVERSO DE/PARA NULL
ROUND(v, d) - arredonda v com d casas decimais
NULLIF() e COALESCE()
SIGN(numeric) - retorna o sinal da entrada, como 1 ou NULLIF(valor1, valor2)
+1
NULLIF Retorna NULL se, e somente se, valor1 e vaSQRT(X) - Raiz quadrada de X
lor2 forem iguais, caso contrrio retorna valor1.
TRUNC (numeric) - trunca para o nenhuma casa decimal Algo como:
TRUNC (v numeric, s int) - trunca para s casas decimais if (valor1 == valor2){
Operadores Lgicos:
then NULL
AND, OR e NOT. TRUE, FALSE e NULL

else valor1;

Operadores de Comparao:

Retorna valor1 somente quando valor1 == valor2.

<, >, <=, >=, =, <> ou !=

COALESCE retorna o primeiro de seus argumentos


que no for NULL. S retorna NULL quando todos os

a BETWEEN x AND y

36

15.2. NULL OU NO NULL, EIS A QUESTO!


seus argumentos forem NULL.
Uso: mudar o valor padro cujo valor seja NULL.
create table nulos(nulo int, nulo2 int, nulo3 int);
insert into nulos values (1,null,null);
select coalesce(nulo, nulo2, nulo3) from nulos; - - Retorna
1, valor do campo nulo;
select coalesce(nulo2, nulo3) from nulos; - - Retorna
NULL, pois ambos so NULL.
GREATEST - Retorna o maior valor de uma lista - SELECT GREATEST(1,4,6,8,2); - - 8
LEAST - Retorna o menor valor de uma lista.
Todos os valores da lista devem ser do mesmo tipo e nulos
so ignorados.
Obs.: Ambas as funes acima no pertencem ao SQL
standard, mas so uma extenso do PostgreSQL.
CONCATENANDO NULLs
A regra : NULL se propaga. Qualquer que concatene
com NULL gerar NULL.
STRING || NULL -- NULL
Usos:
- Como valor default para campos que futuramente recebero valor.
- Valor default para campos que podero ser sempre inexistentes.

15.2 NULL ou no NULL, eis a


questo!
Bom artigo do Luiz Paulo de Oliveira Santos no Dicas-L
http://www.dicas-l.com.br/freedb/freedb_20060926.
php

37

Captulo 16

PostgreSQL Prtico/Funes
Internas/Agrupamento
16.1 5.3 Funes de Agrupamento (Agregao)

SELECT MIN(campo) AS Valor Mnimo FROM tabela;


Caso tenha problema com esta consulta use:

SELECT campo FROM tabela ORDER BY campo ASC


As funes de agrupamento so usadas para contar o n- LIMIT 1; -- trar o menor
mero de registros de uma tabela.
SELECT MAX(campo) AS Valor Mximo FROM tabela;
avg(expresso)
count(*)

Caso tenha problema com esta consulta use:

count(expresso)

SELECT campo FROM tabela ORDER BY campo


DESC LIMIT 1; -- trar o maior

max(expresso)
min(expresso)
stddev(expresso)
sum(expresso)
variance(expresso)
Onde expresso, pode ser ALL expresso ou DISTINCT expresso.
count(distinct expresso)
As funes de Agrupamento (agregao) no podem ser
utilizadas na clusula WHERE. Devem ser utilizadas entre o SELECT e o FROM. Num SELECT que usa uma
funo agregada, as demais colunas devem fazer parte da
clusula GROUP BY. Somente podem aparecer aps o
SELECT ou na clusula HAVING. De uso proibido nas
demais clusulas.
Obs.: Ao contar os registros de uma tabela com a funo COUNT(campo) e esse campo for nulo em alguns
registros, estes registros no sero computados, por isso
cuidado com os nulos tambm nas funes de agregao.
A clusula HAVING normalmente vem precedida de uma
clusula GROUP BY e obrigatoriamente contm funes
de agregao.
ALERTA: Retornam somente os registros onde o campo
pesquisado seja diferente de NULL.
NaN - Not a Number (No um nmero)
UPDATE tabela SET campo1 = 'NaN';

38

Captulo 17

PostgreSQL Prtico/Funes
Internas/Data e Hora
17.1 5.4 Funes de Data/Hora

'27 DAYS' AS Data;


Funo now (retorna timestamp with zone)
now() - Data e hora corrente (timestamp with zone);

Operaes com datas:

timestamp '2001-09-28 01:00' + interval '23 hours -> ti- No usar em campos somente timestamp.
mestamp '2001-09-29 00:00'
Funo date_part (retorna double)
date '2001-09-28' + interval '1 hour' -> timestamp '2001- SELECT date_part('day', TIMESTAMP '2001-02-16
09-28 01:00'
20:38:40');
date '01/01/2006' date '31/01/2006'

Resultado: 16 (day uma string, diferente de extract)

time '01:00' + interval '3 hourstime -> '04:00'

Obtendo o dia da data atual:

interval '2 hours - time '05:00' -> time '03:00:00'


Funo age (retorna Interval) - Diferena entre datas

SELECT
DATE_PART('DAY',
RENT_TIMESTAMP) AS dia;

age(timestamp)interval (Subtrai de hoje)

Obtendo o ms da data atual:

age(timestamp '1957-06-13') -> 43 years 8 mons 3 days

SELECT
DATE_PART('MONTH',
RENT_TIMESTAMP) AS mes;

CUR-

CUR-

age(timestamp, timestamp)interval Subtrai os argumenObtendo o ano da data atual:


tos

DATE_PART('YEAR',
age('2001-04-10', timestamp '1957-06-13') -> 43 years 9 SELECT
RENT_TIMESTAMP) AS ano;
mons 27 days

CUR-

Funo extract (retorna double) Extrai parte da data: Funo date_trunc (retorna timestamp)
ano, ms, dia, hora, minuto, segundo.
SELECT date_trunc('year', TIMESTAMP '2001-02-16
select extract(year from age('2001-04-10', timestamp 20:38:40');
'1957-06-13'))
Retorna 2001-02-16 00:00:00
select extract(month from age('2001-04-10', timestamp Convertendo (CAST)
'1957-06-13'))
select to_date('1983-07-18', 'YYYY-MM-DD')
select extract(day from age('2001-04-10', timestamp
select to_date('19830718', 'YYYYMMDD')
'1957-06-13'))
Funo timeofday (retorna texto)
Data e Hora atuais (retornam data ou hora)
select timeofday() -> Fri Feb 24 10:07:32.000126 2006
BRT

SELECT CURRENT_DATE;
SELECT CURRENT_TIME;

Interval

SELECT CURRENT_TIME(0);

interval [ (p) ]

SELECT CURRENT_TIMESTAMP;

to_char(interval '15h 2m 12s, 'HH24:MI:SS')

SELECT CURRENT_TIMESTAMP(0);

date '2001-09-28' + interval '1 hour'

Somar dias e horas a uma data:


SELECT CAST('06/04/2006' AS DATE) + INTERVAL

interval '1 day' + interval '1 hour'

39

40

CAPTULO 17. POSTGRESQL PRTICO/FUNES INTERNAS/DATA E HORA

interval '1 day' - interval '1 hour'


900 * interval '1 second'
Interval trabalha com as unidades: second, minute, hour,
day, week, month, year, decade, century, millenium ou
abreviaturas ou plurais destas unidades.
Se informado sem unidades '13 10:38:14' ser devidamente interpretado '13 days 10 hours 38 minutes 14 seconds.
CURRENTE_DATE - INTERVAL '1' day;
TO_TIMESTAMP('2006-01-05 17:56:03',
MM-DD HH24:MI:SS')

'YYYY-

Tipos Geomtricos:
CREATE TABLE geometricos(ponto POINT, segmento
LSEG, retangulo BOX, poligono POLYGON, circulo
CIRCLE);
ponto (0,0),
segmento de (0,0) at (0,1),
retngulo (base inferior (0,0) at (1,0) e base superior
(0,1) at (1,1)) e
crculo com centro em (1,1) e raio 1.
INSERT
INTO
geometricos
VALUES
('(0,0)','((0,0),(0,1))',
'((0,0),(0,1))',
'((0,0),(0,1),(1,1),(1,0))','((1,1),1)');
Tipos de Dados para Rede:
Para tratar especicamente de redes o PostgreSQL tem
os tipos de dados cidr, inet e macaddr.
cidr para redes IPV4 e IPV6
inet para redes e hosts IPV4 e IPV6
macaddr endereos MAC de placas de rede
Assim como tipos data, tipos de rede devem ser preferidos ao invs de usar tipos texto para guardar IPs, Mscaras ou endereos MAC.
Veja um exemplo em ndices Parciais e a documentao
ocial para mais detalhes.

Captulo 18

PostgreSQL Prtico/Funes
Internas/Formatao de Tipos de Dados
18.1 5.5 - Formatao de Tipos de
Dados
TO_CHAR - Esta funo deve ser evitada, pois est prevista sua descontinuao.
TO_DATE
date TO_DATE(text, text); Recebe dois parmetros text
e retorna date.
Um dos parmetros a data e o outro o formato.
SELECT TO_DATE('29032006','DDMMYYYY'); Retorna 2006-03-29
TO_TIMESTAMP
tmt TO_TIMESTAMP(text,text) - Recebe dois text e retorna timestamp with zone
SELECT
TO_TIMESTAMP('29032006
14:23:05','DDMMYYYY HH:MI:SS'); - Retorna
2006-03-29 14:23:05+00
TO_NUMBER
numeric TO_NUMBER(text,text)
SELECT TO_NUMBER('12,454.8-', '99G999D9S');
Retorna 12454.8
SELECT TO_NUMBER('12,454.8-', '99G999D9'); Retorna 12454.8
SELECT TO_NUMBER('12,454.8-', '99999D9'); Retorna 12454
Detalhes no item 9.8 do manual.

41

Captulo 19

PostgreSQL Prtico/Funes
Internas/Converso de Tipos
19.1 5.6 - Converso Explcita de
Tipos (CAST)

SELECT VERSION();
SELECT CURRENT_SETTING('DATESTYLE');
SELECT HAS_TABLE_PRIVILEGE('usuario','tabela','privilegio');

CAST ( expresso AS tipo ) AS apelido; -- Sintaxe SQL SELECT HAS_TABLE_PRIVILEGE('postgres,'nulos,'insert');


- - Retorna: t
ANSI
Outra forma:
Tipo ( expresso );
Exemplo:

SELECT HAS_DATABASE_PRIVILEGE('postgres,'testes,'create');
- - Retorna: t
SELECT HAS_SCHEMA_PRIVILEGE('postgres,'public','create');
- - Retorna: t

SELECT DATE '10/05/2002' - DATE '10/05/2001'; -SELECT relname FROM pg_class WHERE
Retorna a quantidade de dias - -entre as duas datas
pg_table_is_visible(oid);
Para este tipo de converso devemos:
Arrays
Usar oat8 ao invs de double precision;
SELECT
ARRAY[1.1,2.2,3.3]::INT[]
=
ARUsar entre aspas alguns tipos como interval, time e times- RAY[1,2,3];
tamp
SELECT ARRAY[1,2,3] = ARRAY[1,2,8];
Obs.: aplicaes portveis devem evitar esta forma de
SELECT ARRAY[1,3,5] || ARRAY[2,4,6];
converso e em seu lugar usar o CAST explicitamente.
SELECT 0 || ARRAY[2,4,6];
A funo CAST() utilizada para converter explicitaArray de char com 48 posies e cada uma com 2:
mente tipos de dados em outros.
SELECT CAST(2 AS double precision) ^ CAST(3 AS campo char(2) [48]
double precision) AS exp";
Funes Geomtricos
SELECT ~ CAST('20' AS int8) AS negativo"; - Retorna area(objeto) - - area(box '((0,0), (1,1))');
21
center(objeto) - - center(box '((0,0), (1,2))');
SELECT round(CAST (4 AS numeric), 4); - Retorna
diameter(circulo double) - - diameter(circle '((0,0), 2.0)');
4.0000
height(box) - - height(box '((0,0), (1,1))');
SELECT substr(CAST (1234 AS text), 3);
SELECT 1 AS real UNION SELECT CAST('2.2' AS length(objeto) - - length(path '((1,0), (1,0))');
REAL);
radius(circle) - - radius(circle '((0,0), 2.0)');
Funes Diversas

width(box) - - width(box '((0,0), (1,1))');

SELECT CURRENT_DATABASE();

Funes para Redes

SELECT CURRENT_SCHEMA();

Funes cidr e inet

SELECT CURRENT_SCHEMA(boolean);

host(inet) - - host('192.168.1.5/24') - - 192.168.1.5

SELECT CURRENT_USER;

masklen(inet) - - masklen('192.168.1.5/24') - - 24

SELECT SESSION_USER;
42

19.1. 5.6 - CONVERSO EXPLCITA DE TIPOS (CAST)

43

netmask(inet) 255.255.255.0

netmask('192.168.1.5/24')

- pg_read_le(arquivo text, oset bigint, tamanho bigint)

network(inet) 192.168.1.0/24

network('192.168.1.5/24')

pg_stat_le(arquivo text)

Funo macaddr
trunt(macaddr) - - trunc(maraddr '12:34:34:56:78:90:ab')
- - 12:34:56:00:00:00
Funes de Informao do Sistema
current_database()
current_schema()
current_schemas(boolean)
current_user()
inet_client_addr()
inet_client_port()
inet_server_addr()
inet_server_port()
pg_postmaster_start_time()
version()
has_table_privilege(user, table, privilege) - d privilgio
ao user na tabela
has_table_privilege(table, privilege) - d privilgio ao
usurio atual na tabela
has_database_privilege(user, database, privilege) - d
privilgio ao user no banco
has_function_privilege(user, function, privilege) - d privilgio ao user na funo
has_language_privilege(user, language, privilege) - d
privilgio ao user na linguagem
has_schema_privilege(user, schema, privilege) - d privilgio ao user no esquema
has_tablespace_privilege(user, tablespace, privilege) - d
privilgio ao user no tablespace
current_setting(nome) - valor atual da congurao
set_cong(nome, novovalor, is_local) - seta parmetro de
retorna novo valor
pg_start_backup(label text)
pg_stop_backup()
pg_column_size(qualquer)
pg_tablespace_size(nome)
pg_database_size(nome)
pg_relation_size(nome)
pg_total_relation_size(nome)
pg_size_pretty(bigint)
pg_ls_dir(diretorio)

Captulo 20

PostgreSQL Prtico/Funes Denidas


pelo Usurio e Triggers
20.1 6 - Funes Denidas pelo
Usurio e Triggers
1. SQL
2. PlpgSQL
3. Triggers

44

Captulo 21

PostgreSQL Prtico/Funes Denidas


pelo Usurio e Triggers/SQL
21.1 6 - Funes no PostgreSQL

Feito isso teremos 5 arquivos .sql.


O syscat.sql traz consultas sobre o catlogo de sistema, o que se chama de metadados (metadata).

O PostgreSQL oferece quatro tipos de funes:


Funes escritas em SQL

O basic.sql e o advanced.sql so consultas SQL.

Funes em linguagens de procedimento


(PL/pgSQL, PL/Tcl, PL/php, PL/Java, etc)

O complex.sql trata da criao de um tipo de dados


pelo usurio e seu uso.

Funes internas (rount(), now(), max(), count(),


etc).

O func.sql traz algumas funes em SQL e outras


em C.

Funes na linguagem C

6.1 Funes em SQL

CREATE [ OR REPLACE ] FUNCTION name ( [ [


argmode ] [ argname ] argtype [, ...] ] ) [ RETURNS
rettype ] { LANGUAGE langname | IMMUTABLE |
STABLE | VOLATILE | CALLED ON NULL INPUT
| RETURNS NULL ON NULL INPUT | STRICT | [
EXTERNAL ] SECURITY INVOKER | [ EXTERNAL
] SECURITY DEFINER | AS 'denition' | AS 'obj_le',
'link_symbol' } ... [ WITH ( attribute [, ...] ) ]

O que outros SGBDs chamam de stored procedures o


PostgreSQL chama de funes, que podem ser em diversas linguagens.
CREATE OR REPLACE FUNCTION olamundo()
RETURNS int4 AS 'SELECT 1' LANGUAGE 'sql';
SELECT olamundo() ; CREATE OR REPLACE
FUNCTION add_numeros(nr1 int4, nr2 int4) RETURNS int4 AS 'SELECT $1 + $2' LANGUAGE 'sql';
SELECT add_numeros(300, 700) AS resposta ;

Para reforar a segurana interessante usar o parmetro


SECURITY DEFINER, que especica que a funo ser Podemos passar como parmetro o nome de uma tabela:
executada com os privilgios do usurio que a criou.
CREATE TEMP TABLE empregados ( nome
text,
salario
NUMERIC,
idade
INTEGER,
SECURITY INVOKER indica que a funo deve baia point ); INSERT INTO empregados VAser executada com os privilgios do usurio que a LUES('Joo',2200,21,point('(1,1)')); INSERT INTO
chamou (padro).
empregados
VALUES('Jos',4200,30,point('(2,1)'));
CREATE
FUNCTION
dobrar_salario(empregados)
SECURITY DEFINER especica que a funo deve
RETURNS
NUMERIC
AS
$$ SELECT $1.salario *
ser executada com os privilgios do usurio que a
2
AS
salario;
$$
LANGUAGE
SQL; SELECT nome,
criou.
dobrar_salario(emp.*) AS sonho FROM empregados
Uma grande fora do PostgreSQL que ele permite a WHERE empregados.baia ~= point '(2,1)';
criao de funes pelo usurio em diversas linguagens:
SQL, PlpgSQL, TCL, Perl, Phyton, Ruby.
Algumas vezes prtico gerar o valor do argumento comPara ter exemplos a disposio vamos instalar os do dire- posto em tempo de execuo. Isto pode ser feito atravs
da construo ROW.
trio tutorial dos fontes do PostgreSQL:
Acessar /usr/local/src/postgresql-8.1.3/src/tutorial e
executar: make install

SELECT nome, dobrar_salario(ROW(nome, salario*1.1, idade, baia)) AS sonho FROM empregados;

45

46

CAPTULO 21. POSTGRESQL PRTICO/FUNES DEFINIDAS PELO USURIO E TRIGGERS/SQL

Funo que retorna um tipo composto. Funo que retorna uma nica linha da tabela empregados:
Mais detalhes no captulo 31 do manual.
CREATE FUNCTION novo_empregado() RETURNS
empregados AS $$ SELECT text 'Nenhum' AS nome,
1000.0 AS salario, 25 AS idade, point '(2,2)' AS baia; $$
LANGUAGE SQL;
Ou
CREATE
OR
REPLACE
FUNCTION
novo_empregado() RETURNS empregados AS $$
SELECT ROW('Nenhum', 1000.0, 25, '(2,2)')::empregados; $$ LANGUAGE SQL;
Chamar assim:
SELECT novo_empregado();
ou
SELECT * FROM novo_empregado();
Funes SQL como fontes de tabelas
CREATE TEMP TABLE teste (testeid INT, testesubid
INT, testename text); INSERT INTO teste VALUES
(1, 1, 'Joo'); INSERT INTO teste VALUES (1, 2,
'Jos'); INSERT INTO teste VALUES (2, 1, 'Maria');
CREATE FUNCTION getteste(INT) RETURNS teste
AS $$ SELECT * FROM teste WHERE testeid = $1;
$$ LANGUAGE SQL; SELECT *, UPPER(testename)
FROM getteste(1) AS t1;
Tabelas Temporrias - criar tabelas temporrias (TEMP),
faz com que o servidor se encarregue de remov-la (o que
faz logo que a conexo seja encerrada).
CREATE TEMP TABLE nometabela (campo tipo);
Funes SQL retornando conjunto
CREATE FUNCTION getteste(INT) RETURNS SETOF teste AS $$ SELECT * FROM teste WHERE
testeid = $1; $$ LANGUAGE SQL; SELECT * FROM
getteste(1) AS t1;
Funes SQL polimrcas
As funes SQL podem ser declaradas como recebendo e
retornando os tipos polimrcos anyelement e anyarray.
CREATE FUNCTION constroi_matriz(anyelement,
anyelement) RETURNS anyarray AS $$ SELECT
ARRAY[$1, $2]; $$ LANGUAGE SQL; SELECT constroi_matriz(1, 2) AS intarray, constroi_matriz('a'::text, 'b') AS textarray; CREATE
FUNCTION eh_maior(anyelement, anyelement) RETURNS BOOLEAN AS $$ SELECT $1 > $2; $$
LANGUAGE SQL; SELECT eh_maior(1, 2);

Captulo 22

PostgreSQL Prtico/Funes Denidas


pelo Usurio e Triggers/PlpgSQL
22.1 6.2 - Funes em Pl/pgSQL

nar_campos_selecionados(in_t
nome_da_tabela)
RETURNS text AS $$ BEGIN RETURN in_t.f1 ||
in_t.f3 || in_t.f5 || in_t.f7; END; $$ LANGUAGE
As funes em linguagens procedurais no PostgreSQL, plpgsql;
como a Pl/pgSQL so correspondentes ao que se chama
comumente de Stored Procedures. Por default o PostExemplo para somar 3 Valores
greSQL s traz suporte s funes na linguagem SQL.
Para dar suporte funes em outras linguagens temos CREATE FUNCTION somar_tres_valores(v1 anyelement, v2 anyelement, v3 anyelement) RETURNS
que efetuar procedimentos como a seguir.
anyelement AS $$ DECLARE resultado ALIAS FOR
Para que o banco postgres tenha suporte linguagem
$0; BEGIN resultado := v1 + v2 + v3; RETURN
de procedimento Pl/PgSQL executamos na linha de coresultado; END; $$ LANGUAGE plpgsql; SELECT
mando como super usurio do PostgreSQL:
somar_tres_valores(10,20,30);
createlang plpgsql U nomeuser nomebanco no prompt
ou create language plpgsql por SQL.
Utilizao de tipo composto:
PGSQL 8.4
CREATE
FUNCTION
mesclar_campos(t_linha
createlang -U nomeuser -W -e plpgsql nomebanco
nome_da_tabela) RETURNS text AS $$ DECLARE
A Pl/pgSQL a linguagem de procedimentos armaze- t2_linha nome_tabela2%ROWTYPE; BEGIN SELECT
nados mais utilizada no PostgreSQL, devido ser a mais * INTO t2_linha FROM nome_tabela2 WHERE ...
; RETURN t_linha.f1 || t2_linha.f3 || t_linha.f5 ||
madura e com mais recursos.
t2_linha.f7; END; $$ LANGUAGE plpgsql; SELECT
//Cdigo-fonte CREATE FUNCTION func_escopo() mesclar_campos(t.*) FROM nome_da_tabela t WHERE
RETURNS INTEGER AS $$ DECLARE quantidade ... ;
INTEGER := 30; BEGIN RAISE NOTICE 'Aqui a
quantidade %', quantidade; -- A quantidade aqui 30
quantidade := 50; -- -- Criar um sub-bloco -- DECLARE Temos uma tabela (datas) com dois campos (data e hora)
quantidade INTEGER := 80; BEGIN RAISE NOTICE e queremos usar uma funo para manipular os dados
'Aqui a quantidade %', quantidade; -- A quantidade desta tabela:
aqui 80 END; RAISE NOTICE 'Aqui a quantidade CREATE OR REPLACE FUNCTION data_ctl(opcao
%', quantidade; -- A quantidade aqui 50 RETURN CHAR, fdata DATE, fhora TIME) RETURNS
quantidade; END; $$ LANGUAGE plpgsql; => SE- CHAR(10) AS $$ DECLARE opcao ALIAS FOR
LECT func_escopo();
$1; vdata ALIAS FOR $2; vhora ALIAS FOR $3; retorno CHAR(10); BEGIN IF opcao = 'I' THEN INSERT
CREATE FUNCTION instr(VARCHAR, INTEGER) INTO datas (DATA, hora) VALUES (vdata, vhora);
RETURNS INTEGER AS $$ DECLARE v_string retorno := 'INSERT'; END IF; IF opcao = 'U' THEN UPALIAS FOR $1; INDEX ALIAS FOR $2; BEGIN -- al- DATE datas SET DATA = vdata, hora = vhora WHERE
gum processamento neste ponto END; $$ LANGUAGE DATA='1995-11-01'; retorno := 'UPDATE'; END IF;
IF opcao = 'D' THEN DELETE FROM datas WHERE
plpgsql;
DATA = vdata; retorno := 'DELETE'; ELSE retorno :=
'NENHUMA'; END IF; RETURN retorno; END; $$
Exemplo concatenar campos.
LANGUAGE plpgsql; --select data_ctl('I','1996-11-01',
CREATE
FUNCTION
concate- '08:15'); SELECT data_ctl('U','1997-11-01','06:36');
47

48

CAPTULO 22. POSTGRESQL PRTICO/FUNES DEFINIDAS PELO USURIO E TRIGGERS/PLPGSQL

SELECT data_ctl('U','1997-11-01','06:36');
Mais Detalhes no captulo 35 do manual ocial.
Funes que Retornam Conjuntos de Registros
(SETS)
CREATE
OR
REPLACE
FUNCTION
codigo_empregado (codigo INTEGER) RETURNS
SETOF INTEGER AS $$ DECLARE registro RECORD; retval INTEGER; BEGIN FOR registro IN
SELECT * FROM empregados WHERE salario >= $1
LOOP RETURN NEXT registro.departamento_cod;
END LOOP; RETURN; END; $$ LANGUAGE
'plpgsql'; SELECT * FROM codigo_empregado (0);
SELECT COUNT (*), g FROM codigo_empregado
(5000) g GROUP BY g;

s.deptcod :=0; FOR salrec IN SELECT salario AS


salario, d.codigo AS departamento FROM empregados
e, departamentos d WHERE e.departamento_cod =
d.codigo ORDER BY d.codigo LOOP IF s.deptcod =
0 THEN s.deptcod := salrec.departamento; s.minsal
:= salrec.salario; s.maxsal := salrec.salario; counter :=
counter + 1; bucket := bucket + salrec.salario; ELSE
IF s.deptcod = salrec.departamento THEN IF s.maxsal
<= salrec.salario THEN s.maxsal := salrec.salario; END
IF; IF s.minsal >= salrec.salario THEN s.minsal :=
salrec.salario; END IF; bucket := bucket + salrec.salario;
counter := counter +1; ELSE s.medsal := bucket/counter;
RETURN NEXT s; s.deptcod := salrec.departamento;
s.minsal := salrec.salario; s.maxsal := salrec.salario;
counter := 1; bucket := salrec.salario; END IF; END
IF; END LOOP; s.medsal := bucket/counter; RETURN
NEXT s; RETURN; END $$ LANGUAGE 'plpgsql';
SELECT * FROM medsal()

Funes que retornam Registro Para criar funes em


plpgsql que retornem um registro, antes precisamos criar
uma varivel composta do tipo ROWTYPE, descrevendo Relacionando:
o registro (tupla) de sada da funo.
SELECT d.nome, a.minsal, a.maxsal, a.medsal FROM
CREATE TABLE empregados( nome_emp text, medsal() a, departamentos d WHERE d.codigo =
salario int4, codigo int4 NOT NULL, departa- a.deptcod
mento_cod int4, CONSTRAINT empregados_pkey
PRIMARY KEY (codigo), CONSTRAINT empregados_departamento_cod_fkey FOREIGN KEY
(departamento_cod) REFERENCES departamentos (codigo) MATCH SIMPLE ON UPDATE NO
ACTION ON DELETE NO ACTION ) CREATE
TABLE departamentos (codigo INT PRIMARY KEY,
nome VARCHAR); CREATE TYPE dept_media AS
(minsal INT, maxsal INT, medsal INT); CREATE
OR REPLACE FUNCTION media_dept() RETURNS
dept_media AS $$ DECLARE r dept_media%rowtype;
dept record; bucket int8; counter INT; BEGIN bucket
:= 0; counter := 0; r.maxsal :=0; r.minsal :=0; FOR
dept IN SELECT SUM(salario) AS salario, d.codigo
AS departamento FROM empregados e, departamentos
d WHERE e.departamento_cod = d.codigo GROUP
BY departamento loop counter := counter + 1; bucket
:= bucket + dept.salario; IF r.maxsal <= dept.salario
OR r.maxsal = 0 THEN r.maxsal := dept.salario; END
IF; IF r.minsal <= dept.salario OR r.minsal = 0 THEN
r.minsal := dept.salario; END IF; END loop; r.medsal
:= bucket/counter; RETURN r; END $$ LANGUAGE
'plpgsql';
Funes que Retornam Conjunto de Registros (SETOF, Result Set) Tambm requerem a criao de uma
varivel (tipo denidopelo user)
CREATE TYPE media_sal AS (deptcod INT, minsal
INT, maxsal INT, medsal INT); CREATE OR REPLACE FUNCTION medsal() RETURNS SETOF
media_sal AS $$ DECLARE s media_sal%ROWTYPE;
salrec RECORD; bucket INT; counter INT; BEGIN
bucket :=0; counter :=0; s.maxsal :=0; s.minsal :=0;

Captulo 23

PostgreSQL Prtico/Funes Denidas


pelo Usurio e Triggers/Triggers
23.1 6.3 - Triggers (Gatilhos)

evento Um entre INSERT, UPDATE ou DELETE; especica o evento que dispara o gatilho. Vrios eventos
podem ser especicados utilizando OR.

Captulo 32 do manual ocial: http://pgdocptbr.


Exemplos:
sourceforge.net/pg80/sql-createtrigger.html
CREATE TABLE empregados( codigo int4 NOT
At a verso atual no existe como criar funes de gatiNULL, nome VARCHAR, salario int4, departalho na linguagem SQL.
mento_cod int4, ultima_data TIMESTAMP, ulUma funo de gatilho pode ser criada para executar an- timo_usuario VARCHAR(50), CONSTRAINT emtes (BEFORE) ou aps (AFTER) as consultas INSERT, pregados_pkey PRIMARY KEY (codigo) ) CREATE
UPDATE OU DELETE, uma vez para cada registro (li- FUNCTION empregados_gatilho() RETURNS TRIGnha) modicado ou por instruo SQL. Logo que ocorre GER AS $empregados_gatilho$ BEGIN -- Vericar
um desses eventos do gatilho a funo do gatilho dispa- se foi fornecido o nome e o salrio do empregado IF
rada automaticamente para tratar o evento.
NEW.nome IS NULL THEN RAISE EXCEPTION 'O
A funo de gatilho deve ser declarada como uma funo nome do empregado no pode ser nulo'; END IF; IF
que no recebe argumentos e que retorna o tipo TRIG- NEW.salario IS NULL THEN RAISE EXCEPTION
GER. Aps criar a funo de gatilho, estabelecemos o '% no pode ter um salrio nulo', NEW.nome; END
gatilho pelo comando CREATE TRIGGER. Uma funo IF; -- -- Quem paga para trabalhar? -- IF NEW.salario
< 0 THEN RAISE EXCEPTION '% no pode ter
de gatilho pode ser utilizada por vrios gatilhos.
um salrio negativo', NEW.nome; END IF; -- -- -As funes de gatilho chamadas por gatilhos-por- Registrar quem alterou a folha de pagamento e quando
instruo devem sempre retornar NULL.
-- NEW.ultima_data := 'now'; NEW.ultimo_usuario
As funes de gatilho chamadas por gatilhos-por-linha := CURRENT_USER; RETURN NEW; END; $empodem retornar uma linha da tabela (um valor do tipo pregados_gatilho$ LANGUAGE plpgsql; CREATE
HeapTuple) para o executor da chamada, se assim o de- TRIGGER empregados_gatilho BEFORE INSERT
OR UPDATE ON empregados FOR EACH ROW
cidirem.
EXECUTE PROCEDURE empregados_gatilho();
Sintaxe:
INSERT INTO empregados (codigo,nome, salario)
CREATE TRIGGER nome { BEFORE | AFTER } VALUES (5,'Joo',1000); INSERT INTO emprega{ evento [ OR ... ] } ON tabela [ FOR [ EACH ] { dos (codigo,nome, salario) VALUES (6,'Jos',1500);
ROW | STATEMENT } ] EXECUTE PROCEDURE INSERT INTO empregados (codigo,nome, salario) VALUES (7,'Maria',2500); SELECT * FROM empregados;
nome_da_funo ( argumentos )
INSERT INTO empregados (codigo,nome, salario)
VALUES (5,NULL,1000); NEW Para INSERT e
O gatilho ca associado tabela especicada e executa a
UPDATE OLD Para DELETE CREATE TABLE
funo especicada nome_da_funo quando determinaempregados ( nome VARCHAR NOT NULL, salario
dos eventos ocorrerem.
INTEGER ); CREATE TABLE empregados_audit( opeO gatilho pode ser especicado para disparar antes de racao CHAR(1) NOT NULL, usuario VARCHAR NOT
tentar realizar a operao na linha (antes das restries NULL, DATA TIMESTAMP NOT NULL, nome VARserem vericadas e o comando INSERT, UPDATE ou CHAR NOT NULL, salario INTEGER ); CREATE
DELETE ser tentado), ou aps a operao estar completa OR REPLACE FUNCTION processa_emp_audit()
(aps as restries serem vericadas e o INSERT, UP- RETURNS TRIGGER AS $emp_audit$ BEGIN -DATE ou DELETE ter completado).
49

50

CAPTULO 23. POSTGRESQL PRTICO/FUNES DEFINIDAS PELO USURIO E TRIGGERS/TRIGGERS

-- Cria uma linha na tabela emp_audit para reetir a


operao -- realizada na tabela emp. Utiliza a varivel
especial TG_OP -- para descobrir a operao sendo
realizada. -- IF (TG_OP = 'DELETE') THEN INSERT
INTO emp_audit SELECT 'E', USER, now(), OLD.*;
RETURN OLD; ELSIF (TG_OP = 'UPDATE') THEN
INSERT INTO emp_audit SELECT 'A', USER, now(),
NEW.*; RETURN NEW; ELSIF (TG_OP = 'INSERT')
THEN INSERT INTO emp_audit SELECT 'I', USER,
now(), NEW.*; RETURN NEW; END IF; RETURN
NULL; -- o resultado ignorado uma vez que este
um gatilho AFTER END; $emp_audit$ LANGUAGE
plpgsql; CREATE TRIGGER emp_audit AFTER
INSERT OR UPDATE OR DELETE ON empregados FOR EACH ROW EXECUTE PROCEDURE
processa_emp_audit(); INSERT INTO empregados
(nome, salario) VALUES ('Joo',1000); INSERT INTO
empregados (nome, salario) VALUES ('Jos',1500);
INSERT INTO empregados (nome, salario) VALUES
('Maria',250); UPDATE empregados SET salario = 2500
WHERE nome = 'Maria'; DELETE FROM empregados
WHERE nome = 'Joo'; SELECT * FROM empregados;
SELECT * FROM empregados_audit;

= 3; UPDATE empregados SET codigo=100 WHERE


codigo=1; ERRO: No permitido atualizar o campo
codigo SELECT * FROM empregados; SELECT *
FROM empregados_audit;
Crie a mesma funo que insira o nome da empresa e o
nome do cliente retornando o id de ambos
CREATE OR REPLACE FUNCTION empresa_cliente_id(VARCHAR,VARCHAR)
RETURNS _int4 AS $$ DECLARE nempresa alias
FOR $1; ncliente alias FOR $2; empresaid INTEGER; clienteid INTEGER; BEGIN INSERT
INTO empresas(nome) VALUES(nempresa); INSERT INTO clientes(fkempresa,nome) VALUES
(currval (''empresas_id_seq''), ncliente); empresaid
:= currval(''empresas_id_seq''); clienteid := currval(''clientes_id_seq''); RETURN ''{''|| empresaid ||'',''||
clienteid ||''}''; END; $$ LANGUAGE 'plpgsql';
Crie uma funo onde passamos como parmetro o id do
cliente e seja retornado o seu nome

CREATE
OR
REPLACE
FUNCTION
id_nome_cliente(INTEGER) RETURNS text AS
Outro exemplo:
$$ DECLARE r record; BEGIN SELECT INTO r *
CREATE TABLE empregados ( codigo serial PRI- FROM clientes WHERE id = $1; IF NOT found THEN
MARY KEY, nome VARCHAR NOT NULL, salario raise exception ''Cliente no existente !''; END IF;
INTEGER ); CREATE TABLE empregados_audit( RETURN r.nome; END; $$ LANGUAGE 'plpgsql';
usuario VARCHAR NOT NULL, DATA TIMESTAMP NOT NULL, id INTEGER NOT NULL, Crie uma funo que retorne os nome de toda a tabela
coluna text NOT NULL, valor_antigo text NOT NULL, clientes concatenados em um s campo
valor_novo text NOT NULL ); CREATE OR REPLACE FUNCTION processa_emp_audit() RETURNS CREATE OR REPLACE FUNCTION clientes_nomes()
TRIGGER AS $emp_audit$ BEGIN -- -- No per- RETURNS text AS $$ DECLARE x text; r record;
mitir atualizar a chave primria -- IF (NEW.codigo BEGIN x:=''Inicio''; FOR r IN SELECT * FROM
<> OLD.codigo) THEN RAISE EXCEPTION 'No clientes ORDER BY id loop x:= x||'' : ''||r.nome; END
permitido atualizar o campo codigo'; END IF; -- loop; RETURN x||'' : m''; END; $$ LANGUAGE
-- Inserir linhas na tabela emp_audit para reetir as 'plpgsql';
alteraes -- realizada na tabela emp. -- IF (NEW.nome
<> OLD.nome) THEN INSERT INTO emp_audit SELECT CURRENT_USER, CURRENT_TIMESTAMP,
NEW.id, 'nome', OLD.nome, NEW.nome; END
IF; IF (NEW.salario <> OLD.salario) THEN INSERT INTO emp_audit SELECT CURRENT_USER,
CURRENT_TIMESTAMP, NEW.codigo, 'salario',
OLD.salario, NEW.salario; END IF; RETURN NULL;
-- o resultado ignorado uma vez que este um gatilho
AFTER END; $emp_audit$ LANGUAGE plpgsql;
CREATE TRIGGER emp_audit AFTER UPDATE
ON empregados FOR EACH ROW EXECUTE PROCEDURE processa_emp_audit(); INSERT INTO
empregados (nome, salario) VALUES ('Joo',1000);
INSERT INTO empregados (nome, salario) VALUES
('Jos',1500); INSERT INTO empregados (nome,
salario) VALUES ('Maria',2500); UPDATE empregados SET salario = 2500 WHERE id = 2; UPDATE
empregados SET nome = 'Maria Ceclia' WHERE id

Captulo 24

PostgreSQL Prtico/DCL
24.1 7 - DCL (Data Control Language) - Administrao
7.1 - Administrao de usurios, grupos e privilgios

51

Captulo 25

PostgreSQL Prtico/DCL/Administrao
de usurios, grupos e privilgios
25.1 7.1 - Usurios, grupos e privilgios

CREATE ROLE nomeusuario;


Nas verses anteriores usava-se o parmetro CREATEUSER para indicar a criao de um superusurio,
agora usa-se o parmetro mais adequado SUPERUSER.

DCL formado por um grupo de comandos SQL, res- Para poder criar um novo usurio local, com senha, deponsveis pela administrao dos usurios, dos grupos e vemos setar antes o pg_hba.conf:
das permisses.
local all all 127.0.0.1/32 password
De fora do psql (no prompt) utiliza-se comandos sem
Comentar as outras entradas para conexo local.
espao:
Isso para usurio local (conexo via socket UNIX).
createdb, dropdb, etc.
De dentro do psql os comandos so formados por duas Criamos assim:
palavras:
CREATE ROLE nomeuser WITH ENCRYPTED PASCREATE DATABASE, DROP DATABASE, etc (sin- SWORD '********';
taxe SQL).
Ao se logar: psql -U nomeuser nomebanco.
De dentro do psql:
CREATE ROLE nomeusuario VALID UNTIL 'data'
CREATE USER agora um alias para CREATE ROLE, Excluindo Usurio
que tem mais recursos.
DROP USER nomeusuario;
banco=# \h create role
Como usurio, fora do psql:
Comando: CREATE ROLE
Criar Usurio
Descrio: dene um novo papel (role) do banco de dados
CREATEROLE nomeusuario;
Sintaxe:
Excluindo Usurio
CREATE ROLE nome [ [ WITH ] opo [ ... ] ]
DROPUSER nomeusuario;
onde opo pode ser:
Detalhe: sem espaos.
SUPERUSER | NOSUPERUSER | CREATEDB | NOCREATEDB | CREATEROLE | NOCREATEROLE | Criando Superusurio
CREATEUSER | NOCREATEUSER | INHERIT | NOI- CREATE ROLE nomeuser WITH SUPERUSER ENNHERIT | LOGIN | NOLOGIN | CONNECTION LI- CRYPTED PASSWORD '******';
MIT limite_con | [ ENCRYPTED | UNENCRYPTED ]
-- usurio com poderes de super usurio
PASSWORD 'senha' | VALID UNTIL 'tempo_absoluto'
| IN ROLE nome_role [, ...] | IN GROUP nome_role [, Alterar Conta de Usurio
...] | ROLE nome_role [, ...] | ADMIN nome_role [, ...] ALTER ROLE nomeuser ENCRYPTED PASSWORD
| USER nome_role [, ...] | SYSID uid
'******' CREATEUSER
Caso no seja fornecido ENCRYPTED ou UNEN- -- permisso de criar usurios
CRYPTED ento ser usado o valor do parmetro pasALTER ROLE nomeuser VALID UNTIL '12/05/2006';
sword_encryption (postgresql.conf).
ALTER ROLE fred VALID UNTIL innity;
Criar Usurio
52

25.1. 7.1 - USURIOS, GRUPOS E PRIVILGIOS

53

ALTER ROLE miriam CREATEROLE CREATEDB; -- GRANT UPDATE ON contas TO joel;


poderes para criar bancos
D a joel o privilgio de executar consultas update no obObs.: Lembrando que ALTER ROLE uma extenso do jeto contas.
PostgreSQL.
GRANT SELECT ON contas TO GROUP contabiliListando todos os usurios:

dade;

SELECT usename FROM pg_user;

REVOKE ALL ON contas FROM PUBLIC;

A tabela pg_user uma tabela de sistema (_pg) que Os privilgios especiais do dono da tabela (ou seja, os
guarda todos os usurios do PostgreSQL.
direitos de DROP, GRANT, REVOKE, etc.) so sempre inerentes condio de ser o dono, no podendo ser
Tambm podemos utilizar:
concedidos ou revogados. Porm, o dono do objeto pode
\du ou \dg
decidir revogar seus prprios privilgios comuns como,
por exemplo, tornar a tabela somente para leitura para o
Criando Um Grupo de usurios
prprio, assim como para os outros.
CREATE GROUP nomedogrupo;
Normalmente, s o dono do objeto (ou um superusurio)
Adicionar/Remover Usurios de um Grupo
pode conceder ou revogar privilgios para um objeto.
ALTER GROUP nomegrupo ADD USER user1, -- Criao dos grupos
user2,user3 ;
CREATE GROUP adm;
ALTER GROUP nomegrupo DROP USER user1, user2
CREATE USER paulo ENCRYPTED PASSWORD
;
'paulo' CREATEDB CREATEUSER;
Excluindo Grupo
-- Criao dos Usurios do Grupo adm
DROP GROUP nomegrupo;
CREATE USER andre ENCRYPTED PASSWORD 'anObs.: isso remove somente o grupo, no remove os usu- dre' CREATEDB IN GROUP adm;
rios.
CREATE USER michela ENCRYPTED PASSWORD
Listando todos os grupos:
'michela' CREATEDB IN GROUP adm;
SELECT groname FROM pg_group;
O usurio de sistema (super usurio) deve ser um usurio
Privilgios
Dando Privilgios A Um Usurio
GRANT UPDATE ON nometabela TO nomeusuario;
Dando Privilgios A Um Grupo Inteiro
GRANT SELECT ON nometabela TO nomegrupo;
Removendo Todos os Privilgios de Todos os Users
REVOKE ALL ON nometabela FROM PUBLIC
Privilgios

criado exclusivamente para o PostgreSQL. Nunca devemos torn-lo dono de nenhum executvel.
Os nomes de usurios so globais para todo o agrupamento de bancos de dados, ou seja, podemos utilizar um
usurio com qualquer dos bancos.
Os privilgios DROP, GRANT, REVOKE, etc pertencem ao dono do objeto no podendo ser concedidos ou
revogados. O mximo que um dono pode fazer abdicar de seus privilgios e com isso ningum mais teria os
mesmos e o objeto seria somente leitura para todos.

O superusurio tem direito a fazer o que bem entender Exemplo: para permitir a um usurio apenas os privilgios de INSERT, UPDATE e SELECT e no permitir o
em qualquer banco de dados do SGBD.
de DELETE em uma tabela, use:
O usurio que cria um objeto (banco, tabela, view, etc)
REVOKE ALL ON tabela FROM usuario;
o dono do objeto.
Para que outro usurio tenha acesso ao mesmo deve re- GRANT SELECT,UPDATE,INSERT ON tabela TO
usuario;
ceber privilgios.
Existem vrios privilgios diferentes: SELECT, IN- Mais detalhes:
SERT, UPDATE, DELETE, RULE, REFERENCES, http://pgdocptbr.sourceforge.net/pg80/user-manag.html
TRIGGER, CREATE, TEMPORARY, EXECUTE e
http://pgdocptbr.sourceforge.net/pg80/sql-revoke.html
USAGE.
Os privilgios aplicveis a um determinado tipo de objeto http://pgdocptbr.sourceforge.net/pg80/sql-grant.html
variam de acordo com o tipo do objeto (tabela, funo,
etc.).
O comando para conceder privilgios o GRANT. O de
remover o REVOKE.

Captulo 26

PostgreSQL Prtico/Transaes
26.1 8 Transaes

CREATE TABLE contas(codigo INT2 PRIMARY


KEY, nome VARCHAR(40), saldo NUMERIC());
INSERT INTO contas VALUES (5, 'Ribamar', 500.45);

Transao - a realizao de um conjunto de comandos


de uma s vez. Uma transao acontece por completo
(todas as operaes) ou nada acontece. Tambm a transao deve garantir um nvel de isolamento das demais
transaes, de maneira que as demais transaes somente
enxerguem as operaes aps a transao concluda.

Uma transao dita um processo atmico, o que signica que ou acontecem todas as suas operaes ou ento
nenhuma ser salva.

Caso haja um erro qualquer na transao ou falha no sistema o SGBR ir executar um comando ROLLBACK.
Transaes so uma forma de dar suporte s operaes
concorrentes, garantindo a segurana e integridade das
informaes. Garantir que duas solicitaes diferentes
no efetuaro uma mesma operao ao mesmo tempo.

BEGIN; -- Iniciar uma transao UPDATE contas SET


saldo = 800.35 WHERE codigo= 5; SELECT nome,saldo
FROM contas WHERE codigo = 5; COMMIT; -- Executar todos os comandos da transao '''Agora para testar
se de fato todas as operaes foram salvas execute:'''
SELECT nome,saldo FROM contas WHERE codigo = 5;

Vamos iniciar a seguinte transao na tabela acima:

Ao consultar o banco de dados, uma transao enxerga


um snapshot (instantneo) dos dados, como estes eram Vamos a outro teste da atomicidade das transaes. Inno exato momento em que a consulta foi solicitada, des- tencionalmente vamos cometer um erro no SELECT
(FRON) (Com N, quando deveria ser com M):
prezando as mudanas ocorridas depois disso.
O PostgreSQL trata a execuo de qualquer comando BEGIN; -- Iniciar uma transao UPDATE contas SET
saldo = 50.85 WHERE codigo= 5; SELECT nome,saldo
SQL como sendo executado dentro de uma transao.
FROM contas WHERE codigo = 5; COMMIT; -Na verso 8 apareceram os SAVEPOINTS (pontos de
Executar todos os comandos da transao
salvamento) , que guardam as informaes at eles. Isso
salva as operaes existentes antes do SAVEPOINT e
basta um ROLLBACK TO para continuar com as demais Isso causar um erro e o comando ROLLBACK ser automaticamente executado, o que garante que nenhuma
operaes.
das operaes ser realizada. Ento execute a consulta
O PostgreSQL mantm a consistncia dos dados utilipara testar se houve a atualizao:
zando o modelo multiverso MVCC (Multiversion Concurrency Control), que permite que leitura no bloqueie SELECT nome,saldo FROM contas WHERE codigo = 5;
escrita nem escrita bloqueie leitura.
O PostgreSQL tambm conta com um nvel de isola- Remover Campo (verses anteriores a 7.3 no contam
mento chamado serializable (serializvel), que mais ri- com esse recurso):
goroso e emula execuo serial das transaes.
BEGIN; LOCK TABLE nometabela; INTO TABLE
BEGIN; UPDATE contas SET saldo = saldo nomenovo FROM nometabela; DROP TABLE no 100.00 WHERE codigo = 5; SAVEPOINT metabela; ALTER TABLE nomenovo RENAME TO
meu_ponto_de_salvamento; UPDATE contas SET saldo nometabela; COMMIT;
= saldo + 100.00 WHERE codigo = 5; -- ops ... o certo
na conta 6 ROLLBACK TO meu_ponto_de_salvamento; Alterar Tipos de Dados (verses antigas):
UPDATE contas SET saldo = saldo + 100.00 WHERE
BEGIN; ALTER TABLE tabela ADD COLUMN
conta = 6; COMMIT;
novocampo novotipodados; UPDATE tabela SET
novocampo = CAST (antigocampo novotipodados);
Exemplos:
54

26.1. 8 TRANSAES
ALTER TABLE tabela DROP COLUMN antigocampo;
COMMIT;
Transaes que no se Concretizam
BEGIN; -- Iniciar uma transao UPDATE contas SET
saldo = 50.85 WHERE codigo= 5; SELECT nome,saldo
FRON contas WHERE codigo = 5; ROLLBACK;
-- Cancelando todos os comandos da transao SELECT nome,saldo FRON contas WHERE codigo = 5;
BEGIN; -- Iniciar uma transao CREATE TABLE
teste (id INTEGER, nome text); INSERT INTO teste
VALUES (1, 'Teste1'); INSERT INTO teste VALUES
(2, 'Teste2'); DELETE FROM teste; COMMIT; -gravar resultados SELECT * FROM TESTE; -- BEGIN;
CREATE TABLE teste (id INTEGER, nome text);
INSERT INTO teste VALUES (3, 'Teste3'); INSERT
INTO teste VALUES (4, 'Teste4'); DELETE FROM
teste; ROLLBACK; SELECT * FROM TESTE;
Detalhes sobre conitos de bloqueios:
http://www.postgresql.org/docs/current/static/
explicit-locking.html
Isolamento de Transaes
O nvel de isolamento padro do PostgreSQL o Read
Committed (leitura efetivada). Uma consulta SELECT
realizada com este nvel perceber os registros existente
no incio da consulta. Este o nvel mais exvel.
Existe tambm o nvel serializable, mais rigoroso. Os
nveis Read uncommitted e Repeatable read so suportados, mas assumem a forma de um dos dois anteriores.
Setando o Nvel de Isolamento de uma transao:
banco=# \h SET TRANSACTION
Comando: SET TRANSACTION Descrio: dene as
caractersticas da transao atual Sintaxe:
SET TRANSACTION modo_transao [, ...] SET
SESSION CHARACTERISTICS AS TRANSACTION
modo_transao [, ...]
onde modo_transao um dos:
ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ
UNCOMMITTED } READ WRITE | READ ONLY
Exemplo:
BEGIN; SET TRANSACTION ISOLATION LEVEL
SERIALIZABLE; Aqui AS consultas da transao; ...
COMMIT;
Controle de Simultaneidade no Captulo 12 do manual
ocial.

55

Captulo 27

PostgreSQL Prtico/Administrao
27.1 9 - Administrao
1. Backup e Restore
2. Importar e Exportar
3. Converter
4. Otimizao e Desempenho

56

Captulo 28

PostgreSQL
Prtico/Administrao/Backup e Restore
28.1 9.1 - Backup e Restore

para o pg_restore)
Backup local de apenas uma tabela de um banco:

Administrao

pg_dump -U nomeusuario -d nomebanco -t nometabela


Com uma boa manuteno o administrador melhora o de- > nomescript
sempenho do SGBD, garante a integridade dos dados, a Restaurar apenas uma tabela
sua segurana e os prprios dados.
Para conseguir restaurar apenas uma tabela uma forma
Especialmente quem j teve problemas em HDs e no gerar o dump do tipo com tar:
pode recuperar os dados, sabe da importncia dos bacpg_dump -Ft banco -f arquivo.sql.tar
kups.
pg_restore -d banco -t tabela banco.sql.tar
Para efetuar backup e restore utilizamos o comando
Backup local de todos os bancos:
pg_dump em conjunto com o psql.
Obs.: O pg_dump no faz backup de objetos grandes (lo) pg_dumpall -U nomeusuario -d nomebanco > nomescript
por default. Caso desejemos tambm estes objetos no Backup remoto de um banco:
backup devemos utilizar uma sada no formato tar e utipg_dump -h hostremoto -d nomebanco | psql -h hostlocal
lizar a opo -b.
-d banco
pg_dump -Ftb banco > banco.tar
Backup em multivolumes (volumes de 200MB):
Backup local de um nico banco:
pg_dump nomebanco | split -m 200 nomearquivo
pg_dump -U usuario -d banco > banco.sql
m para 1Mega, k para 1K, b para 512bytes
pg_dump -Ft banco > banco.tar
Importando backup de verso anterior do PostO script normalmente leva a extenso .sql, por conveno, greSQL
mas pode ser qualquer extenso e o script ter contedo
Instala-se a nova verso com porta diferente (ex.: 5433)
texto puro.
e conectar ambos
Restore de um banco local:
pg_dumpall -p 5432 | psql -d template1 -p 5433
psql -U usuario -d banco < banco.sql
Visualizar comando atual e PID de todos os processos
pg_restore -d banco banco.sql
do servidor:
pg_restore -d banco banco.tar
SELECT pg_stat_get_backend_pid(s.backendid) AS
Obs.: Cuidado ao restaurar um banco, especialmente se procpid,
existirem tabelas sem integridade. Corre-se o risco de pg_stat_get_backend_activity(s.backendid) AS curduplicar os registros.
rent_query
Descompactar e fazer o restore em um s comando: FROM (SELECT pg_stat_get_backend_idset() AS bacgunzip -c backup.tar.gz | pg_restore -d banco

kendid) AS s;

ou

Determinao da utilizao em disco pelas Tabelas

cat backup.tar.gz | gunzip | pg_restore -d banco

Tendo um banco com cadastro de CEPs e apenas uma tabela cep_tabela, mostrar o uso do disco por esta tabela.

(o cat envia um stream do arquivo para o gunzip que passa

57

58

CAPTULO 28. POSTGRESQL PRTICO/ADMINISTRAO/BACKUP E RESTORE

Precisamos ltrar as tabelas de sistema, veja:


VACUUM ANALYZE;

Veja que no resultado tambm aparece a tabela de ndices,


e com uso signicativo.

Ferramentas Contrib
O utilitrio VACUUM recupera espao em disco ocupado pelos registros excludos e atualizados, atualiza os pgbench testa desempenho do SGBD.
dados para as estatsticas usadas pelo planejador de con- dbsize mostra o tamanho de tabelas e bancos
sultas e tambm protege contra perda de dados quando
oid2name retorna OIDs, leinode e nomes de tabelas
atingir um bilho de transaes.
SELECT relname, rellenode, relpages FROM pg_class D:\ARQUIV~1\POSTGR~1\8.1\bin>oid2name -U postWHERE relname LIKE 'cep_%' ORDER BY relname; gres -P ********
All databases:
relname | rellenode | relpages
Oid Database Name Tablespace 33375 bdcluster ncluster
16948 cep_brasil pg_default 25146 cep_full pg_default
cep_pk | 25140 | 2441 cep_tabela | 16949 | 27540
33360 controle_estoque pg_default 16879 municipios
pg_default 33340 pgbench pg_default 10793 postgres
O daemon do auto-vacuum
Iniciando na verso 8.1 um processo opcional do ser- pg_default 10792 template0 pg_default 33377 template1
pg_default 16898 testes pg_default
vidor, chamado de autovacuum daemon, cujo uso
para automatizar a execuo dos comandos VACUUM No README desta contrib existe uma boa sugesto para
e ANALYZE.
encontrar o tamanho aproximados dos dados de cada obRoda periodicamente e checa o uso em baixo nvel do jeto interno do PostgreSQL com:
+-------------+----------

coletor de estatsticas.

SELECT relpages, rellenode, relname FROM pg_class


No pode ser usado enquanto stats_start_collector e ORDER BY relpages DESC;
stats_row_level forem alterados para true.
Cada pgina tem tipicamente 8KB e o relpages atualizado pelo comando VACUUM.
Portanto o postgresql.conf deve car assim:
Backup Automtico de Bancos no Windows com o
stats_start_collector = on
Agendador de Tarefas
stats_row_level = on
Criao do script backuppg.bat:
autovacuum = on
rem Adaptao de Ribamar FS do original de Ivlison
Por default ser executado a casa 60 segundos. Para alte- Souza para a lista PostgreSQL Brasil
rar descomente e mude a linha:
@echo o
1. autovacuum_naptime = 60

rem (Nome do Usurio do banco para realizar o backup)


REM Dados que precisa alterar:

Para uma tabela


VACUUM ANALYZE tabela;
Para todo um banco
\c

REM PGUSER
REM PGPASSWORD
REM nome pasta de backup

VACUUM FULL ANALYZE;

REM nome pasta de instalao do PostgreSQL se diferente de C:\Arquivos de programas\PostgreSQL\8.1\

Determinar o uso do disco por tabela

REM

SELECT relnenode, relpages FROM pg_class WHERE REM (Nome do usurio do PostgreSQL que executar o
relname = 'nometabela'
script)
Cada pgina usa 8kb.

SET PGUSER=postgres

Tamanho de ndices

rem (Senha do usurio acima)

SELECT c2.relname, c2.relpages

SET PGPASSWORD=******

FROM pg_class c, pg_class c2, pg_index i WHERE rem (Indo para a raiz do disco)
c.relname = 'customer' AND c.oid = i.indrelid AND
C:
c2.oid = i.indexrelid ORDER BY c2.relname;
rem (Selecionando a pasta onde ser realizada o backup)
Encontrar as maiores tabelas e ndices
chdir C:\backup
SELECT relname, relpages FROM pg_class ORDER BY
rem (banco.sql o nome que deni para o meu backup
relpages DESC;

28.1. 9.1 - BACKUP E RESTORE


rem (Deletando o backup existente)
del banco*.sql
echo Aguarde, realizando o backup do Banco de Dados
rem C:\Arquiv~1\Postgr~1\8.1\bin\pg_dump -i -U postgres -b -o -f C:\backup\banco.sql condominio
rem Observao: Caso queira colocar o nome do backup
seguindo de uma data s usar:
for /f tokens=1,2,3,4 delims=/ " %%a in ('DATE /T') do
set Date=%%b-%%c-%%d
rem O comando acima serve para armazenar a data no
formato dia-mes-ano na varivel Date;
C:\Arquiv~1\Postgr~1\8.1\bin\pg_dump -i -U postgres b -o -f C:\backup\banco%Date%.sql condominio
rem (sair da tela depois do backup)
exit
Congurao do Agendador de Tarefas para executar o
script diariamente:
- Iniciar - Programas - Acessrios - Ferramentas de Sistema - Tarefas agendadas
- Adicionar tarefa agendada
- Avanar
- Clique em procurar e indique o backuppg.bat
- Em executar esta tarefa escolha como achar mais adequado (diariamente) e clique em Avanar
- Clique em Avanar e OK. Na prxima tela marque
Executar somente se conectado.
- Ento clique em Concluir
- No prximo boot o backup ser efetuado a cada dia.
Um bom artigo sobre backup e restaurao no
PostgreSQL encontra-se no site ocial do PostgreSQL do Brasil: https://wiki.postgresql.org.br/wiki/
BackupAndRestore
Veja tambm a documentao em ingls:
http://www.postgresql.org/docs/8.1/static/
app-pgrestore.html
http://www.postgresql.org/docs/8.1/static/app-pgdump.
html
http://www.postgresql.org/docs/8.1/static/
app-pg-dumpall.html

59

Captulo 29

PostgreSQL
Prtico/Administrao/Importar e
Exportar
29.1 9.2 - Importar e Exportar

- Abrir calc e selecionar e copiar a rea a importar


- Abrir uma nova planilha
- Clicar com o boto direito sobre a primeira clula e Colar Especial

Estando na console e usando pg_dumpall e psql:


Efetuando backup:

- Desmarque Colar tudo, marque Nmeros, desmarque


pg_dumpall > bancos.sql - Para preservar os OIDs use a
Frmulas e OK
opo -o no pg_dumpall.
- Tecle Ctrl+S para salvar
Restore de seus dados:
- Em Tipo de arquivo escolha Texto CSV, digite o nome
psql -d postgres -f bancos.sql
e Salvar. Conrme
Para importar scripts gerados via pg_dump de dentro do
- Como Delimitador de Campo escolha Tabulao
psql devemos utilizar o comando
- Em Delimitador de texto delete as aspas e OK
\i /path/script.sql
- Ignore a mensagem de erro, caso aparea.
\i ./script.sql -- Tambm para o windows com o arquivo
Importar o arquivo texto CSV para uma tabela com
no diretrio atual
estrutura semelhante do arquivo csv:
Para importar arquivos texto com delimitadores, tipo
TXT, CSV ou binrios utilizamos os comandos do banco su - postgres
(psql), como usurio do banco:
psql nomebanco
Importando:

\copy nometabela from /home/nomearquivo.csv

\COPY tabela FROM script.csv

No Windows

\COPY paises FROM 'paises.csv';

\copy nometabela from ./arquivo.csv -- o arquivo estando


no path do usurio

Exportando:

CREATE TEMP TABLE paises AS SELECT * FROM Exportar um Banco Access para uso no PostgreSQL
ou outros bancos
teste WHERE nome LIKE '%tina%';
\COPY paises TO '/usr/teste.copy';

Selecionar a tabela e Exportar

Com Delimitadores

Escolher o tipo de arquivos Texto (txt, csv, ...)

\COPY tabela FROM '/arquivo.csv' DELIMITERS '|';

Em avanado: Delimitador de campos Tabulao

\COPY tabela TO '/arquivo.txt' DELIMITERS '|';

Qualicador de texto remover (deixar em branco)

Obs.: O arquivo teste.copy deve ter permisso de escrita


para o user do banco.
Importar uma planilha do Excel ou do Calc do OpenOce para uma tabela:
Gerando um arquivo CSV no OpenOce Calc
60

Captulo 30

PostgreSQL
Prtico/Administrao/Converter
30.1 9.3 - Converter
Uma boa forma de converter bancos MySQL para bancos PostgreSQL no Windows instalando o driver ODBC
para o MySQL e para o PostgreSQL.
Ento cria-se a comunicao com os dois bancos e
exporta-se para o PostgreSQL.
Existem ferramentas comerciais com muitos recursos,
como o caso do EMS Data Export e Import for
PostgreSQL: http://www.sqlmanager.net/en/products/
postgresql/dataexport
Veja: export to MS Excel, MS Word / RTF, MS Access,
HTML, TXT, CSV, PDF, XML and SQL.
Outra opo exportar para CSV do MySQL e importar
pelo PostgreSQL.

61

Captulo 31

PostgreSQL
Prtico/Administrao/Otimizao e
Desempenho
31.1 Otimizao e Desempenho

tra perda de dados muito antigos devido ao recomeo do


ID das transaes, portanto deve ser utilizado constantePara isso ajusta-se bem o postgresql.conf, utiliza-se o va- mente, como tambm atualiza as estatsticas dos dados
utilizados pelo planejador de comandos. Lembrando que
cuum, analyze e explain.
na verso 8.1 j vem embutido no executvel, podendo
Lembrando que na verso 8.1 o vacuum no mais apenas ser congurado para que seja executado automaum programa separado e vem embutido no executvel. ticamente.
Mesmo embutido ele congurvel e podemos utilizar
ou no e se usar, podemos tambm congurar sua perio- Na linha de comando:
dicidade.
vacuumdb -faze ou vacuumdb -fazq.

31.2 How to optimize PostgreSQL 31.5 ANALYZE


database size
http://www.linuxinsight.com/optimize_postgresql_
database_size.html

31.3 Uma tima fonte de consulta


http://www.metatrontech.com/wpapers/
mysql2postgresql.pdf
Captulo 21 do manual:
http://pgdocptbr.sourceforge.net/pg80/maintenance.
html
Vacuum:
http://pgdocptbr.sourceforge.net/pg80/sql-vacuum.html

O comando ANALYZE coleta estatsticas sobre o contedo das tabelas do banco de dados e armazena os resultados na tabela do sistema pg_statistic. Posteriormente,
o planejador de comandos utiliza estas estatsticas para
ajudar a determinar o plano de execuo mais eciente
para os comandos. Caso no atualizemos estas estatsticas com freqncia podemos comprometer o desempenho do banco de dados por uma escolha errada do plano
de comandos.
Normalmente operaes DELETE ou UPDATE no removem os registros automaticamente. Somente aps a
execuo do VACUUM isso acontece.

31.6 Recomendao

Analyze:
http://pgdocptbr.sourceforge.net/pg80/ Para a maioria das instalaes executar o comando VAsql-analyze.html
CUUM ANALYZE para todo o banco de dadosuma vez
ao dia em horrio de pouca utilizao. Tambm podemos
utilizar o comando: vacuumdb -fazq.

31.4 VACUUM

Quando foi excluda a maioria dos registros de uma tabela sugere-se a execuo do comando VACUUM FULL.
O comando Vacuum tanto recupera espao em disco, Este comando gera um forte bloqueio nas tabelas em que
quanto otimiza o desempenho do banco e previne con- executado.
62

31.9. PLANO DE CONSULTA

63

Em tabelas cujo contedo excludo periodicamente, Utilizar links simblicos para mover tabelas, ndices, ...
como tabelas temporrias, indicado o uso do comando para outro HD.
TRUNCATE ao invs de DELETE.
Ativar o chip DMA do HD
Exemplo de uso do vacuum. Acesse o banco e execute:
Testar: hdparm -Tr /dev/hda (status)
VACUUM VERBOSE ANALYZE nometabela;

Ativar o chip: hdparm -d 1 /dev/hda


De fora do psql usar o comando vacuumdb -faze ou Desativar: hdparm -d 0 /dev/hda
vacuumdb -fazq (silencioso).
No postgresql.conf existem conguraes para shaVACUUM VERBOSE ANALYZE autor;
red_buers, que quanto maior melhor, respeitando-se a
RAM.
INFO: vacuuming public.autor
INFO: autor": found 0 removable, 0 nonremovable row O default da verso 8.1.4 :
versions in 0 pages
shared_buers = 1000 # min 16 ou max_connections*2
DETAIL: 0 dead row versions cannot be removed yet.
(8KB cada)
There were 0 unused item pointers.
0 pages are entirely empty.

31.9 Plano de Consulta

CPU 0.00s/0.00u sec elapsed 0.00 sec.


O PostgreSQL concebe um plano de comando para cada
comando recebido. A escolha do plano correto, corresINFO: autor": scanned 0 of 0 pages, containing 0 live
pondendo estrutura do comando e s propriedades dos
rows and 0 dead rows; 0 rows in sample, 0 estimated total
dados, absolutamente crtico para o bom desempenho.
rows
Pode ser utilizado o comando EXPLAIN para ver o plano
Em um Banco Completo
criado pelo sistema para qualquer comando (conjunto
executvel de instrues). A leitura do plano uma arte
S VACUUM
que merece um tutorial extenso, o que este no ; porm,
Ou
aqui so fornecidas algumas informaes bsicas.
VACUUM FULL ANALYZE;
Os nmeros apresentados atualmente pelo EXPLAIN
so:
INFO: analyzing public.autor

31.7 Dicas de Desempenho


- Adicionar ndice tabela (toda chave primria j contm
um ndice)
- Adicionar ndices aos campos de clusulas WHERE;
- Evitar campos com tamanho varivel. Preferir o CHAR
ao VARCHAR.
- Evitar muitos ndices e ndices com mais de um campo
- Evitar ndice em tabela muito pequena (poucos registros, no compensa)
- Evitar, sempre que possvel, chaves compostas

O custo de partida estimado (O tempo gasto antes


de poder comear a varrer a sada como, por exemplo, o tempo para fazer a classicao em um n de
classicao).
O custo total estimado (Se todas as linhas fossem
buscadas, o que pode no acontecer: uma consulta
contendo a clusula LIMIT pra antes de gastar o
custo total, por exemplo).
Nmero de linhas de sada estimado para este n do
plano (Novamente, somente se for executado at o
m).

- Separar bancos em um HD e logs em outro HD


- Aumentar shared buers (postgresql.conf) de acordo
com RAM disponvel.

Largura mdia estimada (em bytes) das linhas de


sada deste n do plano.

Recomendaes: 25% da RAM para shared buers cache


EXPLAIN SELECT * FROM NOMETABELA;
e 2-4% para sort buer.
Mostra plano de execuo interna da consulta, acusando
tempo gasto

31.8 Separando bancos e Logs


bancos em /usr/local/pgsql/data (hda)
logs em /usr/local/pgsql/data/pg_xlog (hdb)

EXPLAIN SELECT sum(i) FROM tabela1 WHERE i =


4;
Agora a consulta ser modicada para incluir uma condio WHERE:

64

CAPTULO 31. POSTGRESQL PRTICO/ADMINISTRAO/OTIMIZAO E DESEMPENHO

EXPLAIN SELECT * FROM tenk1 WHERE unique1 <


1000;

31.11 Alerta

Modicando-se a consulta para restringir mais ainda a Caso um banco j esteja com mais de 1,5 bilhes de transaes, ao executar o comando VACUUM para o banco
condio
inteiro receber um alerta sobre a necessidade de execuEXPLAIN SELECT * FROM tenk1 WHERE unique1 <
o do VACUUM.
50;
Adio de outra condio clusula WHERE:
EXPLAIN SELECT * FROM tenk1 WHERE unique1 <
50 AND stringu1 = 'xxx';
A seguir feita a juno de duas tabelas, utilizando as
colunas sendo discutidas:
EXPLAIN SELECT * FROM tenk1 t1, tenk2 t2
WHERE t1.unique1 < 50 AND t1.unique2 = t2.unique2;
Uma forma de ver outros planos forar o planejador a
no considerar a estratgia que sairia vencedora, habilitando e desabilitando sinalizadores de cada tipo de plano
(Esta uma ferramenta deselegante, mas til.
SET enable_nestloop = o;
EXPLAIN SELECT * FROM tenk1 t1, tenk2 t2
WHERE t1.unique1 < 50 AND t1.unique2 = t2.unique2;
possvel vericar a preciso dos custos estimados pelo planejador utilizando o comando EXPLAIN
ANALYZE. Na verdade este comando executa a consulta, e depois mostra o tempo real acumulado dentro de
cada n do plano junto com os custos estimados que o comando EXPLAIN simples mostraria. Por exemplo, poderia ser obtido um resultado como este:
EXPLAIN ANALYZE SELECT * FROM tenk1 t1,
tenk2 t2 WHERE t1.unique1 < 50 AND t1.unique2 =
t2.unique2;

31.10 Reincio do ID de Transaes


Para prevenir com segurana o recomeo do ID das Transaes devemos utilizar o comando VACUUM em todas
as tabelas do banco de dados pelo menos uma vez a cada
meio bilho de transaes. Caso o VACUUM no seja
executado pelo menos uma vez a cada 2 bilhes de transaes ocorrer a perda de todos os dados do banco. De
fato eles no se perdem, voltando dentro de mais 2 bilhes
de transaes, mas isso no ajuda.
Como saber quantas transaes ainda falta para a perda
dos dados:
SELECT datname AS banco, AGE(datfrozenxid) AS
idade FROM pg_database;
Sempre que se executa o comando VACUUM em um
banco, a coluna com age comea de 1 bilho. Ao executar as transaes vai incrementando. Ao se aproximar de
2 bilhes devemos executar novamente o comando VACUUM.

Captulo 32

PostgreSQL Prtico/Replicao
32.1 10 - Replicao

values(roger)
'

o processo de compartilhar e distribuir informaes en- );


tre diferentes bancos de dados. Estes dados sero mantiExemplo dbLink - Update
dos sincronizados e ntegros em relao s regras de inselect
tegridade referencial e de negcios.
No PostgreSQL algumas formas de realizar replicao dblink_exec(
so atravs do contrib dblink e das ferramenta slony e 'dbname=pgteste
pgcluster.
hostaddr=200.174.40.63
Para importar o dblink no banco onde queremos reuser=paulo
plicar:
password=paulo
\i /usr/local/pgsql/contrib/dblink.sql
Exemplo dbLink - Select

port=5432',

select *

'update clientes

from dblink

set nome=Paulo Rogerio

where id = 18

'dbname=pgteste

'

hostaddr=200.174.40.63

);

user=paulo

Exemplo dbLink - Delete

password=paulo

select

port=5432',

dblink_exec(

'select nome

'dbname=pgteste

from clientes

hostaddr=200.174.40.63

'

user=paulo

) as t1(nome varchar(30));

password=paulo

Exemplo dbLink - Insert

port=5432',

select

'delete from clientes

dblink_exec(

where id = 18

'dbname=pgteste

'

hostaddr=200.174.40.63

);

user=paulo

Temos o contrib dblink e o projerto slony para replicao


de bancos do PostgreSQL.

password=paulo
port=5432',
'insert into clientes(nome)

O dblink no vem ativo por default.


Ativando o dblink:

65

66

CAPTULO 32. POSTGRESQL PRTICO/REPLICAO

De fora do banco:
psql
-U
nomeuser
/usr/local/pgsql/contrib/dblink.sql

nomebanco

<

Ou de dentro do banco:
\i /usr/local/pgsql/contrib/dblink.sql
Funes do dblink:
dblink - para SELECT
dblinkexec - para INSERT, UPDATE e DELETE (remotos)
Tutorial sobre replicao no site da dbExperts - www.
dbexperts.com.br
Usado para fazer consultas remotas em bancos do PG
dblink -> select
dblinkexec -> insert, update e delete (remotos)
Dica: Remover postmarter.pid em caso de queda anormal
do SGBD
Bons documentos sobre replicao:
- Replicao do PostgreSQL com Slony do Marlon Petry
- Backup Quente no PostgreSQL com Replicao do Slvio Csar
http://www.gulbf.com.br/?q=node/33
- Replicando banco de dados PostgreSQL do Rafael Donato
http://www.vivaolinux.com.br/artigos/impressora.php?
codigo=4536

32.2 Cluster != Replicao


http://savepoint.blog.br/cluster-replicacao/

Captulo 33

PostgreSQL Prtico/Conguraes
33.1 11 - Conguraes
1. Congurar acessos (pg_hba.conf)
2. Conguraes Diversas (postgresql.conf)

67

Captulo 34

PostgreSQL
Prtico/Conguraes/Congurar acessos
34.1 11.1 - pg_hba.conf

Este mtodo de conexo para uso somente atravs sockets de domnio UNIX

Ao instalar o PostgreSQL 8.1.4 via fontes ele cria (e Sem um registro tipo local essa conexo negada
alerta) o arquivo pg_hba.conf com autenticao do tipo
trust (sem senha mas somente para conexo local).
1. host DATABASE USER CIDR-ADDRESS
METHOD [OPTION]
Para autenticar exigindo um dos tipos com senha, devemos antes, ainda no trust, alterar os usurios adicionando
Conexo via TCP/IP. Este tipo de conexo s possvel
senha:
quando o valor do parmetro listen_address (IP) adeALTER ROLE nomeuser WITH PASSWORD 'senhaquado no postgresql.conf. Por default somente localhost
dopg';
permitido. So permitidas conexes com ou sem SSL.
Somente ento devemos alterar o pg_hba.conf para pedir
senha e restartar o PostgreSQL.
1. hostssl DATABASE USER CIDR-ADDRESS
METHOD [OPTION]
As conguraes principais so feitas nos arquivos
pg_hba.conf e postgresql.conf. Se instalado atravs dos
fontes cam no subdiretrio data de instalao do Post- Semelhante ao host, sendo que neste usa-se criptograa
greSQL, normalmente em /usr/local/pgsql. Se instalado SSL.
via binrios da distribuio vai variar com a distribuio.
No Slackware esto no diretrio /usr/share/postgresql.
1. hostnossl DATABASE USER CIDR-ADDRESS
METHOD [OPTION]
O pg_hba.conf controla que mquinas tero acesso ao
PostgreSQL e a autenticao dessas mquinas clientes
(sem autenticao ou atravs de outras formas, trust, Apenas para conexes que no usam SSL.
md5, crypt, etc).
1. DATABASE can be all, sameuser, samerole,
O pg_hba.conf muito rico e podemos controlar o acesso
a database name, or
pelo IP, pela mscara, pelo banco, pelo usurio, pelo mtodo (trust, md5, password, etc).

1. a comma-separated list thereof.

Resumo sobre o pg_hba.conf

Arquivo de congurao da autenticao dos clientes do DATABASE pode ser:


PostgreSQL
- all
Este arquivo controla:
- sameuser (para quando o usurio tiver o mesmo nome
- Quais hosts tm permisso de conectar
do banco)
- Como os clientes so autenticados
- Nomes dos usurios que podem usar

- samerole (para quando o usurio for membro de uma


role (papel) com o mesmo nome de um banco)

- Quais bancos eles podem acessar

- um nome de banco ou

Os registros deste arquivo tm as formas seguintes:

- uma lista separados por vrgula


USER pode ser:

1. local DATABASE USER METHOD [OPTION]

- all (para qualquer usurio)


68

34.1. 11.1 - PG_HBA.CONF

69

- um nome de usurio

password - envia senha em texto claro

- um nome de grupo prexado por "+"

md5 - deve ser preferido, pois envia senhas criptografadas

- uma lista separados por vrgula


Tanto no campo DATABASE quanto no USER podemos
tambm escrever um nome de arquivo prexado com "@"
para incluir nomes em um arquivo separado

1. TYPE DATABASE USER CIDR-ADDRESS


METHOD

1. IPv4 local connections:


CIDR-ADDRESS especica uma faixa de IPs. Atravs
de um endereo de IP e de uma mscara que um inteiro (entre 0 e 32 para IPV4 ou de 128 para IPV6),que host all all 127.0.0.1/32 md5
especica o nmero de bits signicativos da mscara.
1. IPv6 local connections:
Alternativamente podemos escrever o IP separado da
mscara em colunas diferentes para especicar o con1. host all all ::1/128 md5
junto de hosts.
Exemplos (IPV4):
172.20.143.89/32 para um nico host

Alerta: este arquivo examinado sequencialmente para


cada tentativa de conexo.

172.20.143.0/24 para uma rede

A ordem dos registros signicativa.


O campo CIDR-ADDRESS somente se aplica aos regis- Caso um registro que venha primeiro entre em conito
tros host, hostssl e hostnossl.
com outro que vem em seguida, o primeiro ser executado e o segundo, no.
IP-address e IP-mask
Estes campos podem ser utilizados como alternativa no- Exemplos:
tao CIDR-ADDRESS. ao invs
1. TYPE DATABASE USER CIDR-ADDRESS
de especicar o comprimento da mscara, a atual mscara
METHOD
especicada em uma coluna separada.
Exemplo:

local all all md5


255.0.0.0 representa uma mscara CIDR em IPV4 com
local all all trust
comprimenro 8
255.255.255.255 representa uma mscara CIDR com Acima todas as conexes locais exigiro senha md5.
comprimenro 32

local all all trust

172.20.143.89 255.255.255.255

local all all md5

Estes campos somente se aplica aos registros host, hostssl J este acima aceitar todas as conexes locais incondicie hostnossl.
onalmente (sem senha)
METHOD pode ser trust, reject, md5, crypt, A segunda linha ser ignorada.
password,
Veja vrios exemplos do pg_hba.conf e mais detlahes no
captulo 20 do manual ocial do PostgreSQL em
1. krb5, ident, ou pam
Observe que conexes locais no usam o campo CIDRtrust - permite conexo a qualquer um incondicional- ADDRESS.
mente (sem senha)
Exemplos no pg_hba.conf:
reject - rejeita conexo incondicionalmente para o Conexo local via socket
user/host especicado
local all all md5
crypt - recomendada somente para verses inferiores a
Conexo local via TCP/IP
7.2. Atualmente recomenda-se md5
krb5 - somente disponvel para conexes via TCP/IP

host all all 127.0.0.1/32 md5

ident - Obtm o nome do usurio do sistema operacio- Conexo local via TCP/IP com mscara separada
nal. Para conexes TCP/IP contacta o servidor ident no host all all 127.0.0.1 255.255.255.255 md5
cliente. Para conexes locais, recebendo este do sistema
Conexo para uma rede (ident sameuser) via TCP/IP
operacional.
pam - usando o servio PAM (Pluggable Authentication host banco usuario 192.168.93.0/24 ident sameuser
Modules) do sistema operacional

Conexo rejeitada via TCP/IP para o IP, usurio e banco

70

CAPTULO 34. POSTGRESQL PRTICO/CONFIGURAES/CONFIGURAR ACESSOS

host banco usuario 192.168.93.1/32 reject


ident

1. Aceitar toda a Internet, exceto 200.217.23.234

1. TYPE DATABASE USER IP-ADDRESS IPObtm o nome de usurio do sistema operacional do cliMASK METHOD
ente (para conexes TCP/IP fazendo contato com o servidor de identicao no cliente, para conexes locais obtendo a partir do sistema operacional) e verica se o usu- host all all 200.217.23.234 255.255.255.255 reject host
rio possui permisso para se conectar como o usurio de all all 0.0.0.0 0.0.0.0 md5
banco de dados solicitado consultando o mapa especi- Mais detalhes sobre o pg_hba.conf em:
cado aps a palavra chave ident.
http://pgdocptbr.sourceforge.net/pg80/
Exemplo para Ubuntu (facilmente adaptvel para outras client-authentication.html
distros e SOs).
Se instalado pelo repositrio:
- sudo gedit /etc/postgresql/8.1/main/postgresql.conf
Altere:
1. listen_addresses = 'localhost'
para:
listen_addresses = '*'
Aqui tambm existem outras importantes conguraes,
como datestyle = 'sql, dmy' # Datas no estilo brasileiro
dd/mm/aaaa
client_encoding = latin1 # suporte nossa acentuao
- sudo gedit /etc/postgresql/8.1/main/pg_hba.conf
1. TIPO BANCO USURIO CIDR-ADDRESS MTODO
1. local para domnios Unix somente com conexes
via socket
1. no requer IP
local all all md5
1. Conexes locais via IPv4:
host all all 127.0.0.1/32 md5
1. Conexes locais via IPv6:
host all all ::1/128 md5
1. Conexes para todos os IPs de uma subrede
(10.0.0.0)
1. TYPE DATABASE USER IP-ADDRESS IPMASK METHOD
host all all 10.43.0.0 255.0.0.0 md5
Opo para permitir acesso atravs de toda a internet:

Captulo 35

PostgreSQL
Prtico/Conguraes/Conguraes
Diversas
35.1 11.2 - postgresql.conf
O postgresql.conf permite congurar as demais funcionalidades do PostgreSQL
Liberando acesso via rede TCP/IP na verso 7.4.x:
tcp_socket = true (default = false)
No 8.0.x: listen_address = '10.0.0.16'
Alguns conguraes do postgresql.conf: Regra geral: os
valores que vm comentados com # so os valores default.
Se formos alterar algum idealmente devemos fazer uma
cpia da linha e descomentar, para sempre saber o valor
default.

1024 # min 64, size in KB #maintenance_work_mem


= 16384 # min 1024, size in KB #max_stack_depth
= 2048 # min 100, size in KB # - Free Space Map #max_fsm_pages = 20000 # min max_fsm_relations*16,
6 bytes each #max_fsm_relations = 1000 # min 100, ~70
bytes each Algumas Conguraes no postgresql.conf
... # AUTOVACUUM PARAMETERS #autovacuum
= o # enable autovacuum subprocess? ... # - Locale
and Formatting - #datestyle = 'iso, mdy' # Era o original
datestyle = 'sql, european' # Formato dd/mm/yyyy ...
#client_encoding = sql_ascii #client_encoding = latin1 #
Suporte acentuao do Brasil ...

Consultando no psql: SHOW DATESTYLE;


sameuser o usurio padro no ident.conf (signica o
Retorna -> SQL, DMY
mesmo user do sistema operacional).
# FILE LOCATIONS #hba_le = 'Cong- Ajustando o estilo da data no psql: SET DATESTYLE
Dir/pg_hba.conf' # host-based authentication le # TO SQL, DMY;
CONNECTIONS AND AUTHENTICATION # Connection Settings # # O parmetro listen_address
dene que interfaces de rede do servidor, atravs
de seus endereos IP, aceitam tentativas de conexo
via TCP/IP #listen_addresses = 'localhost' # Quais
endereos IP ou nomes onde sero feitas as escutas;
# lista de endereos/nomes separados por vrgula; #
se fr omitido, o default 'localhost' # '*' = todas
interfaces de rede estaro habilitadas para escutar
requisies #port = 5432 max_connections = 100 (duas
so reservadas para o superusurio) # note: increasing
max_connections costs ~400 bytes of shared memory
per #superuser_reserved_connections = 2 # - Security
& Authentication - #authentication_timeout = 60 #
1-600, in seconds #ssl = o #password_encryption = on
# RESOURCE USAGE (except WAL) # - Memory shared_buers = 1000 # min 16 or max_connections*2,
8KB each #temp_buers = 1000 # min 100, 8KB each
#max_prepared_transactions = 5 # can be 0 or more #
note: increasing max_prepared_transactions costs ~600
bytes of shared memory # per transaction slot, plus lock
space (see max_locks_per_transaction). #work_mem =

ALTER ROLE nomeuser SET datestyle TO SQL, DMY;


O caminho de entrada num banco do PostgreSQL: ->
postgresql.conf -> ph_hba.conf -> ident.conf (caso este
exista e seja citado no pg_hba.conf)
O encoding e outros recursos podem ser passados para
cada banco, no momento de sua criao, como por exemplo:
De fora do banco: createdb -E LATIN1 nomebanco.
De dentro do banco (psql): CREATE DATABASE nomebanco WITH ENCODING 'LATIN1';
Para a relao completa dos encoding suportados veja tabela 21-2. Para visualizar a codicao no psql digite
\encoding.
Para mudar a codicao de um banco dinamicamente,
estando nele utilize: \encoding novoencoding
Como tambm podemos utilizar o comando SET: SET
CLIENT_ENCODING 'LATIN1'; Consultando o encoding existente SHOW CLIENT_ENCODING;

71

72

CAPTULO 35. POSTGRESQL PRTICO/CONFIGURAES/CONFIGURAES DIVERSAS

PARA DESFAZER AS ALTERAES E VOLTAR CODIFICAO PADRO: RESET CLIENT_ENCODING;


Mais detalhes:
http://www.postgresql.org/docs/8.1/
interactive/runtime-config.html#CONFIG-SETTING
Para saber os locales existentes execute de dentro do psql:
\l -- Exibe bancos, donos e locales (Codicao)
Em cada conexo com o PostgreSQL, somente se pode
acessar um nico banco. No postgresql.conf podemos
denir o encoding atravs da varivel client_encoding.

Captulo 36

PostgreSQL Prtico/Metadados
36.1 12 - Metadados (Catlogo)

Mostrar Sequences de um Esquema

Metadados so dados sobre dados.


Uma consulta normal retorna informaes existentes em
tabelas, j uma consulta sobre os metadados retorna informaes sobre os bancos, os objetos dos bancos, os
campos de tabelas, seus tipos de dados, seus atributos,
suas constraints, etc.
Retornar Todas as Tabelas do banco e esquema atual
SELECT schemaname AS esquema, tablename AS tabela, tableowner AS dono FROM pg_catalog.pg_tables
WHERE schemaname NOT IN ('pg_catalog', 'information_schema', 'pg_toast') ORDER BY schemaname, tablename

SELECT c.relname AS seqname,


u.usename
AS
seqowner,
pg_catalog.obj_description(c.oid,
'pg_class) AS seqcomment,
(SELECT spcname
FROM
pg_catalog.pg_tablespace
pt
WHERE pt.oid=c.reltablespace) AS tablespace
FROM pg_catalog.pg_class c, pg_catalog.pg_user
u,
pg_catalog.pg_namespace
n
WHERE
c.relowner=u.usesysid AND c.relnamespace=n.oid
AND c.relkind = 'S' AND n.nspname='public' ORDER
BY seqname
Mostrar Tablespaces
SELECT spcname, pg_catalog.pg_get_userbyid(spcowner)
AS
spcowner,
spclocation
FROM
pg_catalog.pg_tablespace
Mostrar detalhes de uma function

Informaes de Todos os Tablespaces

SELECT pc.oid AS prooid, proname, lanname as


SELECT spcname, pg_catalog.pg_get_userbyid(spcowner)
prolanguage,
pg_catalog.format_type(prorettype,
AS
spcowner,
spclocation
FROM
NULL) as proresult,
prosrc,
probin,
propg_catalog.pg_tablespace
retset,
proisstrict,
provolatile,
prosecdef,
Retornar banco, dono, codicao, comentrios e ta- pg_catalog.oidvectortypes(pc.proargtypes)
AS
blespace
proarguments,
proargnames
AS
proargnames,
'pg_proc')
SELECT pdb.datname AS banco, pu.usename AS pg_catalog.obj_description(pc.oid,
AS
procomment
FROM
pg_catalog.pg_proc
pc,
dono, pg_encoding_to_char(encoding) AS codicapg_catalog.pg_language
pl
WHERE
pc.oid
=
cao, (SELECT description FROM pg_description pd
'oid_da_function'::oid
AND
pc.prolang
=
pl.oid
WHERE pdb.oid=pd.objoid) AS comentario, (SELECT
spcname FROM pg_catalog.pg_tablespace pt WHERE
pt.oid=pdb.dattablespace) AS tablespace FROM
pg_database pdb, pg_user pu WHERE pdb.datdba =
pu.usesysid ORDER BY pdb.datname

Este exemplo mostra uma consulta que lista os nomes dos esquemas, tabelas, colunas e chaves das chaves estrangeiras, e os nomes dos esquemas, tabelas e colunas referenciadas. Exemplo tirado da lista de discusso
Tabelas, donos, comentrios, registros e tablespaces pgsql-sql
de um schema
CREATE TEMPORARY TABLE t1 (id SERIAL
SELECT
c.relname
as
tabela, PRIMARY KEY, nome TEXT); CREATE TEMpg_catalog.pg_get_userbyid(c.relowner)
AS
dono, PORARY TABLE t2 (id INT REFERENCES
pg_catalog.obj_description(c.oid,
'pg_class)
AS t1, nome TEXT); SELECT n.nspname AS escomentario, reltuples::integer as registros, (SE- quema, cl.relname AS tabela, a.attname AS coluna,
LECT spcname FROM pg_catalog.pg_tablespace ct.conname AS chave, nf.nspname AS esquema_ref,
pt WHERE pt.oid=c.reltablespace) AS tables- clf.relname AS tabela_ref, af.attname AS coluna_ref,
pace FROM pg_catalog.pg_class c LEFT JOIN pg_get_constraintdef(ct.oid) AS criar_sql FROM
pg_catalog.pg_namespace n ON n.oid = c.relnamespace pg_catalog.pg_attribute a JOIN pg_catalog.pg_class
WHERE c.relkind = 'r' AND nspname='public' ORDER cl ON (a.attrelid = cl.oid AND cl.relkind = 'r')
JOIN pg_catalog.pg_namespace n ON (n.oid =
BY c.relname
73

74

CAPTULO 36. POSTGRESQL PRTICO/METADADOS

cl.relnamespace) JOIN pg_catalog.pg_constraint ct


ON (a.attrelid = ct.conrelid AND ct.confrelid != 0 AND
ct.conkey[1] = a.attnum) JOIN pg_catalog.pg_class
clf ON (ct.confrelid = clf.oid AND clf.relkind =
'r') JOIN pg_catalog.pg_namespace nf ON (nf.oid
= clf.relnamespace) JOIN pg_catalog.pg_attribute
af ON (af.attrelid = ct.confrelid AND af.attnum =
ct.confkey[1]);

Dado o banco de dados, qual o seu diretrio:


select datname, oid from pg_database;
Dado a tabela, qual o seu arquivo:
select relname, rellenode from pg_class;
Mostrar chaves primrias das tabelas do esquema
public

select indexrelname as indice, relname as tabela from


pg_catalog.pg_statio_user_indexes as A INNER JOIN
SELECT n.nspname as esquema, c.relname as ta- pg_catalog.pg_index as B ON A.indexrelid=B.indexrelid
bela, a.attname as campo, format_type(t.oid, null) as WHERE A.schemaname='public' AND B.indisprimary
tipo_de_dado FROM pg_namespace n, pg_class c, = true;
pg_attribute a, pg_type t WHERE n.oid = c.relnamespace
and c.relkind = 'r' -- no indices and n.nspname not Para visualizar como as consultas so feitas internalike 'pg\\_%' -- no catalogs and n.nspname != 'informa- mente via psql usamos o comando assim:
tion_schema' -- no information_schema and a.attnum > psql -U user banco -E
0 -- no system atts and not a.attisdropped -- no dropped
Vamos usar o banco municipios, criado com os mucolumns and a.attrelid = c.oid and a.atttypid = t.oid ORnicpios do Brasil. A tabela opt_cidades.
DER BY nspname, relname, attname;
Veja Um Exemplo Que Retorna a Chave Primria da TaMostrar Esquemas e respectivas tabelas do Banco
bela opt_cidades
atual:
SELECT ic.relname AS index_name, bc.relname AS
SELECT n.nspname as esquema, c.relname as tabela
tab_name, ta.attname AS column_name, i.indisunique
FROM pg_namespace n, pg_class c WHERE n.oid =
AS unique_key, i.indisprimary AS primary_key
c.relnamespace and c.relkind = 'r' -- no indices and
n.nspname not like 'pg\\_%' -- no catalogs and n.nspname FROM pg_class bc, pg_class ic, pg_index i, pg_attribute
!= 'information_schema' -- no information_schema OR- ta, pg_attribute ia WHERE bc.oid = i.indrelid AND
ic.oid = i.indexrelid AND ia.attrelid = i.indexrelid AND
DER BY nspname, relname
ta.attrelid = bc.oid AND bc.relname = 'opt_cidades
Contar Todos os Registros de todas as tabelas de toAND ta.attrelid = i.indrelid AND ta.attnum =
dos os bancos:
i.indkey[ia.attnum-1] ORDER BY index_name,
<?php
$conexao=pg_connect(host=127.0.0.1 tab_name, column_name;
user=postgres password=postabir); $sql="SELECT
Retornar:
datname AS banco FROM pg_database ORDER
BY datname"; $consulta=pg_query($conexao,$sql); index_name | tab_name | column_name | unique_key |
$banco = array();
$c=0;
while ($data = primary_key
@pg_fetch_object($consulta,$c))
{
$cons=$data- opt_cidades_pkey | opt_cidades | id | t | t
>banco; $banco[] .= $cons; $c++; } $sql2="SELECT
n.nspname as esquema,c.relname as tabela FROM Retornando o Nome do Esquema
pg_namespace n, pg_class c WHERE n.oid = SELECT n.nspname AS Esquema FROM
c.relnamespace and c.relkind = 'r' -- no indices and pg_catalog.pg_namespace AS n, pg_catalog.pg_class
n.nspname not like 'pg\\_%' -- no catalogs and n.nspname AS c WHERE c.relnamespace = n.oid AND
!= 'information_schema' -- no information_schema c.relname='opt_cidades;
ORDER BY nspname, relname"; for ($x=0; $x <
count($banco);$x++){ if ($banco[$x] !="template0 Retorno: Esquema
&& $banco[$x] != template1 && $banco[$x] !="post- Retornar nomes de bancos:
gres){ $conexao2=pg_connect(host=127.0.0.1 db- SELECT datname AS banco FROM pg_database
name=$banco[$x] user=postgres password=postabir); WHERE datname != 'template0' and datname != 'tem$consulta2=pg_query(
$conexao2,
$sql2
); plate1' and datname != 'postgres ORDER BY datname
while ($data = pg_fetch_object($consulta2)) {
Retornar nomes e OIDs dos bancos:
$esquematab=$data->esquema.'.'.$data->tabela;
$sql3="SELECT
count(*)
FROM
$esquema- SELECT oid, datname FROM pg_database;
tab";
$consulta3=pg_query($conexao2,$sql3);
$res=@pg_fetch_array($consulta3);
print Dado a tabela, qual o seu arquivo: select relname, rel'Banco.Esquema.Tabela
->
'.$banco[$x].'.'.$data- lenode from pg_class;
>esquema.'.'.$data->tabela.' - Registro(s) - '.$res[0].'
No Windows
'; $total += $res[0]; } } } print Total de Registro de
Podemos passar parmetros para as macros, por exemplo:
todas as tabelas de todos os bancos ". $total; ?>
Mostrar Esquemas e Tabelas

36.1. 12 - METADADOS (CATLOGO)

75

doskey /exename=psql.exe dbinfo=SELECT dat- Tabelas e Soma


name,pg_encoding_to_char(encoding)
FROM SELECT tablename, SUM( size_kb )
pg_database WHERE datname='$1';
FROM
E ento apenas passar o parmetro na linha de comando:
( SELECT c1.relname AS tablename,
postgres=# dbinfo postgres
c2.relpages * 8 AS size_kb
Listar tabelas, e dono do esquema atual:
FROM pg_class c1, pg_class c2, pg_index i
SELECT n.nspname as Schema,
WHERE c1.oid = i.indrelid
c.relname as Tabela,
AND i.indexrelid = c2.oid
CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v'
UNION
THEN 'view' WHEN 'i' THEN
'index' WHEN 'S' THEN 'sequence' WHEN 's THEN SELECT relname, relpages * 8
'special' END as Tipo,
FROM pg_class
u.usename as Dono
WHERE relkind = 'r' ) AS relations
FROM pg_catalog.pg_class c

GROUP BY tablename;
LEFT JOIN pg_catalog.pg_user u ON u.usesysid = -- r = ordinary table, i = index, S = sequence, v = view, c
c.relowner
= composite type, -- s = special, t = TOAST table
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = Tamanho em bytes de um banco:
c.relnamespace
select pg_database_size('banco');
WHERE c.relkind IN ('r',)
Tamanho em bytes de uma tabela:
AND n.nspname NOT IN ('pg_catalog', 'pg_toast')
pg_total_relation_size('tabela')
AND pg_catalog.pg_table_is_visible(c.oid)
Tamanho em bytes de tabela ou ndice:
ORDER BY 1,2;
pg_relation_size('tabelaouindice')
Listar Tabelas
Lista donos e bancos:
select c.relname FROM pg_catalog.pg_class c
SELECT rolname as dono, datname as banco
LEFT JOIN pg_catalog.pg_namespace n ON n.oid =
FROM pg_roles, pg_database
c.relnamespace
WHERE c.relkind IN ('r',) AND n.nspname NOT IN WHERE pg_roles.oid = datdba
('pg_catalog', 'pg_toast')

ORDER BY rolname, datname;

AND pg_catalog.pg_table_is_visible(c.oid);

Nomes de bancos:

SELECT tablename FROM pg_tables WHERE table- select datname from pg_database where datname not in
name NOT LIKE 'pg%' AND tablename NOT LIKE ('template0','template1') order by 1
'sql\_%'
Nomes e colunas:
Listar todas as tabelas, ndices, tamanho em KB e
select tablename,'T' from pg_tables where tablename not
OIDs:
like 'pg\_%' and tablename not in ('sql_features,
VACUUM; --Executar antes este comando
'sql_implementation_info',
'sql_languages,
'sql_packages, 'sql_sizing', 'sql_sizing_proles)
SELECT c1.relname AS tabela, c2.relname AS indice,
c2.relpages * 8 AS tamanho_kb, c2.rellenode AS ar- union
quivo
select viewname,'V' from pg_views where viewname not
like 'pg\_%'
FROM pg_class c1, pg_class c2, pg_index i
WHERE c1.oid = i.indrelid AND i.indexrelid = c2.oid

Tamanho de esquema e ndice:

UNION

SELECT nspname,

SELECT relname, NULL, relpages * 8, rellenode

sum(relpages * cast( 8192 AS bigint )) as table size,

FROM pg_class

sum( ( select sum(relpages)

WHERE relkind = 'r'

from pg_class i, pg_index idx where i.oid = idx.indexrelid


and t.oid=idx.indrelid ) ) * cast( 8192 AS bigint ) as in-

ORDER BY tabela, indice DESC, tamanho_kb;

76

CAPTULO 36. POSTGRESQL PRTICO/METADADOS

dex size,

CREATE TEMP TABLE teste1 (id INT, texto TEXT,


sum ( relpages * cast( 8192 AS bigint ) + ( select PRIMARY KEY (id));
sum(relpages)
CREATE TEMP TABLE teste2 (id1 INT, id2 INT, texto
from pg_class i, pg_index idx where i.oid = idx.indexrelid TEXT, PRIMARY KEY (id1,id2));
and t.oid=idx.indrelid ) * cast( 8192 AS bigint ) ) as size \dt
FROM pg_class t, pg_namespace

SELECT

WHERE relnamespace = pg_namespace.oid

pg_namespace.nspname AS esquema, pg_class.relname


AS tabela, pg_attribute.attname AS coluna_pk
FROM
pg_class
JOIN
pg_namespace
ON
pg_namespace.oid=pg_class.relnamespace
AND
pg_namespace.nspname NOT LIKE 'pg_%' JOIN
pg_attribute ON pg_attribute.attrelid=pg_class.oid
AND
pg_attribute.attisdropped='f'
JOIN
pg_index
ON
pg_index.indrelid=pg_class.oid
AND
pg_index.indisprimary='t'
AND
(
pg_index.indkey[0]=pg_attribute.attnum
OR
pg_index.indkey[1]=pg_attribute.attnum
OR
pg_index.indkey[2]=pg_attribute.attnum
OR
pg_index.indkey[3]=pg_attribute.attnum
OR
pg_index.indkey[4]=pg_attribute.attnum
OR
pg_index.indkey[5]=pg_attribute.attnum
OR
pg_index.indkey[6]=pg_attribute.attnum
OR
pg_index.indkey[7]=pg_attribute.attnum
OR
pg_index.indkey[8]=pg_attribute.attnum
OR
pg_index.indkey[9]=pg_attribute.attnum
)
ORDER
BY
pg_namespace.nspname,
pg_class.relname,pg_attribute.attname;

and pg_namespace.nspname not like 'pg_%'


and pg_namespace.nspname != 'information_schema'
and relkind = 'r' group by nspname;
Retornando Tabelas e Seus Donos de um Esquema
SELECT n.nspname as public,
c.relname as opt_cidades, CASE c.relkind WHEN 'r'
THEN 'tabela' WHEN 'v' THEN 'view' WHEN 'i' THEN
'ndice' WHEN 'S' THEN
'sequencia' WHEN 's THEN 'especial' END as Tipo,
u.usename as Dono
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_user u ON u.usesysid =
c.relowner LEFT JOIN pg_catalog.pg_namespace n ON
n.oid = c.relnamespace
WHERE c.relkind IN ('r',)

AND n.nspname NOT IN ('pg_catalog', 'pg_toast') AND


Este exemplo mostra uma consulta que lista os nopg_catalog.pg_table_is_visible(c.oid)
mes dos esquemas, tabelas, colunas e chaves das chaORDER BY 1,2;
ves estrangeiras, e os nomes dos esquemas, tabelas
e colunas referenciadas. Exemplo tirado da lista de
Retorno:
discusso pgsql-sql
public | opt_cidades | Tipo | Dono

CREATE TEMPORARY TABLE t1 (id SERIAL


PRIMARY KEY, nome TEXT); CREATE TEMpublic | opt_cidades | tabela | postgres public | opt_estado PORARY TABLE t2 (id INT REFERENCES
| tabela | postgres
t1, nome TEXT); SELECT n.nspname AS esquema, cl.relname AS tabela, a.attname AS coluna,
Retornando o OID e o Esquema de uma Tabela
ct.conname AS chave, nf.nspname AS esquema_ref,
SELECT c.oid AS OID,
clf.relname AS tabela_ref, af.attname AS coluna_ref,
pg_get_constraintdef(ct.oid) AS criar_sql FROM
n.nspname AS Esquema, c.relname AS Tabela
pg_catalog.pg_attribute a JOIN pg_catalog.pg_class
FROM pg_catalog.pg_class c
cl ON (a.attrelid = cl.oid AND cl.relkind = 'r')
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = JOIN pg_catalog.pg_namespace n ON (n.oid =
c.relnamespace
cl.relnamespace) JOIN pg_catalog.pg_constraint ct
ON (a.attrelid = ct.conrelid AND ct.confrelid != 0 AND
WHERE pg_catalog.pg_table_is_visible(c.oid)
ct.conkey[1] = a.attnum) JOIN pg_catalog.pg_class
AND c.relname ~ '^opt_cidades$'
clf ON (ct.confrelid = clf.oid AND clf.relkind =
'r') JOIN pg_catalog.pg_namespace nf ON (nf.oid
ORDER BY 2, 3;
= clf.relnamespace) JOIN pg_catalog.pg_attribute
Retorno:
af ON (af.attrelid = ct.confrelid AND af.attnum =
OID | Esquema | Tabela
ct.confkey[1]);
+------------------+--------+----------

Este exemplo mostra uma consulta que lista os esque- Retorno:


mas, nomes das tabelas e nomes das colunas das cha- esquema | tabela | coluna | chave | esquema_ref | taves primrias de um banco de dados. Exemplo tirado bela_ref | coluna_ref |
da lista de discusso pgsql-sql .

36.1. 12 - METADADOS (CATLOGO)

77

criar_sql

Depois de criada a tabela vamos criar a consulta que nos


pg_temp_1 | t2 | id | t2_id_fkey | pg_temp_1 | t1 | id | retornar as informaes da tabela:
FOREIGN KEY (id)
SELECT
REFERENCES t1(id)

rel.nspname AS Esquema, rel.relname AS Tabela,


SELECT a.attnum, a.attname AS eld, t.typname as attrs.attname AS Campo, Type, Default, attype, a.attlen AS length, a.atttypmod-4 as lengthvar, trs.attnotnull AS NOT NULL
a.attnotnull as notnull
FROM (
FROM pg_class c, pg_attribute a, pg_type t WHERE SELECT c.oid, n.nspname, c.relname
c.relname = 'apagar' AND a.attnum > 0 AND a.attrelid = FROM pg_catalog.pg_class c
c.oid AND a.atttypid = t.oid ORDER BY a.attnum;
LEFT JOIN pg_catalog.pg_namespace n ON n.oid =
Sada:
c.relnamespace
ID do campo, nomecampo, tipo, tamanho, nulo/nonulo WHERE pg_catalog.pg_table_is_visible(c.oid) ) rel
Outros

JOIN (
SELECT ic.relname AS index_name, bc.relname AS SELECT
a.attname,
a.attrelid,
tab_name, ta.attname AS column_name, i.indisunique pg_catalog.format_type(a.atttypid,
a.atttypmod) as
AS unique_key, i.indisprimary AS primary_key
Type,
FROM pg_class bc, pg_class ic, pg_index i, pg_attribute (SELECT substring(d.adsrc for 128) FROM
ta, pg_attribute ia WHERE (bc.oid = i.indrelid) AND pg_catalog.pg_attrdef d
(ic.oid = i.indexrelid) AND (ia.attrelid = i.indexrelid)
AND (ta.attrelid = bc.oid) AND (bc.relname = 'apa- WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum
gar') AND (ta.attrelid = i.indrelid) AND (ta.attnum AND a.atthasdef) as Default, a.attnotnull, a.attnum
= i.indkey[ia.attnum-1]) ORDER BY index_name, FROM pg_catalog.pg_attribute a WHERE a.attnum >
tab_name, column_name
0 AND NOT a.attisdropped ) attrs ON (attrs.attrelid =
rel.oid ) WHERE relname = 'tabela_exemplo' ORDER
Sada:
BY attrs.attnum;
nomeindex/chave, nometabela, nomecampo, unique(t/f),
Retorno: testes-# WHERE relname = 'tabela_exemplo'
nomepk (t/f)
ORDER BY attrs.attnum;
SELECT rcname as index_name, rcsrc
esquema | tabela | campo | Type | Default | NOT NULL
FROM pg_relcheck, pg_class bc WHERE rcrelid =
bc.oid AND bc.relname = 'apagar' AND NOT EXISTS Antes de tudo devemos criar um novo tipo de dado rela( SELECT * FROM pg_relcheck as c, pg_inherits as i cionado ao retorno que obteremos da funo:
WHERE i.inhrelid = pg_relcheck.rcrelid AND c.rcname CREATE TYPE tabela_estrutura AS (Esquema text, Ta= pg_relcheck.rcname AND c.rcsrc = pg_relcheck.rcsrc bela text, Campo text, Tipo text, Valor text, AutoIncreAND c.rcrelid = i.inhparent )
mento bool);
Sada: retorna as constraints check.
A funo abaixo denida em PL/PgSQL, linguagem
SELECT pg_class.relname,
pg_attribute.attname,
pg_type.typname,
pg_attribute.atttypmod4
FROM
pg_class,
pg_attribute,
pg_type
WHERE
pg_attribute.attrelid
=
pg_class.oid
AND pg_attribute.atttypid = pg_type.oid AND
pg_class.relname = 'apagar' AND pg_attribute.attname
= 'descricao'

procedural muito semelhante ao PL/SQL do Oracle.


A funo foi criada nesta linguagem devido a certas
limitaes que as funes em SQL possuem.

CREATE OR REPLACE FUNCTION Dados_Tabela(varchar(30))


RETURNS
SETOF tabela_estrutura AS ' DECLARE r tabela_estrutura%ROWTYPE; rec RECORD; vTabela
alias for $1; eSql TEXT; BEGIN eSql := SELECT
Sada: tabela, campo, tipo, tamanho (varchar)
CAST(rel.nspname as TEXT), CAST(rel.relname
Outros Exemplos
AS TEXT) , CAST(attrs.attname AS TEXT),
create table tabela_exemplo (
CAST(Type AS TEXT), CAST(Default AS TEXT),
attrs.attnotnull FROM (SELECT c.oid, n.nspname,
campo_1 integer default 5, campo_2 text default 'exemc.relname FROM pg_catalog.pg_class c LEFT JOIN
plo', campo_3 oat(10),
pg_catalog.pg_namespace n ON n.oid = c.relnamespace
campo_4 serial, campo_5 double precision, campo_6 WHERE
pg_catalog.pg_table_is_visible(c.oid)
int8, campo_7 Point,
) rel JOIN (SELECT a.attname,
a.attrelid,
pg_catalog.format_type(a.atttypid,
a.atttypmod)
campo_8 char(3), campo_9 varchar(17) );
as Type, (SELECT substring(d.adsrc for 128)

78

CAPTULO 36. POSTGRESQL PRTICO/METADADOS

FROM pg_catalog.pg_attrdef d WHERE d.adrelid


= a.attrelid AND d.adnum = a.attnum AND
a.atthasdef) as Default, a.attnotnull, a.attnum FROM
pg_catalog.pg_attribute a WHERE a.attnum > 0 AND
NOT a.attisdropped ) attrs ON (attrs.attrelid = rel.oid )
WHERE relname LIKE '% || vTabela || %' ORDER
BY attrs.attnum; FOR r IN EXECUTE eSql LOOP
RETURN NEXT r; END LOOP; IF NOT FOUND
THEN RAISE EXCEPTION Tabela % no encontrada,
vTabela; END IF; RETURN; END ' LANGUAGE
'plpgsql';

and n.nspname not like 'pg\\_%' -- no catalogs

Para utilizar esta funo, utilize o seguinte comando:


SELECT * FROM Dados_Tabela('tabela');
Retorno:
esquema | tabela | campo | tipo | valor | autoincremento
Exemplos contidos no arquivo:
/usr/local/src/postgresql-8.1.3/src/tutorial/syscat.sql
SELECT rolname as Donos, datname as Bancos
FROM pg_roles, pg_database WHERE pg_roles.oid =
datdba ORDER BY rolname, datname;
Retorno: Donos e Bancos
SELECT n.nspname as esquema, c.relname as tabela FROM pg_class c, pg_namespace n WHERE
c.relnamespace=n.oid and c.relkind = 'r' -- not indices,
views, etc and n.nspname not like 'pg\\_%' -- not catalogs
and n.nspname != 'information_schema' -- not information_schema ORDER BY nspname, relname;
Retorno: Esquemas e Tabelas
SELECT n.nspname as esquema, c.relname as tabela, a.attname as campo, format_type(t.oid, null) as
tipo_de_dado FROM pg_namespace n, pg_class c,
pg_attribute a, pg_type t WHERE n.oid = c.relnamespace
and c.relkind = 'r' -- no indices and n.nspname not
like 'pg\\_%' -- no catalogs and n.nspname != 'information_schema' -- no information_schema and a.attnum >
0 -- no system atts and not a.attisdropped -- no dropped
columns and a.attrelid = c.oid and a.atttypid = t.oid ORDER BY nspname, relname, attname;
Retorno: esquemas, tabelas, campos, tipos de dados
SELECT n.nspname, o.oprname AS binary_op,
format_type(left_type.oid, null) AS left_opr, format_type(right_type.oid, null) AS right_opr, format_type(result.oid, null) AS return_type FROM
pg_namespace n, pg_operator o, pg_type left_type,
pg_type right_type,
pg_type result WHERE
o.oprnamespace = n.oid and o.oprkind = 'b' -- binary and o.oprleft = left_type.oid and o.oprright =
right_type.oid and o.oprresult = result.oid ORDER BY
nspname, left_opr, right_opr;
Retorno: operadores binrios
Baypassar os de sistema:

SELECT n.nspname, p.proname, format_type(t.oid,


null) as typname FROM pg_namespace n, pg_aggregate
a, pg_proc p, pg_type t WHERE p.pronamespace = n.oid
and a.aggfnoid = p.oid and p.proargtypes[0] = t.oid ORDER BY nspname, proname, typname;
Retorno: lista todas as funes agregadas e os tipos que
podem ser aplicados
Dado o banco de dados, qual o seu diretrio:
select datname, oid from pg_database;
Dado a tabela, qual o seu arquivo:
select relname, rellenode from pg_class;
Exemplo que retorna ndice, campo, tipo, comprimento, null, default:
SELECT pg_attribute.attnum AS index,
attname AS eld, typname AS type, atttypmod-4
as length, NOT attnotnull AS null, adsrc AS
default FROM pg_attribute, pg_class, pg_type,
pg_attrdef WHERE pg_class.oid=attrelid AND
pg_type.oid=atttypid AND attnum >0 AND
pg_class.oid=adrelid AND adnum=attnum AND
atthasdef='t' AND lower(relname)='datas UNION
SELECT pg_attribute.attnum AS index, attname AS
eld, typname AS type, atttypmod-4 as length, NOT
attnotnull AS null, AS default FROM pg_attribute,
pg_class, pg_type WHERE pg_class.oid=attrelid AND
pg_type.oid=atttypid AND attnum>0 AND atthasdef='f'
AND lower(relname)='datas;

Captulo 37

PostgreSQL Prtico/Conectividade
37.1 13 - Conectividade

AtivConex.ActiveConnection = Conex

End Sub
Vou mostrar a conectividade do PostgreSQL com o PHP, Exemplo Bsico de Java Acessando PostgreSQL Via
com o Java e com o Visual BASIC.
JDBC
Tambm mostrarei a conectividade atravs do ODBC Crie no PostgreSQL um pequeno banco de dados chacom o Access.
mado agenda com uma nica tabela chamada amigos.
Conectando com o PHP

Esta tabela contendo os campos nome e email apenas.


Com o PHP existe uma conexo nativa. Veja um exem- Cadastre um ou mais registros para melhor visualizao
dos resultados.
plo:
$conexao = pg_connect(host=127.0.0.1 dbname=testes import java.sql.*;
user=postgres password=******* port=5432);
public class SQLStatement {
if (!$conexao){
public static void main(String args[]) { //String url =
echo Falha na conexo com o banco. Veja detalhes tc- "jdbc:postgresql://10.0.1.53:5432/agenda"; String url =
"jdbc:postgresql://localhost:5432/agenda"; //String url =
nicos: " . pg_last_error($conexao); }
"jdbc:postgresql:agenda"; //Assim pega os defaults ConConexo com Java
nection con; String query = select * from amigos; StateA conexo do PostgreSQL com Java utilizada por di- ment stmt; try { Class.forName(org.postgresql.Driver);
versos clientes de gerenciamento ou modelagem do Post- } catch(java.lang.ClassNotFoundException e) {
greSQL. Neste caso utiliza-se o driver JDBC do Post- System.err.print(ClassNotFoundException:
");
greSQL. Vide pasta \jdbc da instalao.
System.err.println(e.getMessage()); } try { con =
postBaixar de acordo com sua verso do PostgreSQL, o driver DriverManager.getConnection(url,"postgres,
gres);
stmt
=
con.createStatement();
ResultSet
JDBC para o PostgreSQL daqui:
rs = stmt.executeQuery(query);
ResultSetMetahttp://jdbc.postgresql.org/download.html#jdbcselection Data rsmd = rs.getMetaData(); int numberOfCoAqui para o PostgreSQL verso 8.1.3 baixei o arquivo lumns = rsmd.getColumnCount(); int rowCount =
1; while (rs.next()) { System.out.println(Registro
8.1-405 JDBC 3.
" + rowCount + ": "); for (int i = 1; i <= numVB Acessando PostgreSQL via ODBC
berOfColumns; i++) { System.out.print(" Campo
O PGODBC deve ser instalado no micro cliente e " + i + ": "); System.out.println(rs.getString(i));
encontra-se em:
}
System.out.println("");
rowCount++;
}
stmt.close();
con.close();
}
catch(SQLException
http://www.postgresql.org/ftp/odbc/versions/msi
ex) { System.err.print(SQLException:
"); SysCriar uma conexo ODBC ao banco do PostgreSQL tem.err.println(ex.getMessage()); } }
e no cdigo:
}
Global Conex As New ADODB.Connection
Conexo Com o Visual BASIC
Global AccessConnect As String
Podemos nos conectar a uma base de dados PostgreSQL
Public Sub Conexao()
usando o Visual Basic via ADO. Para isto temos que usar
um driver ODBC para a plataforma Windows.
AccessConnect =
Voce vai precisar ter o PostgreSQL instalado somente no
driver={PostgreSQL};server=10.10.10.10;database=maubanco;uid=postgres;pwd=postgres;"
servidor e o driver ODBC no cliente.
Conex.ConnectionString = AccessConnect Conex.Open
79

80

CAPTULO 37. POSTGRESQL PRTICO/CONECTIVIDADE

Instala-se o psqlODBC e congura-se a conexo com o


banco desejado.
If so then use something like
CurrentProject.Connection.Execute StrSql2
If not linked tables then use something like
Dim cnn as new ADODB.Connection cnn.Open
DSN=my_dbs_dsn_name 'or a full PostgreSQL
connection string to save a trip to the
registry
cnn.Execute StrSql2
Outro exemplo:
Criar um DSN ODBC pgresearch via ADO e use:
Dim gcnResearch As ADODB.Connection
Dim rsUId As ADODB.Recordset
' open the database
Set gcnResearch =3D New ADODB.Connection
With gcnResearch
.ConnectionString =3D dsn=3Dpgresearch
.Properties(User ID) =3D txtUsername
.Properties(Password) =3D txtPassword
.Open
End With
Acessando com o Visual C#.net, ver link:
http://www.linhadecodigo.com.br/artigos.asp?id_ac=
355

Captulo 38

PostgreSQL Prtico/Ferramentas
38.1 14 - Ferramentas
1. psql
2. phpPgAdmin
3. PgAdmin
4. EMS PostgreSQL
5. Azzurry Clay (modelagem com o Eclipse)
6. dbVisualizer
7. OpenOce Base

81

Captulo 39

PostgreSQL Prtico/Ferramentas/psql
39.1 14.1 - psql

O psql aceita quebra de linhas numa consulta.


O ponto e vrgula (ou <g) indica ordem de execuo.

A ferramenta bsica de administrao do PostgreSQL Observe atentamente o prompt e suas variaes:


o psql, mas uma ferramenta de administrao capaz de
=# - este prompt indica um superusurio
administrar praticamente tudo do PostgreSQL.
=> - este indica um usurio comum
Para acess-lo execute:
su postgresql

-# - indica comando no nalizado. Aguardando o ponto


e vrgula

psql U nomeuser nomebanco (tanto no Linux quanto em


(# - aguardando o fecha parnteses )
outros SOs).
'# - aguardando um fecha apstrofo '
Geral:
psql -h host -P port -U user -W (perguntar pela senha)

Obs.: Em caso de erro teclar Ctrl+C para encerrar. Lembrando que isso no Windows sai do psql.

Alguns comandos do PostgreSQL da linha de comando


\q - sair
do SO:
Se num UNIX faa login como usurio do PostgreSQL, \c nomebanco nomeuser Conectar a outro banco
se no Windows execute passando -U nomeusuario.

\i /path/script.sql -- importar script.sql

Obtendo ajuda sobre um comando:

\timing -- iniciar/parar o cronmetro para atividades

comando help

\dT+ -- lista os tipos de dados do PG com detalhes

Se num UNIX existem tambm as manpages (pginas do \cd -- mudar para outro diretrio
manual):
\d lista tabelas, ndices, sequncias ou views
man comando
\d nometabela mostra estrutura da tabela
psql -l -> lista os bancos de dados
\dt lista tabelas
psql -U nomeusuario nomebanco -> conectar console
\di lista indices
psql no banco de dados
\ds lista sequncias
psql banco -E -> (debug) mostra internamente como cada
\dv lista views
consulta realizada
psql version -> mostra verso do PostgreSQL

\dS lista tabelas do sistema

Outros comandos via linha de comando:

\dn lista esquemas

pg_dump, pg_dumpall, pg_restote, createdb, dropdb, \dp lista privilgios


createrole, droprole
\du lista usurios
Alguns Comandos do psql:
\dg lista grupos
Para acessar, estando num UNIX:
su nomeuserpg

\l - lista todos os bancos do servidor, juntamente com seus


donos e codicaes

psql -U nomeuserpg nomebanco

\e - abre o editor vi com a ltima consulta

Estando no Windows

\o - inicia/termina a criao de arquivo. Ex.: \o arquivo.sql

psql -U nomeuserpg nomebanco

82

39.1. 14.1 - PSQL


\! comando_do_sistemaoperacional -- executa o arquivo
do sistema operacional
\? - ajuda geral dos comandos do psql
\h * - exibe ajuda de todos os comandos
\h comandosql ajuda especca sobre o comando SQL,
ex.: \h alter table
\H ativa/desativa sada em HTML
\encoding exibe codicao atual
Boa sugesto:
\h CREATE DATABASE
\h CREATE ROLE
Exemplo de sada de consulta em HTML pelo PostgreSQL:
Gerando um relatrio em HTML diretamente atravs do PostgreSQL
\o relatorio.html
SELECT * FROM cep_tabela WHERE uf='CE';
Obs.: Lembre que o PostgreSQL case sensitive.
Com isso teremos um arquivo HTML contendo todos os
registros retornados pela consulta em uma tabela HTML,
como no exemplo abaixo:

83

Captulo 40

PostgreSQL
Prtico/Ferramentas/phpPgAdmin
40.1 14.2 - phpPgAdmin
Baixar de - http://phppgadmin.sourceforge.net/
- Copiar para o diretrio web
- Editar o arquivo conf/cong.inc.php e alterar para dois
servidores (um local e outro remoto):
... // Display name for the server on the login screen
$conf['servers][0]['desc'] = 'Local';
$conf['servers][0]['host'] = '127.0.0.1';
$conf['servers][0]['defaultdb'] = 'nomebancodefault';
// Example for a second server (PostgreSQL Remoto)
$conf['servers][1]['desc'] = 'Remoto';
$conf['servers][1]['host'] = '10.99.00.11';
$conf['servers][1]['port'] = 5432;
$conf['servers][1]['defaultdb'] = 'nomebancodefault';
...
$conf['extra_login_security'] = false;

84

Captulo 41

PostgreSQL
Prtico/Ferramentas/PgAdmin
41.1 14.3 PgAdmin
PgAdmin
Site para download, caso sua distribuio no traga ou no
tenha como instalar (apt, synaptic ou outro gerenciador de
pacotes).
http://www.pgadmin.org/download/
uma ferramenta grca desenvolvida pela equipe de desenvolvimento do PostgreSQL.
Muitos recursos. Traz um help sobre si e sobre a documentao do PostgreSQL. Tecle F1 para exibir.
Ao executar consultas na ferramenta SQL, tecle F7 para
visualizar gracamente a consulta na aba Explain.

85

Captulo 42

PostgreSQL Prtico/Ferramentas/EMS
PostgreSQL
42.1 14.4 - EMS PostgreSQL Manager

CRIAR TABELAS
- Execute um duplo clique no novo banco
- Observe a estrutura criada para o novo banco:

O EMS um timo gerenciador de diversos tipos de ban- - Clique sobre Tables com o boto direito e New Table
(ou tecle Ctrl+N)
cos, inclusive do PostgreSQL.
Download http://www.sqlmanager.net/en/products/ - Acima digitamos o nome da tabela onde existe table1
postgresql/manager (para Windows existe uma verso - Ento clicamos na aba Fields.
free, a lite)
- Mais um duplo clique, agora em Column Name, para
Aqui vou abordar as atividades principais e bsicas de uso que aparea o Wizard de Campos
do EMS:
- Veja que o nome do campo codigo. Que ele do
- Abrir em banco
tipo BIGINT e tambm chave primria.
- Criar em novo banco
- Criar tabelas

- Veja agora como aparece nosso campo (com uma pequena chave direita):

- Criar campos

Isso mostra que este campo nossa chave primria.

- Criar chave primria

- Clique em Compile e veja como ca

- Criar chave estrangeira (relacionamento)

- Vamos adicionar mais um campo (nome varchar(40))

- Importar script .sql para um banco existente

- Adicione os demais campos de forma semelhante.

- Exportar banco como script sql

- Veja que sempre depois de um OK vem um boto de


Commit, com a sintaxe SQL do comando que estamos
executando no banco. Isso um controle de transaes
do EMS atravs do recurso existente no PostgreSQL.

- Executar consultas sql


CRIAR UM NOVO BANCO

- Em Getting Starting (acima e direita) clique no boto ABRIR UM BANCO EXISTENTE


Create new database
Caso queiramos trabalhar em um banco que j exista no
servidor, vamos apenas abri-lo:
- Ento digite o nome do novo banco:
- E clique no boto Next
- Ento entre com os dados do servidor

- Aps abrir o EMS apenas executamos um duplo clique


sobre o nome do banco.

- Clique em Next

- Caso o nome do banco no esteja aparecendo no EMS


clicamos no primeiro boto da barra de ferramentas (Register Database) e informamos os dados do servidor

- Ento clique em Finish

- Clicamos em Next.

- Ento clique em OK.

- E selecionamos o banco na lista Database Name

- Na prxima tela mude algo somente se tiver certeza

- Ento vemos o banco junto ao servidor (abaixo e di- - E clicamos em Finish


reita)
COMO CRIAR UMA CHAVE ESTRANGEIRA
Para abri-lo e criar tabelas basta um duplo clique nele.
86

42.1. 14.4 - EMS POSTGRESQL MANAGER

87

(FOREIGN KEY)

em Tools SQL Script - Ao centro clique em Open script


- Aps criar a tabela e os campos, devemos criar a se- e indique onde est o script a ser importado. - Se tudo
gunda tabela, que ir se relacionar com a primeira atravs for importado a contendo clique no boto Refresh Tables
direita do boto Create para visualizar a importao.
de um campo (chave estrangeira).
EXECUTANDO CONSULTAS SQL NO EMS
- Vamos supor duas tabelas: pedidos e pedido_itens, que
iro se relacionar atravs do campo cdigo em pedido e Uma boa utilidade para o gerenciador EMS a de teste
cod_pedido em pedido_itens, como abaixo:
de consultas SQL. - Abra o banco, abra o executor de
script, digite a consulta em SQL e execute para saber os
pedido (codigo, descricao, data, preco_unitario)
resultados. - Sempre que tiver alguma dvida sobre uma
pedido_itens (codigo, cod_pedido, quantidade)
consulta execute aqui para testar antes.
- Para que um campo de uma tabela se relacione com
outro, ele deve ser do mesmo tipo que o outro.
- Abra a tabela pedido_itens
- Estando na aba Fields, clique em Foreign Key na coluna
do meio com o boto direito e New Foreign Key. Veja o
dilogo
- Acima e direita selecione o campo que ir se relacionar
com a outra tabela (cod_pedido)
- Em Foreign Table selecione a tabela do relacionamento
(pedidos)
- Ento abaixo e direita selecione o campo que vai se
relacionar com este (codigo) e clique na seta para a direita. Ento clique em OK. Veja que em OnDelete action
e em On Update Action existem diversas opes.
- Ento clique em Commit. Agora vejamos como ca o
cdigo SQL da nossa tabela pedido_itens. Clique na aba
DDL e ver:
CREATE TABLE public."pedido_itens (
codigo BIGINT NOT NULL, cod_pedido BIGINT, quantidade INTEGER, CONSTRAINT
pedido_itens_pkey
PRIMARY
KEY(codigo),
CONSTRAINT
pedido_itens_fk
FOREIGN
KEY
(cod_pedido)
REFERENCES
public."pedidos"(codigo) ON DELETE NO ACTION
ON UPDATE NO ACTION NOT DEFERRABLE
) WITH OIDS;
EXPORTANDO UM BANCO COMO SCRIPT
Uma forma muito comum de se exportar um banco na
forma de script, especialmente para abrir num outro servidor do mesmo tipo:
- Clique no menu Tools Extract Metadata - Selecione o
banco que deseja exportar e clique em Next - Na combo
File name selecione o diretrio e nome de arquivo para
onde deseja exportar e clique em Salvar. Ento clique em
Next. - Escolha se quer exportar somente dados, somente
estrutura ou ambos e clique em Next. - Apenas clique em
Finish e ao terminar em Close.
IMPORTANDO UM BANCO DE UM SCRIPT
Esta a operao inversa da anterior mas com algumas
diferenas. Se formos importar tudo, devemos ter aqui
apenas um banco vazio. - Abrir o banco no EMS - Clicar

Captulo 43

PostgreSQL Prtico/Ferramentas/Azzurry
Clay
43.1 14.5 - Azzurry Clay (modelagem)
Ferramenta de Modelagem Azzurry Clay:
http://www.azzurri.jp/en/software/clay/index.jsp
Visualizador de Objetos e gerador de Diagramas de Entidade Relacionamento (DER), alm de fazer engenharia
reversa nos bancos existentes.
Um timo tutorial online:
http://www.azzurri.jp/en/software/clay/quick_start_
guide.jsp?print=on
Uma boa relao de ferramentas para o PostgreSQL pode
ser encontrada no site do PostgreSQL Brasil:
https://wiki.postgresql.org.br/wiki/Ferramentas
Outra boa relao no site Data Modeling Tools:
http://www.databaseanswers.com/modelling_tools.htm

88

Captulo 44

PostgreSQL
Prtico/Ferramentas/dbVisualizer
44.1 14.6 DbVisualizer
tima ferramenta para visualizar bancos e montar o diagrama entidades-relacionamento.
http://www.dbvis.com/products/dbvis/download.html

89

Captulo 45

PostgreSQL
Prtico/Ferramentas/OpenOce Base
45.1 14.7 Openoce2 Base
Usando o OpenOce para abrir, editar bancos de dados
PostgreSQL, como tambm criar consultas, formulrios
e relatrios.
Uma das formas de conectar o OpenOce ao PostgreSQL usando um driver JDBC do PostgreSQL.
- Antes devemos ter instalado o OpenOce com suporte
a Java
- Baixe daqui:
http://jdbc.postgresql.org/download.html#jars
Para o PostgreSQL 8.1 podemos pegar o JDBC3 http://jdbc.postgresql.org/download/postgresql-8.
1-405.jdbc3.jar
- Abrir o OpenOce, pode ser at o Writer Ferramentas Opes Java Class Path Adicionar Arquivo
(indicar o arquivo postgresql-8.0-313.jdbc2.jar baixado)
e OK.
- Abrir o OOBase
- Conectar a um banco de dados existente
- Selecionar JDBC - Prximo
- URL da fonte de dados:
jdbc:postgresql://127.0.0.1:5432/bdteste
Classe do driver JDBC:
org.postgresql.Driver
Nome do usurio - postgres
password required (marque, caso use senha)
Concluir
Digitar um nome para o banco do OOBase
Pronto. Agora todas as tabelas do banco bdteste esto
disponveis no banco criado no OOBase.
Tambm podemos agora criar consulta com assistentes,
criar formulrios e relatrios com facilidade.

90

Captulo 46

PostgreSQL Prtico/Apndices
46.1 15 - Apndices
1. Planejamento e Projeto de Bancos de Dados
2. Implementao de Banco de Dados com o PostgreSQL
3. Integridade Referencial - PostgreSQL
4. Dicas Prticas de uso do SQL
5. Dicas sobre Desempenho e Otimizaes do PostgreSQL

91

Captulo 47

PostgreSQL
Prtico/Apndices/Planejamento e Projeto
de Bancos de Dados
47.1 15.1 Planejamento e Projeto
de Bancos de Dados

pode-se usar um campo que numere os registros seqencialmente

Dica de Desempenho: O tamanho da chave primria


afeta o desempenho das operaes, portanto usar o meProjeto de bancos de dados genrico e se aplica a qual- nor tamanho que possa acomodar os dados do campo.
quer SGBDR.
Exemplo
com um bom planejamento do banco de dados que se Tabela - Clientes
determina o quo ecaz foi o processo de anlise.
Campo - Nome (atributo)
Introduo
Chave Primria (Primary-Key) - CPF
O projeto do banco de dados e tambm os testes so
muito importantes para a ecincia e consistncia das in- Todos os campos correspondentes a um nico CPF junformaes e do aplicativo. muito importante gastar tamente com seus valores formam um Registro ou Linha
algum tempo nesta etapa, pois depois de algum tempo (Row)
de implantado ca muito trabalhoso alterar estruturas de A correta determinao das tabelas, bem como dos cambancos e aplicativos.
pos algo primordial no sucesso do projeto do banco de
Projetos de banco de dados inecazes geram consultas dados.
que retornam dados inesperados, relatrios que retornam
valores sem sentido, etc. Um banco de dados bem projetado fornece um acesso conveniente s informaes desejadas e resultados mais rpidos e precisos.

Chave Primria - obriga que todos os registros tero o


campo correspondente chave primria exclusivo (nicos - unique). Num cadastro de clientes, todos os clientes cadastrados tero um campo CPF exclisivo. Caso
Exemplo de software de administrao de SGBD para o se tente inserir dois clientes com o mesmo CPF o banco
PostgreSQL - PGAdmin Informaes de bancos de dados no permitir e emitir uma mensagem de erro acusando
relacionais so armazenadas em tabelas ou entidades no tentativa de violao da chave primria.
Modelo Entidade Relacionamento (MER).
Exemplos de Campos indicados para chave primria:
Dicas sobre Campos

CPF

No armazenar resultado de clculos ou dados derivados CNPJ


de outros
Matrcula de aluno
Armazenar todas as informaes (campos) separada Matrcula de funcionrio
mente. Cuidado com campos que contm duas ou mais
Uma chave primria pode ser formada por mais de um
informaes.
campo, quando um nico campo no capaz de caracteSelecionando o Campo para a Chave Primria
rizar a tabela.
A chave primria o campo ou campos que identicam
Cada tabela somente pode conter uma nica chave pride forma exclusiva cada registro.
mria.
No permitido valores nulos na chave nem duplicados
Relacionamentos - Um banco de dados formado por
Caso a tabela no tenha um campo que a identique,
92

47.1. 15.1 PLANEJAMENTO E PROJETO DE BANCOS DE DADOS


vrias tabelas. Idealmente essas tabelas devem ser relacionadas entre si para facilitar a troca de informaes e garantir a integridade. Para relacionar tabelas usamos chaves existentes nas mesmas.
Tipos de Relacionamentos
Um para um

93

Integridade Referencial
Ela garante a integridade dos dados nas tabelas relacionadas. Um bom exemplo quando o banco impede que
se cadastre um pedido para um cliente inexistente, ou impede que se remova um cliente que tem pedidos em seu
nome.

Vrios para vrios

Tambm se pode criar o banco de forma que quando atualizamos o CPF de um cliente ele seja atualizado em todos
os seus pedidos.

Relacionamento Um para Um

Normalizao de Tabelas

Um para vrios

Aquele onde os campos que fazem o relacionamento so Normalizar bancos tem o objetivo de tornar o banco mais
chaves primrias. Cada registro de uma tabela se relaci- eciente.
ona com apenas um registro da outra tabela. Este relaciUma regra muito importante ao criar tabelas atentar
onamento no muito comum.
para que cada tabela contenha informaes sobre um
Exemplo: CorrentistaBanco - Conjuge
nico assunto, de um nico tipo.
Relacionamento Um para Vrios ou Vrios para Um

1a Forma Normal

Aquele onde uma tabela tem um campo chave primria Os campos no devem conter grupos de campos que se
que se relaciona com outra tabela atravs de um campo repetem nos registros.
chave estrangeira. o tipo de relacionamento mais utiliExemplo:
zado.
Alunos: matricula, nome, data_nasc, serie, pai, mae
Exemplos:

Categorias - Itens

Se a escola tem vrios lhos de um mesmo casal haver


repetio do nome dos pais. Esto para atender primeira
regra, criamos outra tabela com os nomes dos pais e a
matrcula do aluno.

Fornecedores - Produtos

2 Forma Normal

NotaFiscal - Produtos

Quando a chave primria composta por mais de um


campo.

Clientes - Pedidos
Produtos - Itens

Veja que cada um da esquerda se relaciona com vrios do


Devemos observar se todos os campos que no fazem
da direita.
parte da chave dependem de todos os campos que fazem
Importante:
parte da chave.
O nmero de campos do relacionamento no precisa ser Caso algum campo dependa somente de parte da chave,
o mesmo
ento devemos colocar este campo em outra tabela.
O tipo de dados dos campos do relacionamento deve ser Exemplo:
igual, assim como o tamanho dos campos e formatos
TabelaAlunos
Chave primria - Chave estrangeira (um - vrios)
Chave (matricula, codigo_curso)
Relacionamento Vrios para Vrios
avaliacao descricao_curso
Este tipo de relacionamento no d para ser implementado no modelo relacional, portanto sempre que nos de- Neste caso o campo descricao_curso depende apenas do
paramos com um deles devemos dividir em dois relaci- codigo_curso, ou seja, tendo o cdigo do curso conseguionamentos um para vrios (criando uma terceira tabela, mos sua descrio. Ento esta tabela no est na 2 Forma
Normal.
que armazenar o lado vrios dos relacionamentos).
Soluo:
Exemplo:
Pedidos - Produtos

Dividir a tabela em duas (alunos e cursos):

Cada pedido pode conter vrios produtos, assim como TabelaAlunos


cada produto pode estar em vrios pedidos. A sada Chave (matricula, codigo_curso)
criar uma tabela que contenha os itens do pedido.
avaliacao
Pedidos - Pedidos_Itens - Produtos
TabelaCursos
Pedidos 1 - N Pedidos_Itens N - 1 Produtos
codigo_curso

94CAPTULO 47. POSTGRESQL PRTICO/APNDICES/PLANEJAMENTO E PROJETO DE BANCOS DE DADOS


descricao_curso
3 Forma Normal
Quando um campo no dependente diretamente da
chave primria ou de parte dela, mas de outro campo da
tabela que no pertence chave primria. Quando isso
ocorre esta tabela no est na terceira forma normal e a
soluo dividir a tabela.
Lembrando: Engenharia Reversa (parte de um banco ou
de um script sql e gera o modelo).
Projeto
Fases do Projeto do Banco de Dados
Modelagem Conceitual
Projeto Lgico
Observao.: Trataremos apenas de novos projetos.
Modelo Conceitual - Dene apenas quais os dados que
aparecero no banco de dados, sem se importar com a
implementao do banco. Para essa fase o que mais se
utiliza o DER (Diagrama Entidade-Relacionamento).
Modelo Lgico - Dene quais as tabelas e os campos
que formaro as tabelas, como tambm os campos-chave,
mas ainda no se preocupa com detalhes como o tipo de
dados dos campos, tamanho, etc.
Etapas na Estruturao e Projeto de um Banco de Dados
Problemas a serem solucionados com o banco de dados
Determinar o objetivo do banco de dados
Determinar as tabelas necessrias (cada uma com um
nico assunto exclusivo)
Determinar os campos de cada tabela
Criar um DER
Vericar a estimativa do crescimento do banco e
preparar-se para isso
Investigar como so armazenadas as informaes atualmente e recolher a maior quantidade de informaes para
o projeto
Adotar um modelo e justic-lo (Os itens acima fazem
parte do Modelo Conceitual, abaixo do Lgico)
Determinar a chave primria de cada tabela. Pode haver
tabela sem chave primria.
Determinar os relacionamentos e seus tipos
Obs.: Somente quando da implementao (modelo fsico) sero tratados os detalhes internos de armazenamento. O modelo fsico a traduo do modelo lgico
para a linguagem do SGBDR a ser utilizado no sistema.

Captulo 48

PostgreSQL
Prtico/Apndices/Implementao de
Banco de Dados com o PostgreSQL
48.1 15.2 Implementao de
Banco de Dados com o PostgreSQL - Modelo Fsico

cao (Encoding) LATIN1


ENCODING = 'LATIN1'
Criao do Banco

Criaremos o banco do projeto de testes com o PGAdmin,


Softwares free de Modelagem e Gerenciamento do Post- contendo esquemas, tabelas, views, funes do tipo SQL
e Pl/PgSQL, usurios, privilgios, consultas, etc. para
greSQL
ilustrar nosso projeto e servir de base para os testes (em
PGAdmin: (http://www.postgresql.org/ftp/pgadmin3/ seguida).
release/)
Analisar o modelo sugerido e detalhar o banco, tipos
EMS:
(http://www.sqlmanager.net/en/products/ de dados de cada campo, tamanho, esquemas do banco,
postgresql/manager/download)
usurios e senhas, privilgios de cada um (cuidados com
a segurana), etc.
DBDesigner: (http://fabforce.net/downloads.php)
Ativar o Suporte s Funes Pl/Pgsql (Stored Procedures)

DbVisualizer: http://www.dbvis.com/products/dbvis/
Em forma de Plug-ins para Eclipse

Aps ter criado o banco, podemos ativar o suporte a


plpgsql.

QuantumDB: (http://quantum.sourceforge.net/)

Azzurri/Clay: (http://www.azzurri.jp/en/software/clay/
Ativar suporte a Pl/PgSQL requer dois passos:
download.jsp)
- instalar a biblioteca Pl/PgSQL, que do tipo contrib
SQLExplorer:
(http://sourceforge.net/projects/
- denir a linguagem (como sugerido abaixo)
eclipsesql)
Uma grande e boa relao de softwares de projeto, modelagem e gerenciamento para o PostgreSQL, free e comercial pode ser encontrada em no site ocial so PostgreSQL
Brasil:

Ativando na console do PG depois de conectar ao banco


onde car o suporte:
CREATE
LANGUAGE
'plpgsql'
HANDLER
plpgsql_call_handler LANCOMPILER 'PL/pgSQL'

https://wiki.postgresql.org.br/wiki/Ferramentas.

- Ativando como superusurio na console (fora dos banSuporte Acentuao na Criao de Bancos no Post- cos)
greSQL
su - postgres
A codicao default do PG 7.X a SQL_ASCII

$ createlang plpgsql -U nomesuperuser nomebanco

A do PG 8.X a UNICODE

Ou simplesmente:

Ambas tem suporte a acentuao, mas geram problemas $ createlang plpgsql nomebanco
no backup/importao.
JDBC
Codicao
Alguns programas em Java o utilizam, como o plugin
Para um suporte estvel acentuao em portugus do QuantumDB.
Brasil uma boa opo criar o banco passando a codi95

96CAPTULO 48. POSTGRESQL PRTICO/APNDICES/IMPLEMENTAO DE BANCO DE DADOS COM O POSTGRESQL


O JDBC para o PostgreSQL encontra-se em:
http://jdbc.postgresql.org/download.html#jars

REVOKE CREATE ON SCHEMA public FROM PUBLIC

Com isso estamos tirando o privilgio de todos os usuVeja que para selecionar o arquivo .jar correto, precisamos cruzar a verso do PostgreSQL esquerda com a rios acessarem o esquema public.
verso do JDBC desejado.
Acesso aos Esquemas
Exemplo: Para uso como cliente em sua mquina pelo Quando se cria um banco no PostgreSQL, por default,
Quantum DB (no Eclipse) e com PostgreSQL 8.1 baixar ele cria um esquema pblico (public) no mesmo e neste
o arquivo: 8.1-405 JDBC 3
esquema que so criados todos os objetos quando no especicamos o esquema. A este esquema public todos os
Esquemas
usurios do banco tm livre acesso, mas aos demais existe
Denir os esquemas do banco.
a necessidade de se dar permisso para que os mesmos
Quando o cliente precisa de muitas tabelas, organizadas acessem.
em vrias reas a sada imediata a criao de vrios bancos de dados. Mas quando da implementao do aplicativo que ir utilizar estes bancos os desenvolvedores se
depararo com a diculdade de comunicao e acesso entre os bancos, j que com uma nica conexo tero acesso
a todos os objetos do banco. muito til para estes casos
criar um nico banco e neste criar vrios esquemas, organizados por reas: pessoal, administracao, contabilidade,
engenharia, etc.
Mas e quando uma destas reas tem outras sub-reas,
como por exemplo a engenharia, que tem reservatrios,
obras, custos e cada um destes tem diversas tabelas. O
esquema engenharia car muito desorganizado. Em termos de organizao o ideal seria criar um banco para cada
rea, engenharia, contabilidade, administrao, etc. E
para engenharia, por exemplo, criar esquemas para cada
subarea, custos, obras, etc. Mas no o ideal em termos
de comunicao e acesso entre todos os bancos.
Criar Esquema

Tabelas
O PostgreSQL permite adicionar privilgios por objeto
do banco: tabela, esquema, banco, etc. Em termos de segurana importante, em geral, que os privilgios sejam
adicionados ao usurio por tabela, cada tabela tendo um
dono e cada dono tendo seus especcos privilgios.
Dica de Desempenho: Na criao das tabelas alertar para
a criao de ndices para os campos envolvidos na clusula WHERE. Isso tornar essas consultas mais rpidas.
Views
Juntamente com as funes armazenadas (stored procedures) as views so boas alternativas para tornar o cdigo
mais simples e o aplicativo mais ecientes, j que parte
do processamento feito pelo cdigo agora j est pronto
e debugado no banco, o que torna o cdigo mais rpido
e eciente. O uso de views e de funes armazenadas
em bancos semelhante ao uso de funes e classes no
cdigo.

Num gerenciador do PG entra-se no banco e nesse cria-se Dica: para uso de views, sintaxe de funes internas e
o esquema.
uso de clusulas SQL no PostgreSQL, tutoriais de EMS
e vrios outros sobre PostgreSQL, alm de PHP, JaOu
vaScript, etc, conra o site abaixo: http://ribafs..net ou
CREATE SCHEMA nomeesquema;
http://ribafs.tk
Acessando Objetos de Esquemas
Criao do Banco Tutorial sobre PGAdmin para
Para acessar um esquema devemos passar seu caminho: criar o banco funcionarios.
nomeesquema.nometabela
Ou
nomebanco. nomeesquema.nometabela
Criando Tabela em Esquema
CREATE TABLE nomeesquema.nometabela (
...
)
Criando Esquema e tornando um Usurio dono

Bem, de posse do script .sql acima, praticamente o que


teremos de fazer criar um banco vazio no PGAdmin.
Abrir o PGAdmin
Caso no tenha salvado a senha ele pedir sempre que
iniciar
Ao abrir clique com o boto direito direita em Databases
e em New Database.
- No dilogo New Database entre com o Name do banco
(funcionarios), o Owner (postgres).

Idealmente mudar o nome do superusuario default para


CREATE SCHEMA nomeesquema AUTHORIZAum nome mais seguro, assim como a senha (mnimo de
TION nomeusuario;
8 caracteres, misturando letras e algarismos e idealmente
Removendo privilgios de acesso a usurio em es- com smbolos).
quema
Tambm altere Encoding (codicao) para LATIN1.

48.1. 15.2 IMPLEMENTAO DE BANCO DE DADOS COM O POSTGRESQL - MODELO FSICO


- Ento selecione o banco funcionarios e clique no boto
SQL acima.
- Clique no boto open le para indicar o nosso script sql
gerado anteriormente.
Clique na setinha verde (Execute query)
Eventuais Correes:
Caso receba mensagens de erro sobre tipo UNSIGNED,
verique o script e remova todas as ocorrncias de UNSIGNED e execute novamente. Como o DBDesigner foi
projetado para o MySQL um outro erro que pode ocorrer
com a string AUTO_INCREMENT, que tambm deve
ser removida e novamente devemos executar o script.
Feitas estas correes o script executa normalmente e cria
o nosso banco funcionarios.
Ento verique esquerda que o banco j contm as 3
tabelas de acordo com o script.
Engenharia Reversa
Um timo software para conexo ao PostgreSQL, engenharia reversa (gera diagramas ER dos bancos existentes)
e exporta os diagramas em forma de imagens: DbVisualizer.

97

Captulo 49

PostgreSQL
Prtico/Apndices/Integridade Referencial
- PostgreSQL
49.1 15.3 - Integridade Referencial
- Postgresql

codigo nome_cliente
1 PostgreSQL inc.
2 RedHat inc.

Traduo livre do documentao CBT Integrity Refe- pedidos (relaciona-se Clientes pelo campo cod_cliente)
rential":
cod_pedido cod_cliente descricao
http://techdocs.postgresql.org/college/002_
Caso tentemos cadastrar um pedido com cod_cliente 2
referentialintegrity/.
ele ser aceito.
Integridade Referencial (relacionamento) onde uma inMas caso tentemos cadastrar um pedido com cod_cliente
formao em uma tabela se refere informaes em outra
3 ele ser recusado pelo banco.
tabela e o banco de dados refora a integridade.
Criando uma Chave Primria
Tabela1 ------------> Tabela2
Deve ser criada quando da criao da tabela, para garantir
Onde Utilizado?
valores exclusivos no campo.
Onde pelo menos em uma tabela precisa se referir para
CREATE TABLE clientes(cod_cliente BIGINT,
informaes em outra tabela e ambas precisam ter seus
nome_cliente VARCHAR(60) PRIMARY KEY
dados sincronizados.
(cod_cliente));
Exemplo: uma tabela com uma lista de clientes e outra
Criando uma Chave Estrangeira (Foreign Keys)
tabela com uma lista dos pedidos efetuados por eles.
o campo de uma tabela que se refere ao campo Primary
Com integridade referencial devidamente implantada
Key de outra.
nestas tabelas, o banco ir garantir que voc nunca ir
cadastrar um pedido na tabela pedidos de um cliente que O campo pedidos.cod_cliente refere-se ao campo clientes.codigo, ento pedidos.cod_cliente uma chave esno exista na tabela clientes.
trangeira, que o campo que liga esta tabela a uma outra.
O banco pode ser instrudo para automaticamente atualiCREATE TABLE pedidos(
zar ou excluir entradas nas tabelas quando necessrio.
Primary Key (Chave Primria) - o campo de uma tabela
criado para que as outras tabelas relacionadas se reram
a ela por este campo. Impede mais de um registro com
valores iguais. a combinao interna de UNIQUE e
NOT NULL.

cod_pedido BIGINT,
cod_cliente BIGINT REFERENCES clientes,
descricao VARCHAR(60)
);

Qualquer campo em outra tabela do banco pode se referir Outro exemplo:


ao campo chave primria, desde que tenham o mesmo
FOREIGN KEY (campoa, campob)
tipo de dados e tamanho da chave primria.
REFERENCES tabela1 (campoa, campob)
Exemplo:
ON UPDATE CASCADE
clientes (codigo INTEGER, nome_cliente VARON DELETE CASCADE);
CHAR(60))
98

49.1. 15.3 - INTEGRIDADE REFERENCIAL - POSTGRESQL

99

Cuidado com excluso em cascata. Somente utilize com esta clusula no recebe nenhum parmetro.
certeza do que faz.
Exemplo: ERRO em DELETE FROM clientes WHERE
Dica: Caso desejemos fazer o relacionamento com um codigo = 2. No funcionar caso o cod_cliente em pedicampo que no seja a chave primria, devemos passar este dos contenha um valor mais antigo que codigo em cliencampo entre parnteses aps o nome da tabela e o mesmo tes.
deve obrigatoriamente ser UNIQUE.
CASCADE - Quando um registro com a chave primria
...

excludo, todos os registros relacionados com aquela


cod_cliente
BIGINT
REFERENCES
clien- chave so excludos.
tes(nomecampo),
SET NULL - Quando um registro com a chave primria
excludo, os respectivos campos na tabela relacionada
...
so setados para NULL.
Parmetros Opcionais: ON UPDATE parametro e
SET DEFAULT - Quando um registro com a chave priON DELETE parametro.
mria excludo, os campos respectivos da tabela relaciON UPDATE paramentros:
onada so setados para seu valor DEFAULT.
NO ACTION (RESTRICT) - quando o campo chave Excluindo Tabelas Relacionadas
primria est para ser atualizado a atualizao abortada
caso um registro em uma tabela referenciada tenha um Para excluir tabelas relacionadas, antes devemos excluir a
valor mais antigo. Este parmetro o default quando esta tabela com chave estrangeira.
clusula no recebe nenhum parmetro.
Tudo isso est na documentao sobre CREATE TABLE: http://www.postgresql.org/docs/8.0/interactive/
Exemplo: ERRO Ao tentar usar UPDATE clientes SET
sql-createtable.html
codigo = 5 WHERE codigo = 2. Ele vai tentar atualizar
o cdigo para 5 mas como em pedidos existem registros ALTER TABLE http://www.postgresql.org/docs/8.0/
do cliente 2 haver o erro.
interactive/sql-altertable.html
CASCADE (Em Cascata) - Quando o campo da chave Chave Primria Composta (dois campos)
primria atualizado, registros na tabela referenciada so CREATE TABLE tabela (
atualizados.
codigo INTEGER,
Exemplo: Funciona: Ao tentar usar UPDATE clientes
SET codigo = 5 WHERE codigo = 2. Ele vai tentar atu- data DATE,
alizar o cdigo para 5 e vai atualizar esta chave tambm nome VARCHAR(40),
na tabela pedidos.
PRIMARY KEY (codigo, data)
SET NULL (atribuir NULL) - Quando um registro na
chave primria atualizado, todos os campos dos regis- );
tros referenciados a este so setados para NULL.
Exemplo: UPDATE clientes SET codigo = 9 WHERE
codigo = 5; Na clientes o codigo vai para 5 e em pedidos,
todos os campos cod_cliente com valor 5 sero setados
para NULL.
SET DEFAULT (assumir o Default) - Quando um registro na chave primria atualizado, todos os campos
nos registros relacionados so setados para seu valor DEFAULT.
Exemplo: se o valor default do codigo de clientes 999,
ento
UPDATE clientes SET codigo = 10 WHERE codigo = 2.
Aps esta consulta o campo cdigo com valor 2 em clientes vai para 999 e tambm todos os campos cod_cliente
em pedidos.
ON DELETE parametros:
NO ACTION (RESTRICT) - Quando um campo de
chave primria est para ser deletado, a excluso ser
abortada caso o valor de um registro na tabela referenciada seja mais velho. Este parmetro o default quando

Captulo 50

PostgreSQL Prtico/Apndices/Dicas
Prticas de uso do SQL
50.1 15.4 - Dicas Prticas de uso do
SQL

SELECT POSITION('@' IN 'ribafs@gmail.com') > 0


select 'ribafs@gmail.com' ~ '@'
select 'ribafs@gmail.com' like '%@%'
select 'ribafs@gmail.com' similar to '%@%.%';

Armazenar Arquivos Binrios no Prprio Banco

Alguns
da
lista
de
PHP
(phpfortaleza@yahoogrupos.com.br - groups.yahoo.com).

Utilize a contrib LO para esta nalidade.

Lembre que como uma contrib normalmente no vem Temos um campo (insumo) com valores = 1, 2, 3, ...
ligada e temos que ligar especicamente ao banco onde 87
queremos utilizar.
Queremos atualizar para 0001, 0002, 0003, ... 0087
Ligando, de dentro do banco usar o comando \i:
UPDATE equipamentos SET insumo = '000' || insumo
Acesse o diretrio lo das contribs do PostgreSQL:
WHERE LENGTH(insumo) = 1;
/usr/local/src/postgresql-8.1.3/contrib/lo
UPDATE equipamentos SET insumo = '00' || insumo
WHERE LENGTH(insumo) = 2;
Ento execute o comando make install.
Acesse o banco e:

Outra sada mais elegante ainda:

\i /usr/local/src/postgresql-8.1.3/contrib/lo/lo.sql

UPDATE equipamentos SET insumo = REPEAT('0', 4LENGTH(insumo)) || insumo;

Para usar veja o README.lo no diretrio lo e tambm a


INSERINDO COM SELECT
documentao ocial do PostgreSQL:
Tendo uma tabela com registros e outra para onde desejo
Portugus do Brasil - Captulo 28:
incluir registros daquela
http://pgdocptbr.sourceforge.net/pg80/largeobjects.
INSERT INTO equipamentos2 SELECT grupo, insumo,
html
descricao, unidade from equipamentos2;
Ingls - Captulo 29: http://www.postgresql.org/docs/8.
insert into engenharia.precos (insumo_grupo,insumo) se1/interactive/largeobjects.html
lect grupo,insumo from engenharia;
Nomes de Campos com espao ou acento devem vir entre
Com CAST
aspas duplas.
insert
into
engenharia.insumos
(grupo,insumo,descricao,unidade)
select
Em SQL os comentrios mais utilizados so da seguinte grupo,insumo,descricao, CAST(unidade AS int2)
forma:
AS unidade from engenharia.apagar
SELECT * FROM tabela; - - Este um comentrio
insert
into
engenharia.insumos
Comentrios

(grupo,insumo,descricao,unidade)
grupo,insumo,descricao, cast(unidade
AS unidade from engenharia.apagar

- - Este outro comentrio


Tambm so aceitos os comentrios herdados do C:
/* Comentrio herdado do C e vlido em SQL */

AS

select
INT2)

select trim(length(bairro)) from cep_tabela where


cep='60420440'; -- Montese, Retorna 7

Dicas Prticas de Uso do SQL


Testar se campo de e-mail, ou seja, se contm um @:

100

50.1. 15.4 - DICAS PRTICAS DE USO DO SQL

101

Atravs do PHP
$conn
=
pg_connect(host=10.40.100.186
name=apoena user=_postgresql);

1. print OUTPUT CREATE INDEX indexteste_numero_index ON index_teste(numero);\n";

db-

1. print OUTPUT VACUUM ANALYZE index_teste;\n";

for($x=10;$x<=87;$x++){

$sql="update engenharia.precos set custo_produtivo =


(select custo_produtivo from engenharia.apagar where close OUTPUT;
insumo='$x') where insumo='00' || '$x'";
Via PHP
$ret=pg_query($conn,$sql);
$con=pg_connect(host=127.0.0.1 user=postgres password=postgres);
}
function datedi($data_nal, $data_inicial){

Diferena em Dias entre duas Datas


SELECT DATE '2006-03-29' DATE '2006-01-12';
SELECT (CAST('10/02/2005'
CAST('10/01/2006'));

AS

DATE)

POPULAR BANCO COM MASSA DE TESTES


Script el Perl
1. !/usr/bin/perl
$count = 1;
$arquivosaida = populate.sql";
@chars = (A .. Z, a .. z, 0 .. 9);

global $con; $str="SELECT DATE '$data_nal' - DATE


'$data_inicial'"; $recordset = pg_query($con, $str);
$diferena=pg_fetch_array($recordset); return $diferena[0];
}
echo Diferena: " . datedi(1969-01-08, 1968-1016);
Ajustando o formato da Data do Sistema
SHOW DATESTYLE;
SET DATESTYLE TO ISO; YYYY-MM-DD HH:MM:
SS

@numbers = (1 .. 9);

SET DATESTYLE TO PostgreSQL; Formato tradicional


do PostgreSQL (

@single_chars = (a .. e);

SET DATESTYLE TO US; MM/DD/YYYY

$totalrecords = 5000; # 5 milhoes


open(OUTPUT, "> $arquivosaida);

SET DATESTYLE TO NONEUROPEAN, GERMAN;


DD.MM.YYYY

print OUTPUT DROP TABLE index_teste;\n";

SET DATESTYLE TO EUROPEAN; DD/MM/YYYY

print OUTPUT CREATE TABLE index_teste (";

Obs.: De forma permanente ajustar o postgresql.conf.

print OUTPUT codigo INT, nome VARCHAR(10), nu- Outros usos para SHOW:
mero INT, letra CHAR(1)";
SHOW server_version;
print OUTPUT ");\n";

SHOW server_encoding; -- Idioma para ordenao do


print OUTPUT COPY index_teste (codigo, nome, nu- texto (denido pelo initdb)
mero, letra) FROM stdin;\n";
SHOW lc_collate; -- Idioma para classicao de caracteres (denido pelo initdb)
while ($count <= $totalrecords){
$randstring = join("", @chars [map{rand @chars} ( 1 .. 8 SHOW all; -- Mostra todos os parmetros
) ]); $randnum = join("", @numbers [map{rand @num- Tambm podemos setar o datestyle quando alterabers} ( 1 .. 8 ) ]); $randletter = join("", @single_chars mos um banco:
[map{rand @single_chars} (1)]); print OUTPUT
ALTER DATABASE nomebanco SET DATESTYLE =
#print OUTPUT INSERT INTO index_teste VASQL, DMY;
LUES($count,'$randstring',$randnum,'$randletter');\n";
$count."\t.$randstring."\t.$randnum."\t.$randletter."\n";Tambm pode ser atribudo juntamente com o Usurio:
$count++;
ALTER ROLE nomeuser SET DATESTYLE TO SQL,
DMY;

};
1. print OUTPUT "\n";

Ajustando uma Faixa de Registros com LIMIT and


OFFSET

1. print OUTPUT "\nCREATE INDEX index- SELECT isbn, title, publication FROM editions NATUteste_codigo_index ON index_teste(codigo);\n";
RAL JOIN books AS b (book_id)

102

CAPTULO 50. POSTGRESQL PRTICO/APNDICES/DICAS PRTICAS DE USO DO SQL

ORDER BY publication DESC LIMIT 5;

kernel.shmmax = 309329920

SELECT isbn, title, publication FROM editions NATU- kernel.shmall = 309329920


RAL JOIN books AS b (book_id)
kernel.shmmni = 1
ORDER BY publication DESC LIMIT 5 OFFSET 2;
Comando para alterar as variveis do kernel sem reTrar 5 registros, iniciando do segundo.

iniciar o Linux:

fsync - checa integridade dos dados gravados no banco, sysctl -w kernel.shmmax=309329920


vindos dos logs. Vem ligado por padro
sysctl -w kernel.shmall=309329920
Gargalo de SGBDs:
sysctl -w kernel.shmmni=1
leitura/gravao (I/O) de discos.

Dicas de instalao do PostgreSQL em GNU/Linux.

Ligar/Desligar fsync no:


postgresql.conf, setar para
fsync=true Nunca deve car false

Utilizar HD do tipo SATA

REORDENAR CAMPOS DE TABELA

Criar uma partio exclusiva para os dados. Ex: /database

Se voc estiver falando da ordem dos campos na tabela


no existe razo para isso no modelo relacional.

Utilizar nesta partio o sistema de arquivos XFS

Voc sempre pode especicar os campos desejados, e na


ordem desejada, no SELECT.
Se necessrio voc pode criar uma view:

Deixar nesta partio


RW,NOATIME

apenas

os

ags:

CREATE VIEW nome_view AS SELECT id,cpf,nome


Do site: http://www.gescla.com.br/oficina_postgre.asp
FROM sua_tabela;
Se ainda no estiver satisfeito pois quer suas tabelas bo- Criao de Tipos de Dados
nitinhas e organizadas:

CREATE TYPE img (input = int4in, output =


1.
CREATE TABLE novo_nome AS SELECT int4out, internallength = 4, externallength = 10, delimiter = ",, send = int4out, receive = int4in, passedbyid,cpf,nome FROM sua_tabela;
value, alignment = int, storage = plain);
2. DROP TABLE sua_tabela;
Uso:
3.
ALTER TABLE novo_nome RENAME TO
create table imagens (codigo int8, descricao varchar(60),
sua_tabela;
imagem img);
Osvaldo (Na lista PostgreSQL-Brasil).
Construtor de Matriz
Calculando a Memria a ser usada pelo PostgreSQL
Matriz unidimensional - array[2,4,6+2]
Shared Buers
Exemplo de 1GB RAM
A shared buers ser 25% da RAM
256 * 1024 / 8 = 32768
logo shared_buers = 32768
Shared Memory

SELECT array[2,4,6+2]; -- Retorna 2,4,8


Multidimensional - composta por duas ou mais matrizes
unidimensionais:
Obs.: O ndice do valor da matriz construdo com ARRAY sempre comea com um.
Ao criar uma tabela podemos usar matriz em seus tipos
de dados, ao invs de tipos simples.
Exemplo:

CREATE TABLE testematriz (codigo INT [], nome


A Shared Memory ser igual a shared buer + (de 10 a char[30][30]);
20)%
array[array[2,4,6],array[1,3,5]] ou
Shared Memory = 256MB + 15%
array[[2,4,6],[1,3,5]]
256MB + 15% = 295 MB
Com subconsultas. Entre parnteses e no concletes.
295MB = 295 * 1024 * 1024 = 309329920
No Linux:

select array(select oid from pg_proc where proname like


'bytea%');

/etc/sysctl.conf

Retorna: 1244,31,1948,1949,1950,1951,1952,1953,1954,2005,2006,2011

50.1. 15.4 - DICAS PRTICAS DE USO DO SQL

103

ENCONTRAR REGISTROS DUPLICADOS

SELECT '\\Barra';

SELECT DISTINCT cep FROM cep_tabela

Para escrever um apstrofo usa-se dois apstrofos:

WHERE cep IN (SELECT cep FROM cep_tabela AS SELECT 'Editora OReyle';


Tmp GROUP BY cep,tipo,logradouro, bairro, munici- PostgreSQL tambm permite o uso de caracteres de espio,uf HAVING Count(*) >1 ) ORDER BY cep;
cape para escrever caracteres especiais:
(Adaptao de consulta gerada pelo assistente Encontrar SELECT 'Editora O\'Reyle';
duplicadas do Access).
Concatenao de expresses no terminal:
Ou:
SELECT 'Concate'
select count(*) as quantos, cep from cep_tabela group by
'nao';
cep having count(*) > 1;
REMOVER DUPLICADOS

Equivale a:

Para tabelas criadas WITH OIDS:

SELECT 'Concatenao';

DELETE FROM cep_tabela2 WHERE oid NOT IN

Quando resolvendo expresses matemticas usar parnteses para tornar mais claras as precedncias.

(SELECT min(oid) FROM cep_tabela2 GROUP BY


Convertendo para Nmeros
cep, tipo, logradouro, bairro, municipio, uf);
SELECT TO_NUMBER('0' || '1,500.64',99999999.99);
Do exemplo 8.10 do manual em portugus do Brasil.
Ou:

Total de 8 dgitos com 2 decimais.

Criando uma segunda tabela que conter somente os re- Variveis no psql
gistros exclusivos e ainda guarda uma cpia da tabela ori- \pset null '(nulo)' -- traduzindo null por nulo
ginal:
SELECT NULL;
CREATE TABLE cep_tabela2 AS SELECT cep, tipo,
logradouro, bairro, municipio, uf FROM cep_tabela \set variavel 14 -- Dando valor 14 varivel
GROUP BY cep, tipo, logradouro, bairro, municipio, uf SELECT :variavel;
ORDER BY cep;
COPIAR TABELA COM REGISTROS
Caso no importe qual das duplicatas ir permanecer:
CREATE TABLE tabeladestino AS SELECT * FROM
CREATE TABLE tab_temp AS SELECT DISTINCT * tabelaorigem;
FROM tabela;
Aps o que teremos que recriar as constraints.
DROP tabela;
phpPgGIS
ALTER TABLE tab_temp RENAME TO tabela;
http://www.geolivre.org.br/modules/news/
(Dica de Osvaldo Rosario Kussama na lista de PostEm mais um grande lanamento, a OpenGEO coloca
greSQL Brasil)
disposio da comunidade uma ferramenta extremaDelimitadores
mente ltil para gerncia de dados geogrcos no PostA maioria dos tipos de dados tem seus valores delimitados greSQL. O phpPgGIS mais um produto da OpenGEO
que contempla uma demanda na rea de Geotecnologias
por apstrofos (), a exemplo de:
e visa atender usurios do mundo inteiro.
caracteres
Desenvolvido com base no phpPgAdmin, o phpPgGIS
data/hora
utiliza o MapServer para visualizar o contedo espacial
dos campos do PostGIS com muita simplicidade (um climonetrio
que). Seqncias de cdigos complexos (campo de geoboleanos
metria) agora podem ser vistos num mapa.
binrios
O OpenGEO tem atuado no mercado brasileiro de Geogeomtricos

tecnologias com solues inovadoras com base em software livre e j ganhou referncia internacional com alarrays
guns importantes projetos como o Open 3D GIS e o GeA exceo para os demais tipos numricos: date oLivre Linux.
18/12/2005 numeric 12345.45
Este sistema vai integrar a soluo de Hosting que a emCaracteres Especiais
presa dever lanar nas prximas semanas.
Para poder escrever uma barra no valor de uma constante, Algumas Denies
usa-se duas barras:

104

CAPTULO 50. POSTGRESQL PRTICO/APNDICES/DICAS PRTICAS DE USO DO SQL

Cursor
um ponteiro para uma linha (registro).
Replicao
a distribuio de dados corporativos para vrios locais
ou liais de uma empresa, oferecendo conabilidade, tolerncia a falhas, melhor desempenho e capacidade de
gerenciamento.
Criptograa Seu objetivo tornar os dados comuns em
bits de aparncia completamente aleatria.
MAISCULAS E MINSCULAS NO POSTGRESQL
Ao digitar nomes de tabelas e campos em Maisculas
eles sero convertidos automaticamente para minsculas,
a no ser que sejam digitados entre aspas duplas:
SELECT * FROM CLIENTES";
Recomendao: evitar o uso de maisculas e de acentos
em nomes de bancos, tabelas e campos.
POSTGRESQL NO CONECTA?
Do site do Rodrigo Hjort (http://agajorte.blogspot.com/
2009/03/meu-postgresql-nao-conecta.html)
- Pingar no IP
- Vericar o pg_hba.conf - host, banco, usurio IP e senha
- Caso aparea Is the server running on host..
- Testar com telnet IP porta (Ctrl+C para sair)
- No postgresql.conf - listen_addresses = 'IP'
- Salvar e restartar o SGBD.
Contador de Resultados
Indicado para consultas e relatrios (no grava)
CREATE TEMP SEQUENCE seq;
SELECT nexval('seq'), * FROM esquema.tabela;
(Salvador S. Scardua na lista PostgreSQL Brasil)
LIMITES DO POSTGRESQL
Tamanho de um Banco de Dados - ilimitado
Tamanho de uma tabela - 32 TB
Quantidade de registros por tabela - ilimitados
Quantidade de campos por tabela - 250 a 1600 (depende
do tipo)
Quantidade de ndices por tabela - ilimitados

Captulo 51

PostgreSQL Prtico/Apndices/Dicas
sobre Desempenho e Otimizaes do
PostgreSQL
51.1 15.5 Dicas sobre Desempenho e Otimizaes do PostgreSQL

RAM e pelos discos rgidos.

sempenho de tabelas com grandes quantidades de registros e especialmente com muitos acessos, a incluso de
ndices estratgicos. Alm da chave primria importante inserir ndices em campos que compem a clusula WHERE, que fazem parte de clusulas ORDER BY,
GROUP BY entre outras. Em consultas com WHERE
de vrios campos usando OR, no adianta inserir ndice,
pois no ser utilizado pelo PostgreSQL, somente usando
AND.

No tarefa simples de ser colocada em prtica, pois a


memria RAM guarda muitas outras informaes: programas em execuo, pilhas e dados de programas, memria cache compartilhada do PostgreSQL, cache do
buer de disco do kernel e kernel.

Na prtica as informaes utilizadas com mais freqncia so colocadas prximas CPU. Quem determina que
informaes devem car nos registradores so os compiladores. Cache da CPU guarda ar informaes utilizadas
Existem duas principais formas de melhorar o desem- recentemente. O Sistema Operacional controla o que est
penho de SGBDs: uma melhorando o hardware, com armazenado na RAM e o que mandar para o disco rgido.
CPUs, RAM, Discos mais novos, rpidos e conveis. Cache e Registradores da CPU no podem ser otimizados
A outra otimizando as consultas realizadas nos bancos diretamente pelo administrador do SGBD. Efetivamente
(usando VACUUM, VACUUM ANALYZE, EXPLAIN, otimizao em bancos de dados envolvem aumento da
criando CLUSTERS, entre outros).
quantidade de informaes teis na RAM, prevenindo
Uma das medidas bsicas adotada para melhorar o de- acesso a disco sempre que possvel.

Otimizao correta de bancos de dados procura manter


a maior quantidade possvel de informaes do banco na
memria RAM ao mesmo tempo que no afeta as demais
reas do sistema operacional.

Na criao do banco de dados e especialmente na criao


das consultas muito importante atentar para um bom
planejamento, normalizao, consultas otimizadas tendo
em vista o planejador de consultas do PostgreSQL atravs
do uso dos comandos EXPLAIN e ANALYZE.

Existem dois tipos de congurao de memria no PostgreSQL, a compartilhada e a individual. A compartilhada tem um tamanho xo, ela alocada sempre que o
PostgreSQL inicializa e ento compartilhada por todos
os clientes. J a memria individual tem um tamanho
A administrao do PostgreSQL tambm muito impor- varivel e alocada separadamente para cada conexo
tante para tornar o SGBD mais eciente e rpido. Desde feita ao SGBD.
a instalao e congurao temos cuidados que ajudam a
Memria Cache Compartilhada do PostgreSQL
otimizar o PostgreSQL.
O PostgreSQL no altera as informaes diretamente no
Adaptao do Artigo sobre otimizao do PostgreSQL
disco. Ao invs disso ele solicita que os dados sejam lidos
do Diogo Biazus e do original do Bruce Momjian
da memria cache compartilhada do PostgreSQL. O cli(http://www.ca.postgresql.org/docs/momjian/hw_
ente PostgreSQL ento l e escreve os blocos e nalmente
performance).
escreve no disco.
Hardware
Clientes que precisam acessar tabelas primeiro procuram
No computador as informaes so manipuladas pelos re- pelos blocos necessrios no cache. Caso estejam a ento
gistradores da CPU, pelo cache da CPU, pela memria
105

106CAPTULO 51. POSTGRESQL PRTICO/APNDICES/DICAS SOBRE DESEMPENHO E OTIMIZAES DO POSTGRESQL


continuam processando normalmente. Caso contrrio
feita uma solicitao ao sistema operacional para carregar
os blocos. Os blocos so carregados do cache de buer de
disco do kernel ou diretamente do disco. Estas operaes
podem ser onerosas (lentas).
Na congurao default do PostgreSQL 8.1.3 ele aloca
1000 shared buers. Cada buer usa 8KB, o que soma
8MB. Aumentando o nmero de buers far com que os
clientes encontrem as informaes que procuram em cache e evita requisies onerosas ao sistema operacional.
Mas cuidado, pois se aumentar muito a memria compartilhada (shared buers) pode acarretar uso da memria virtual (swap). As alteraes podem ser feitas atravs do comando postmaster na linha de comando ou atravs da congurao do valor do shared_buers no postgresql.conf.
Que Poro da RAM Reservar para o PostgreSQL?
A maior poro til que no atrapalhe os outros programas. Nos sistemas UNIX as informaes saem da RAM
(quando insuciente) para o swap. Ruim quando as informaes voltam do swap para a RAM, pois ento os
programas so suspensos at que as mesmas sejam carregadas.
Tamanho da Cache
Imaginemos que o PostgreSQL shared buer cache seja
suciente para manipular uma tabela inteira. Repetidas buscas seqenciais da tabela no devem necessitar de
acesso ao disco j que todos os dados j esto em cache.
Agora vamos imaginar que o cache menor que a tabela,
ento neste caso as informaes iro para o disco (swap) e
tero um desempenho bem inferior. Tamanho Adequado
da Shared Buer Cache

tabelas, em operaes de criao de ndices, ordenao


(order by), merge join, etc.
Esta memria pode ser congurada atravs do parmetro
sort_mem do postgresql.conf.
Para a congurao leve em conta sua memria disponvel (incluindo a memria j alocada para o shared buffers), tambm o nmero mdio de conexes e o uso da
memria virtual (swap).
Exemplo:
Considerando um servidor dedicado (rodando somente o
servidor PostgreSQL), com memria RAM de 1,5GB e
com at 10 conexes simultneas com o SGBD:
shared_buers = 80000 # 80.000 blocos de 8KB = 625
MB
sort_mem = 64000 # tamanho em KB = 62,5 MB, para
cada usurio com
# 10 usurios = 526 MB
vacuum_mem = 2000
Por exemplo: queremos x KB para memria individual
sort_men
( x * 1024 ) = resultado para memria individual
x = 16
(16 * 1024) = sort_mem = 16384
Seria bom mudar tambm memria para vaccum
vacuum_mem = 131072 (mesmo clculo do sort_mem)
Uso de Vrios Discos

Em sistemas com mais de um disco podemos melhorar a


performance do mesmo distribuindo algumas tarefas enIdealmente a PostgreSQL shared buer cache (Memria tre discos diferentes.
Cache Compartilhada do PostgreSQL) deve ser:
Supondo que temos dois HDs, hda e hdb:
Grande o suciente para conseguir manipular as tabelas
mais comumente acessadas. Pequena o bastante para evi- Movendo os logs de transao para outro disco:
tar atividades de swap pagein.
- Parar o PostgreSQL
Exemplo:

- Montar hdb em /mnt/hdb

Por exemplo queremos x MB para memria comparti- - Mover a pasta /usr/local/pgsql/data/pg_xlog para o
lhada ( x / 8 ) * 1024 = Resultado a ser congurado em /mnt/hdb
shared_buer
- Criar um link simblico para o diretrio original:
Se x = 768 MB
ln -s /mnt/hdb/pg_xlog /usr/local/pgsql/data/pg_xlog
(768 / 8) * 1024

- Banco - /usr/local/pgsql/data (no hda)

Resultado a ser congurado em shared_buer = 98304

- Logs - /usr/local/pgsql/data/pg_xlog (link simblico


Para informaes sobre uma congurao do kernel para para /mnt/hdb/pg_xlog).
que vrios sistemas operacionais trabalharem com o Post- Os logs de transao so os nicos registros que no pogreSQL:
dem ter o seu salvamento em disco adiado sem comprometer a segurana do sistema.
http://developer.postgresql.org/docs/postgres/
kernel-resources.html
Mover os ndices para um HD diferente de onde esto as
Memria Individual (Sort Memory)

tabelas:

Principalmente utilizada em ordenaes de registros das - Parar PostgreSQL

51.1. 15.5 DICAS SOBRE DESEMPENHO E OTIMIZAES DO POSTGRESQL

107

- Mover os ndices para o hdb

uso da memria.

- Criar link simblico para o local original

Traduo do Tutorial Tuning PostgreSQL for Performance

Para recriar os ndices em outro Tablespace:

ALTER TABLE nometabela DROP CONSTRAINT no- De Shridhar Daithankar e John Berkus
meconstraint;
Shared Buers
CREATE INDEX nome_idx ON nometabela (nome- Denem um bloco de memria que o PostgreSQL usar
campo) TABLESPACE nometablespace;
para lidar com requisies que esto aguardando ateno
no buer do kernel e na CPU.
ALTER TABLE nometabela ADD CONSTRAINT
nome_pk PRIMARY KEY (nomecampo);
Deve ser manipulada com cuidado, pois simplesmente
ALTER INDEX nome_idx SET TABLESPACE nome- ampliada pode prejudicar a performance. Esta a rea
que o PostgreSQL usa atualmente para trabalhar. Ela
tablespace;
deve ser suciente para controlar a carga do servidor
Ainda podemos separar astabelas mais utilizadas para do SGBD, do contrrio o PostgreSQL ir iniciar empuro hdb, utilizando o comando tablespace no PostgreSQL rando dados para arquivos e isto ir prejudicar a perfor8.1.3 podemos fazer isso:
mance geral. Esta a principal congurao em termos
- Criar diretrio /mnt/hdb/hotcluster e tornar postgres seu de performance.
dono
Seu valor deve ser congurado tendo em vista o tamanho
CREATE TABLESPACE hotcluster OWNER postgres do conjunto de bancos que se supes que no mximo o
servidor ir carregar e da memria RAM (ter em mente
LOCATION '/mnt/hdb/hotcluster';
que a memria RAM utilizada pelos demais aplicativos
Criando um banco no novo cluster:
do servidor no estaro disponveis).
CREATE DATABASE hotbanco TABLESPACE = hot- Recomendaes:
cluster;
- Iniciar com 4MB (512) Workstation
Exportar as tabelas para este banco.
- Mdio tamanho do conjunto de bancos de dados e 256
Uso de Mais de Um Processador
a 512MB disponvel de RAM: 16-32MB (2948 a 4096)
Atualmente o PostgreSQL est otimizado para uso de v- - Grande conjunto de bancos de dados e muita memria
rios processadores, reforando que cada conexo geren- RAM disponvel (1 a 4GB): 64 256MB (8192 a 32768)
ciada por um processo diferente.
Obs.: At para um conjunto de bancos de dados (dataset)
Sistemas de Arquivos
que exceda 20GB, uma congurao de 128MB deve ser
Para sistemas BSD usa-se o tradicional UFS, que ro- muito, caso voc tenha apenas 1GB de RAM e um agresbusto, rpido e tem a vantagem em relao ao Post- sivo sistema de cache em Sistema Linux.
greSQL, de possuir os blocos de disco com um tamanho Sort Memory (Memria para Ordenao)
padro de 8KB.
Limite mximo de memria que uma conexo pode usar
Para quem utiliza Linux as sugestes vo para EXT3 e para executar sort (ordenao). Caso suas consultas usem
ReiserFS.
as clusulas ORDER BY ou GROUP BY que ordenem
grandes conjuntos de dados, incrementar este parmetro
Checkpoints
dever ajudar.
O wal_les o parmetro do postgresq.lconf que determina o nmero de arquivos usados pelo PostgreSQL para Uma Recomendao:
armazenar os logs de transao. Estes arquivos focam em Ajustar o parmetro por conexo como e quando precisar:
pg_xlog, na pasta de dados.
pouca para consultas mais simples e muita para consultas
Para que apaream as datas e horas nos arquivos de logs complexas e para dumps de dados.
usa-se no postgresql.conf:
Eective Cache Size (Tamanho do Cache Efetivo)
log_timestamp = true
Permite ao PostgreSQL fazer melhor uso da RAM dispoPara reduzir a freqncia dos checkpoints devemos au- nvel no servidor.
mentar o parmetro do postgresql.conf:
Exemplo:
checkpoint_segments = 3 (valor default)
Caso exista 1,5GB de RAM na mquina, shared buers
O PostgreSQL no precisa de muito ajuste. Boa parte dos deve ser ajustado para 32MB e eective cache size para
parmetros automaticamente ajustada para uma perfor- 800MB.
mance tima. O cache size e sort size so dois parmetros Fsync and the WAL les (Fsync e arquivos de WAL)
que o administrador pode controlar para ter um melhor

108CAPTULO 51. POSTGRESQL PRTICO/APNDICES/DICAS SOBRE DESEMPENHO E OTIMIZAES DO POSTGRESQL


Caso no reste nenhuma opo, poder usar a proteo do EXPLAIN
WAL e melhor performance. Simplesmente mova seus
arquivos de WAL, montando outro dispositivo ou criando
1. !/usr/bin/perl
um link simblico para o diretrio pg_xlog, para um disco
separado ou para o conjunto dos arquivos do seu cluster
$count = 1;
principal de arquivos de dados.
$arquivosaida = populate.sql";
random_page_cost (custo de pgina aleatria)
@chars = (A .. Z, a .. z, 0 .. 9);
Congura o custo para trazer um registro aleatrio de um
banco de dados, que inuencia a escolha do planejador @numbers = (1 .. 9);
em usar index ou table scan.
@single_chars = (a .. e);
Caso tenha um disco razoavelmente rpido como SCSI $totalrecords = 5000; # 5 milhes
ou RAID, pode baixar o custo para 2.
open(OUTPUT, "> $arquivosaida);
Vacuum_mem
print OUTPUT DROP TABLE index_teste;\n";
Congura a memria alocada para Vacuum. Deve acelerar permitindo que PostgreSQL copie grandes quantida- print OUTPUT CREATE TABLE index_teste (";
des para a memria.
print OUTPUT codigo INT, nome VARCHAR(10), nuEntre 16-32MB uma boa quantidade para muitos siste- mero INT, letra CHAR(1)";
mas.

print OUTPUT ");\n";

max_fsm_pages

print OUTPUT COPY index_teste (codigo, nome, nuPostgreSQL grava espao livre em cada uma de suas p- mero, letra) FROM stdin;\n";
ginas de dados.
while ($count <= $totalrecords){
Caso tenha um banco que usa muitos updates e deletes, $randstring = join("", @chars [map{rand @chars} ( 1 .. 8
que ir gerar registros mortos, devido ao sistema MVCC ) ]); $randnum = join("", @numbers [map{rand @numdo PostgreSQL, ento expanda o FSM para cobrir todos bers} ( 1 .. 8 ) ]); $randletter = join("", @single_chars
estes registros deads (mortos) e nunca mais precisar ro- [map{rand @single_chars} (1)]); print OUTPUT
dar vacuum full a no ser em feriados.
#print OUTPUT INSERT INTO index_teste VALUES($count,'$randstring',$randnum,'$randletter');\n";
O mnimo FSM max_fsm_relations * 16.
$count."\t.$randstring."\t.$randnum."\t.$randletter."\n";
max_fsm_relations
$count++;
Diz quantas tabelas devem ser localizadas no mapa de es- };
pao livre.
wal_buers
Esta congurao decide a quantidade de buers WAL
(Write Ahead Log) que pode ter.
Para chegar a uma quantidade tima experimente e decida.
Um bom incio est em torno de 32 a 64 correspondendo
a 256-516 KB de memria.
Ativar o subprocesso do auto Vacuum

1. print OUTPUT "\n";


1. print OUTPUT "\nCREATE INDEX indexteste_codigo_index ON index_teste(codigo);\n";
1. print OUTPUT CREATE INDEX indexteste_numero_index ON index_teste(numero);\n";
1. print OUTPUT VACUUM ANALYZE index_teste;\n";

Vem desabilitado por defualt (autovacuum = o no


8.1.3). Para ativar edite o arquivo de congurao postgresq.conf e altere para autovacuum = on. Ir executar o close OUTPUT;
vacuum quando necessrio.
Um bom artigo sobre performance no PostgreSQL PostMelhor executar o comando vacuum juntamente com o greSQL 8.0 Checklist de Performance encontra-se na
comando analyze:
revista eletrnica DBFree Magazine, nmero 02.
vacuumdb -U postgres -a, caso seja executado na linha de
comando.
Para adquirir informaes sobre os ndices (tornando a
performance ainda melhor):
vacuumdb -U postgres -a -z

Captulo 52

PostgreSQL Prtico/Exerccios
52.1 16 Exerccios

);
3)

Exemplo Prtico
Vamos criar um banco (clientes_ex), contendo uma tabela (cliente) e um usurio (operador) que ter apenas alguns privilgios de acesso tabela cliente (INSERT, SELECT, UPDATE) e ser obrigado a utilizar senha. Veja
que no ter privilgio DELETE. Ento adicionar alguns
registros e executar consultas dos quatro tipos: INSERT,
SELECT, UPDATE e DELETE (este apenas para vericar se realmente ele no tem este privilgio).
1)

CREATE ROLE operador WITH PASSWORD 'operador9128' VALID UNTIL '26/05/2007';


O usurio somente ter os privilgios at a data determinada.
REVOKE ALL ON cliente FROM operador;
GRANT SELECT,UPDATE,INSERT ON cliente TO
operador;
Dica: Caso a tabela tenha campo tipo serial tambm devemos dar acesso ao objeto sequence gerado:

CREATE DATABASE clientes_ex WITH ENCODING GRANT SELECT,UPDATE,INSERT ON cli'latin1';


ente_codigo_seq TO operador;
-- Para SGBDs que no estejam com esta congurao, -- Considerando que o nome da sequncia seja clipelo menos este banco a usar
ente_codigo_seq.
Para Exibir a Codicao do lado do Cliente
Para permitir ao usurio operador que faa login, use:
SHOW CLIENT_ENCODING;

ALTER ROLE operador WITH LOGIN;

Para Voltar Codicao Padro

Obs.: Veja como est aqui o pg_hba.conf:

RESET CLIENT_ENCODING;

host all all 127.0.0.1/32 md5

Alterando Banco para suportar Datas dd/mm/yyyy

4)
ALTER DATABASE clientes_ex SET DATESTYLE = Fazer o login como usurio operador para executar as
SQL, DMY;
consultas abaixo:
-- No caso este banco apenas car com esta congurao INSERT INTO cliente (codigo, nome, data_nasc, bonus,
de data
observacao) VALUES (1, 'Joo Pedro', '01/01/1967',
-- Para alterao denitiva para todos os bancos alterar o 18.35, 'Apenas um texto de teste');
script postgresql.conf.
INSERT INTO cliente (codigo, nome, data_nasc, bonus, observacao) VALUES (2, 'Pedro Paulo Rosado',
Exibindo o DateStyle Atual
'04/11/1973', 25.35, );
SHOW DATESTYLE;
INSERT INTO cliente (codigo, nome, data_nasc, bonus,
2)
observacao) VALUES (3, 'Jos Roberto', '25/06/1938',
12.65, NULL);
CREATE TABLE cliente (
codigo INT PRIMARY KEY,
nome VARCHAR(40) NOT NULL,
data_nasc DATE NOT NULL,
bonus NUMERIC(12,2),
observacao TEXT

Observe que para campos que no exigem NOT NULL,


podemos entrar apenas ou NULL.
SELECT * FROM cliente;
SELECT codigo FROM cliente;
SELECT * FROM cliente WHERE codigo = 5;

109

110

CAPTULO 52. POSTGRESQL PRTICO/EXERCCIOS

SELECT * FROM cliente WHERE codigo = 5 AND comissoes


nome='Joo de Brito Cunha';
Por enquanto iremos criar apenas a tabela produtos, mais
UPDATE cliente SET nome = 'Roberval Taylor' adiante criaremos as demais tabelas.
WHERE codigo = 3;
Obs.: A tabela de produtos ir guardar tambm uma inUPDATE cliente SET nome = 'Joo Almeida' WHERE formao sobre a posio do produto no local onde esnome = 'Pedro Paulo';
tocado.
-- Esta consulta no eciente, j que nomes podem se Esta posio conter abscissa (x) e ordenada (y), ou seja a
repetir, melhor seria pela chave
distncia horizontal da esquerda e a distncia vertical de
Observe ainda, que campos do tipo numrico no tm baixo para cima. Exemplo simplicado da disposio dos
delimitador, mas os demais tem o delimitador apstrofo, produtos:
exceto palavras-chaves e funes como NULL, TRUE, ProdA
NOW(), etc.
x,y----------------x+10,y --------------x+20,y
DELETE FROM cliente; -- Esta apaga todos os registros x |
da tabela
||
DELETE FROM cliente WHERE codigo=1;
|
DELETE FROM cliente WHERE codigo=2 AND nome
||
= 'Chico Manoel';
Veja as mensaens quando o user operador tenta excluir |Y |Y
algum registro:
|Y
clientes_ex=> DELETE FROM cliente WHERE co- |
digo=2 AND nome = 'Chico Manoel'
||
ERROR: permission denied for relation cliente
|
Ou seja, falta privilgio para excluir e as regras funciona||
ram.
onde x=10cm e y=5cm
Um pequeno teste de conexo cia PHP:
<?php

Existem tipos de dados geomtricos no PostgreSQL, para


pontos, linhas, polgonos, crculos, etc.

$con=pg_connect('host=127.0.0.1 user=operador pasIremos utilizar o ponto (point).


sword=operador9128 dbname=clientes_ex');
Vamos criar uma verso resumida da tabela Produtos:
if ($con){
echo OK";
}else{
echo NOK";
}

CREATE TABLE produtos (codigo int, nome char(40),


preco numeric(12,2));
Para excluir uma tabela:
DROP TABLE nometabela;

1 - Instalar o PostgreSQL (de acordo com seu sistema


operacional) e realizar as conguraes bsicas nos arEXERCCIO DE UM PEQUENO CONTROLE DE ES- quivos pg_hba.conf e no postgresql.conf. Mude o estilo da data para um compatvel com o brasileiro, mude
TOQUE
os locales para pt_BR, mude a codicao para LAUtilizaremos somente minsculas para os nomes dos ob- TIN1 e permita conexo TCP/IP para uma mquina de
jetos (bancos, esquemas, tabelas, campos, etc) e quando IP 10.1.1.1.
composto por duas ou mais palavras separar com subliCongure tambm a autenticao desta mquina para
nhado.
md5;
clientes
2 - Criar um banco com nome controle_estoque;
funcionarios
3 Criar um esquema esq_estoque;
produtos
4 Criar um grupo de usurios grupo_estoque;
vendas
5 Criar dentro do esquema esq_estoque, tabelas, de
vendas_itens
acordo com as estruturas abaixo com os devidos atributos
bonus
(campos), tipos de dados, tamanhos e constraints:
?>

52.1. 16 EXERCCIOS

111

clientes (cpf, nome, endereco, cidade, uf, cep, telefone, 18 Consultar qual o produto mais caro e o mais barato;
data_cadastro, data_nascimento);
19 Qual o cliente mais antigo;
funcionarios (cpf, nome, endereco, cidade, uf, cep, tele20 Atualize o preo de um produto, adicionando R$
fone, data_admissao, data_nascimento);
3.85 ao mesmo;
produtos (codigo_produto, nome, unidade, quantidade, 21 Consulte qual o cliente que no tem bonus e o remova
preco_unitario, estoque_minimo, estoque_maximo); -- da tabela;
nome deve ser UNIQUE
22 Crie um banco chamado cep_brasil, com uma nica
vendas (codigo_venda, data_venda, cpf_cliente, tabela cep_tabela cuja estrutura deve ser:
cpf_funcionario);
create table cep_full (cep char(8), tipo char(72), logravendas_itens (codigo_item,
codigo_venda,
codouro char(70),bairro char(72), municipio char(60), uf
digo_produto, quantidade_item);
char(2));
bonus (codigo_bonus, cpf_cliente, codigo_venda, bo- Importe o arquivo cep_brasil_unique.csv existente no CD
nus);
ou no site:
comissoes (codigo_comissao,
digo_venda, comissao);

cpf_funcionario,

co- http://ribafs.byethost2.com seo downloads PostgreSQL.


6 Criar as chaves estrangeiras que faam os devidos re- - Ento execute \timing,
lacionamentos entre as tabelas;
- Faa uma consulta que retorne apenas o seu CEP
7 Remover somente a chave primria da tabela clientes
- E anote o tempo gasto.
e Adicionar novamente com nome clientes_pk;
8 Adicionar a constraint NOT NULL no campo 23 Agora adicione uma chave primria na tabela. Ento faa a mesma consulta anterior e veja a diferena de
preco_unitrio de produtos;
desempenho por conta do ndice adicionado;
9 Adicionar uma constraint CHECK que exija valores
22 Execute o PgAdmin, conecte ao banco conmaiores que zero no estoque_minimo do produtos;
trole_estoque para vericar o banco criado, esquemas,
10 Alterar o nome do campo nome da tabela produtos grupo de usurios e usurios, esquema, tabelas, fazer alpara descricao e o nome da tabela clientes para clientes2. gumas consultas, visualizar os dados, a estrutura das taRenomeie novamente para clientes;
belas e outras atividades;
11 Alterar o tipo de dados do campo quantidade de 23 Faa o mesmo com o EMS PostgreSQL Manazer;
produtos para NUMERIC(12,2);
24 Conecte ao banco com o DbVisualizer para vericar
12 Criar trs usurios user_cli, user_prod e user_adm,
suas tabelas, esquema e veja o DER (Diagrama Entidadetodos no grupo grupo_teste, com os seguintes privilgios: Relacionamento) e salve como imagem uma cpia do
user_cli tem permisso de executar as consultas SE- DER.
LECT, UPDATE E INSERT na tabela clientes;
25 Criar uma tabela "site" contendo um campo com ip
user_pro tem permisso de executar a consulta SELECT do visitante, do tipo inet.
na tabela produtos;
26 Criar uma tabela geometria, contendo campos do
user adm pode fazer o que bem entender em todos os tipo ponto, polgono e crculo.
bancos do servidor.
13 Criar uma view que guarde a soma dos bonus por
cliente. Receber um cliente e retornar sua soma;
14 Criar uma view que guarde a soma das comisses
por funcionrio. Receber um funcionrio e retornar sua
soma;
15 Criar uma transao com o bloco:
Venda e Atualizao do estoque,
Atualizao do bnus do cliente,
Atualizao da comisso do vendedor
16 Cadastrar pelo menos trs registros em cada tabela;
17 Gerar um dump do banco e editar o script para ver
seu contedo;

Captulo 53

PostgreSQL Prtico/Referncias
53.1 17 - Referncias

- Practical PostgreSQL (ingls) http://www.faqs.org/


docs/ppbook/book1.htm

- PostgreSQL: Introduction and Concepts (ingls)


http://www.postgresql.org/files/documentation/books/
Migrate from MySQL or PostgreSQL to DB2 aw_pgsql/index.html
Express-C
- PostgreSQL: Das ozielle Handbuch (alemo) http://
http://www-128.ibm.com/developerworks/db2/library/ www.postgresql.org/docs/books/pghandbuch.html.de
techarticle/dm-0606khatri/
- Lista de Livros sobre o PostgreSQL http://www.
Leverage your PostgreSQL V8.1 skills to learn DB2, postgresql.org/docs/books/
Version 8.2
Listas
http://www-128.ibm.com/developerworks/db2/library/
Lista Ocial do PostgreSQL, com diversas categorias
techarticle/dm-0603wasserman2/
17 caractersticas do PostgreSQL que fazem falta no - Lista de News (freqncia semanal) http://www.
postgresql.org/community/weeklynews/
Oracle
Para ser imparcial:

Mais
um
bom
artigo
do
F- - Cadastro e Descadastro em Uma das Vrias Listas
bio
Telles
http://savepoint.blog.br/ http://www.postgresql.org/community/lists/subscribe
coisas-do-postgresql-que-fazem-falta-no-oracle/
Busca nos Arquivos das Listas do PostgreSQL
Comparison of dierent SQL implementations - http:
http://archives.postgresql.org/index.php?adv=1
//troels.arvin.dk/db/rdbms/
- Lista da Comunidade Brasileira
Site Ocial
http://pgfoundry.org/mailman/listinfo/brasil-usuarios/
Site ocial http://www.postgresql.org
Lista de Discusso no Yahoo
Site da comunidade brasileira http://www.postgresql.
http://br.groups.yahoo.com/group/postgresql-br/ Para se
org.br
cadastrar acesse o site acima e faa o cadastro.
Documentao Ocial
PostgreSQL Users Groups Site http://pugs.postgresql.
Online - http://www.postgresql.org/docs/8.1/interactive/
org/
index.html (Com busca)
IRC
PDF - http://www.postgresql.org/files/documentation/
http://www.postgresql.org/community/irc Existe um capdf/8.1/postgresql-8.1-A4.pdf
nal brasileiro
Brasil - Online - http://pgdocptbr.sourceforge.net/pg80/
Sites do PostgreSQL em vrios pases
index.html
Brasil - PDF - http://ufpr.dl.sourceforge.net/ http://www.postgresql.org/community/international
sourceforge/pgdocptbr/pgdocptbr800-pdf-1.1.zip
Empresas que utilizam PostgreSQL
Brasil - PDF Tutorial - http://www.pythonbrasil.com.br/ http://www.postgresql.org/about/casestudies/
moin.cgi/NabucodonosorCoutinho?action=AttachFile&
Featured Users (Usurios Caracterizados)
do=get&target=tutorial_pg.pdf.tar.gz
PostgreSQL Technical Documentation - http://techdocs. Esto aqui algumas das centenas das companhias que
construram produtos, solues, web sites e ferramentas
postgresql.org/
usando o PostgreSQL
Livros (E-books grtis)
112

53.1. 17 - REFERNCIAS

113

http://www.postgresql.org/about/users

- Curso de PostgreSQL do Evoluo (Fortaleza-CE)


www.evolucao.com.br

Grandes Projetos do PostgreSQL


http://www.postgresql.org/community/resources

Modelagem e Normalizao

Projetos no PgFoundry ftp://ftp2.br.postgresql.org/ - O Modelo Relacional de Dados (em cinco artigos, de Jlio Battisti ) http://www.imasters.com.br/artigo.php?cn=
postgresql/projects/pgFoundry/
2419&cc=149
Projetos Gborg ftp://ftp2.br.postgresql.org/postgresql/
- Conceitos Fundamentais de Banco de Dados (de
projects/gborg/
Ricardo Rezende) http://www.sqlmagazine.com.br/
Anlise de Diversas Ferramentas para PostgreSQL Colunistas/RicardoRezende/02_ConceitosBD.asp
https://wiki.postgresql.org.br/wiki/Ferramentas
Outros:
Diversos Logos do PostgreSQL para divulgao em Sites http://www.postgresql.org/community/ - PostgreSQL no iMasters http://www.imasters.com.
br/secao.php?cs=35
propaganda
Comunicar e Existncia de Bugs http://www. - Lozano http://www.lozano.eti.br
postgresql.org/support/submitbug
online de envio de relato de bugs.

Com

formulrio - Conversor de Script DDL para PostgreSQL - http://


www.icewall.org/~{}hjort/conv2pg/

Diversas Ferramentas para o PostgreSQL


Conversor de Script DDL para PostgreSQL
http://www.icewall.org/~{}hjort/conv2pg/
http://www.freedownloadscenter.com/Best/
erd-postgresql.html
http://www.databaseanswers.com/modelling_tools.htm
http://top.softlandmark.com/Erd_postgresql.html
http://directory.fsf.org/autodia.html
http://www.datanamic.com/download/scripteditor.zip
http://tedia2sql.tigris.org/
http://tedia2sql.tigris.org/usingtedia2sql.html
http://www.fileboost.net/directory/development/
databases_networks/cutesql/004405/review.html
http://www.fileboost.net/directory/development/
databases_networks/case_studio_2_lite/013963/1/
download.html
http://files.db3nf.com/download/DB3NF_Setup_1_4.
exe
http://gborg.postgresql.org/project/pgxexplorer/
download/download.php
http://gborg.postgresql.org/browse.php
http://gborg.postgresql.org/browse.php?83
Revistas

- Meu PostgreSQL no Conecta! - http://agajorte.


blogspot.com/2009/03/meu-postgresql-nao-conecta.
html
- Juno entre Tabelas no Postgresql http://www.
imasters.com.br/artigo/2867
- Customize database queries using views in PostgreSQL
- http://web.archive.org/20070212102915/builder.com.
com/5100-6388_14-6032031.html
- PostgreSQL Interagindo com Banco de dados - http://
www.imasters.com.br/artigo/954
- O Tipo de Dados Serial http://www.imasters.com.br/
artigo/1804
- RunAs - Utilitrio para rodar o PG no XP: http://www.
softtreetech.com/24x7/archive/53.htm
- PostgreSQL com LDAP - http://itc.musc.edu/wiki/
PostgreSQL
- FAQs - http://www.postgresql.org/docs/faqs.FAQ.
html
- FAQs - http://wiki.ael.be/index.php/PostgresQL101
- Getting Started - http://postgresql.boeldt.net/getting_
started.asp
- Down and Install - http://postgresql.boeldt.net/setup_
postgresql.asp
- Microsoft SQL to PostgreSQL - http://postgresql.
boeldt.net/mssql_to_postgresql.asp

Revista Sobre Bancos de Dados Free (Portugus) http:


//www.dbfreemagazine.com.br/index.php Cadastre-se e
faa o download. J existem oito edies.

- PG Conguration - http://postgresql.boeldt.net/
postgres-linux-configuration.asp

SQL Magazine (comercial) http://www.sqlmagazine.


com.br/revista.asp

- General Bits - http://www.varlena.com/GeneralBits/

Cursos

- Muitos links - http://sql-info.de/postgresql/links.html


- Notes - http://www.archonet.com/pgdocs/pgnotes.html

- Presentations - http://candle.pha.pa.us/main/writings/
- Curso de PostgreSQL da dbExpert (So Paulo) www. computer.html
dbexpert.com.br
- EnterpriseDB - http://www.osdb.org/

114
- SQL-ish projects - http://docman.sourceforge.net/
home_html/sql.html
- Quick Reference Material - http://techdocs.postgresql.
org/#quickref
- Driver ODBC - http://www.postgresql.org/ftp/odbc/
versions/msi/
- Replication Project - http://gborg.postgresql.org/
project/pgreplication/download/download.php
Otimizao
http://www.powerpostgresql.com/PerfList
http://www.powerpostgresql.com/Downloads/
annotated_conf_80.html
http://www.varlena.com/GeneralBits/Tidbits/perf.html
https://wiki.postgresql.org.br/wiki/Otimiza%C3%A7%
C3%A3o
http://www.revsys.com/writings/
postgresql-performance.html
http://www.linuxjournal.com/article/4791
http://www.budget-ha.com/postgres/
http://archives.postgresql.org/pgsql-performance/

CAPTULO 53. POSTGRESQL PRTICO/REFERNCIAS

53.2. FONTES, CONTRIBUIDORES E LICENAS DE TEXTO E IMAGEM

115

53.2 Fontes, contribuidores e licenas de texto e imagem


53.2.1

Texto

PostgreSQL Prtico/Introduo Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/Introdu%C3%A7%C3%A3o?


oldid=249110 Contribuidores: Marcos Antnio Nunes de Moura, He7d3r, He7d3r.bot, Abacaxi e Annimo: 1
PostgreSQL Prtico/Instalao Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/Instala%C3%A7%C3%A3o?
oldid=207740 Contribuidores: Marcos Antnio Nunes de Moura, Ribafs e He7d3r.bot
PostgreSQL Prtico/Instalao/No Linux Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/Instala%C3%A7%
C3%A3o/No%20Linux?oldid=252076 Contribuidores: Marcos Antnio Nunes de Moura, Ribafs, Albmont, He7d3r.bot, Abacaxi e Annimo: 3
PostgreSQL Prtico/Instalao/No Windows Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/Instala%C3%A7%
C3%A3o/No%20Windows?oldid=266870 Contribuidores: Marcos Antnio Nunes de Moura, He7d3r.bot, Abacaxi e Annimo: 2
PostgreSQL Prtico/DDL Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/DDL?oldid=252816 Contribuidores:
Marcos Antnio Nunes de Moura, Ribafs, He7d3r.bot e Abacaxi
PostgreSQL Prtico/DDL/Criao e Excluso de Bancos, Esquemas, Tabelas, Views, Constraints, etc Fonte:
http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/DDL/Cria%C3%A7%C3%A3o%20e%20Exclus%C3%A3o%20de%
20Bancos%2C%20Esquemas%2C%20Tabelas%2C%20Views%2C%20Constraints%2C%20etc?oldid=207722 Contribuidores: Marcos
Antnio Nunes de Moura, Ribafs e He7d3r.bot
PostgreSQL Prtico/DDL/Alteraes nos objetos dos bancos Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/
DDL/Altera%C3%A7%C3%B5es%20nos%20objetos%20dos%20bancos?oldid=207720 Contribuidores: Marcos Antnio Nunes de
Moura, Ribafs e He7d3r.bot
PostgreSQL Prtico/DDL/ndices, Tipos de Dados e Integridade Referencial Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%
20Pr%C3%A1tico/DDL/%C3%8Dndices%2C%20Tipos%20de%20Dados%20e%20Integridade%20Referencial?oldid=207723 Contribuidores: Marcos Antnio Nunes de Moura, Ribafs e He7d3r.bot
PostgreSQL Prtico/DML Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/DML?oldid=207725 Contribuidores:
Marcos Antnio Nunes de Moura, Ribafs, He7d3r.bot e Annimo: 1
PostgreSQL Prtico/DML/Consultas Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/DML/Consultas?oldid=
207726 Contribuidores: Marcos Antnio Nunes de Moura, Ribafs e He7d3r.bot
PostgreSQL Prtico/DML/Consultas Join Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/DML/Consultas%
20Join?oldid=207727 Contribuidores: Marcos Antnio Nunes de Moura, Ribafs, He7d3r.bot e Annimo: 2
PostgreSQL Prtico/DML/Sub Consultas Fonte:
http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/DML/Sub%
20Consultas?oldid=216889 Contribuidores: Marcos Antnio Nunes de Moura, Ribafs, He7d3r.bot e Annimo: 2
PostgreSQL Prtico/Funes Internas Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/Fun%C3%A7%C3%
B5es%20Internas?oldid=207733 Contribuidores: Marcos Antnio Nunes de Moura, Ribafs, He7d3r.bot e Annimo: 1
PostgreSQL Prtico/Funes Internas/Strings Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/Fun%C3%A7%
C3%B5es%20Internas/Strings?oldid=207739 Contribuidores: Marcos Antnio Nunes de Moura, Ribafs e He7d3r.bot
PostgreSQL Prtico/Funes Internas/Matemticas Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/Fun%C3%
A7%C3%B5es%20Internas/Matem%C3%A1ticas?oldid=207738 Contribuidores: Marcos Antnio Nunes de Moura, Ribafs e He7d3r.bot
PostgreSQL Prtico/Funes Internas/Agrupamento Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/Fun%
C3%A7%C3%B5es%20Internas/Agrupamento?oldid=207734 Contribuidores: Marcos Antnio Nunes de Moura, Ribafs, He7d3r.bot e
Annimo: 1
PostgreSQL Prtico/Funes Internas/Data e Hora Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/Fun%C3%
A7%C3%B5es%20Internas/Data%20e%20Hora?oldid=207736 Contribuidores: Marcos Antnio Nunes de Moura, Ribafs e He7d3r.bot
PostgreSQL Prtico/Funes Internas/Formatao de Tipos de Dados Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%
A1tico/Fun%C3%A7%C3%B5es%20Internas/Formata%C3%A7%C3%A3o%20de%20Tipos%20de%20Dados?oldid=261878 Contribuidores: Marcos Antnio Nunes de Moura, Ribafs, He7d3r.bot, LlamaAl e Annimo: 1
PostgreSQL Prtico/Funes Internas/Converso de Tipos Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/
Fun%C3%A7%C3%B5es%20Internas/Convers%C3%A3o%20de%20Tipos?oldid=207735 Contribuidores: Marcos Antnio Nunes de
Moura, Ribafs e He7d3r.bot
PostgreSQL Prtico/Funes Denidas pelo Usurio e Triggers Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/
Fun%C3%A7%C3%B5es%20Definidas%20pelo%20Usu%C3%A1rio%20e%20Triggers?oldid=216822 Contribuidores: Marcos Antnio Nunes de Moura, Ribafs, He7d3r.bot e Annimo: 1
PostgreSQL Prtico/Funes Denidas pelo Usurio e Triggers/SQL Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%
C3%A1tico/Fun%C3%A7%C3%B5es%20Definidas%20pelo%20Usu%C3%A1rio%20e%20Triggers/SQL?oldid=216817 Contribuidores: Marcos Antnio Nunes de Moura, Ribafs, He7d3r.bot e Annimo: 1
PostgreSQL Prtico/Funes Denidas pelo Usurio e Triggers/PlpgSQL Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%
C3%A1tico/Fun%C3%A7%C3%B5es%20Definidas%20pelo%20Usu%C3%A1rio%20e%20Triggers/PlpgSQL?oldid=234408 Contribuidores: Marcos Antnio Nunes de Moura, Ribafs, He7d3r.bot e Annimo: 6
PostgreSQL Prtico/Funes Denidas pelo Usurio e Triggers/Triggers Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%
20Pr%C3%A1tico/Fun%C3%A7%C3%B5es%20Definidas%20pelo%20Usu%C3%A1rio%20e%20Triggers/Triggers?oldid=249049
Contribuidores: Marcos Antnio Nunes de Moura, Ribafs, He7d3r.bot e Annimo: 3
PostgreSQL Prtico/DCL Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/DCL?oldid=185988 Contribuidores:
Ribafs, Jorge Morais e He7d3r.bot

116

CAPTULO 53. POSTGRESQL PRTICO/REFERNCIAS

PostgreSQL Prtico/DCL/Administrao de usurios, grupos e privilgios Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%


C3%A1tico/DCL/Administra%C3%A7%C3%A3o%20de%20usu%C3%A1rios%2C%20grupos%20e%20privil%C3%A9gios?oldid=
207718 Contribuidores: Ribafs, Jorge Morais, He7d3r.bot e Annimo: 1
PostgreSQL Prtico/Transaes Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/Transa%C3%A7%C3%B5es?
oldid=217960 Contribuidores: Ribafs, Jorge Morais, He7d3r.bot e Annimo: 3
PostgreSQL Prtico/Administrao Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/Administra%C3%A7%
C3%A3o?oldid=185973 Contribuidores: Ribafs, SallesNeto BR e He7d3r.bot
PostgreSQL Prtico/Administrao/Backup e Restore Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/
Administra%C3%A7%C3%A3o/Backup%20e%20Restore?oldid=185974 Contribuidores: Ribafs, Jorge Morais e He7d3r.bot
PostgreSQL Prtico/Administrao/Importar e Exportar Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/
Administra%C3%A7%C3%A3o/Importar%20e%20Exportar?oldid=199105 Contribuidores: Ribafs, Jorge Morais, He7d3r.bot e Annimo: 1
PostgreSQL Prtico/Administrao/Converter Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/Administra%
C3%A7%C3%A3o/Converter?oldid=185975 Contribuidores: Ribafs, Jorge Morais e He7d3r.bot
PostgreSQL Prtico/Administrao/Otimizao e Desempenho Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%
A1tico/Administra%C3%A7%C3%A3o/Otimiza%C3%A7%C3%A3o%20e%20Desempenho?oldid=185977 Contribuidores: Ribafs,
Jorge Morais e He7d3r.bot
PostgreSQL Prtico/Replicao Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/Replica%C3%A7%C3%A3o?
oldid=247737 Contribuidores: Ribafs, Jorge Morais, He7d3r.bot e Annimo: 1
PostgreSQL Prtico/Conguraes Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/Configura%C3%A7%C3%
B5es?oldid=185985 Contribuidores: Ribafs, Jorge Morais e He7d3r.bot
PostgreSQL Prtico/Conguraes/Congurar acessos Fonte:
http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/
Configura%C3%A7%C3%B5es/Configurar%20acessos?oldid=232673 Contribuidores: Ribafs, Jorge Morais, He7d3r.bot e Annimo: 1
PostgreSQL Prtico/Conguraes/Conguraes Diversas Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/
Configura%C3%A7%C3%B5es/Configura%C3%A7%C3%B5es%20Diversas?oldid=259184 Contribuidores: Ribafs, Jorge Morais,
He7d3r.bot e Annimo: 2
PostgreSQL Prtico/Metadados Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/Metadados?oldid=185998 Contribuidores: Ribafs, Jorge Morais, He7d3r.bot e Annimo: 1
PostgreSQL Prtico/Conectividade Fonte:
http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/Conectividade?oldid=
185984 Contribuidores: Ribafs, Jorge Morais e He7d3r.bot
PostgreSQL Prtico/Ferramentas Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/Ferramentas?oldid=185990
Contribuidores: Ribafs, Jorge Morais e He7d3r.bot
PostgreSQL Prtico/Ferramentas/psql Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/Ferramentas/psql?oldid=
253097 Contribuidores: Ribafs, Jorge Morais, He7d3r.bot e Algum
PostgreSQL Prtico/Ferramentas/phpPgAdmin Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/Ferramentas/
phpPgAdmin?oldid=185996 Contribuidores: Ribafs, Jorge Morais e He7d3r.bot
PostgreSQL Prtico/Ferramentas/PgAdmin Fonte:
http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/Ferramentas/
PgAdmin?oldid=185995 Contribuidores: Ribafs, Jorge Morais e He7d3r.bot
PostgreSQL Prtico/Ferramentas/EMS PostgreSQL Fonte:
http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/
Ferramentas/EMS%20PostgreSQL?oldid=185993 Contribuidores: Ribafs, Jorge Morais e He7d3r.bot
PostgreSQL Prtico/Ferramentas/Azzurry Clay Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/Ferramentas/
Azzurry%20Clay?oldid=185991 Contribuidores: Ribafs, Jorge Morais e He7d3r.bot
PostgreSQL Prtico/Ferramentas/dbVisualizer Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/Ferramentas/
dbVisualizer?oldid=185992 Contribuidores: Ribafs, Jorge Morais e He7d3r.bot
PostgreSQL Prtico/Ferramentas/OpenOce Base Fonte:
http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/
Ferramentas/OpenOffice%20Base?oldid=185994 Contribuidores: Ribafs, Jorge Morais e He7d3r.bot
PostgreSQL Prtico/Apndices Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/Ap%C3%AAndices?oldid=
185978 Contribuidores: Ribafs, Jorge Morais e He7d3r.bot
PostgreSQL Prtico/Apndices/Planejamento e Projeto de Bancos de Dados Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%
20Pr%C3%A1tico/Ap%C3%AAndices/Planejamento%20e%20Projeto%20de%20Bancos%20de%20Dados?oldid=185983 Contribuidores: Ribafs, Jorge Morais e He7d3r.bot
PostgreSQL Prtico/Apndices/Implementao de Banco de Dados com o PostgreSQL Fonte: http://pt.wikibooks.org/wiki/
PostgreSQL%20Pr%C3%A1tico/Ap%C3%AAndices/Implementa%C3%A7%C3%A3o%20de%20Banco%20de%20Dados%20com%
20o%20PostgreSQL?oldid=185981 Contribuidores: Ribafs, Jorge Morais e He7d3r.bot
PostgreSQL Prtico/Apndices/Integridade Referencial - PostgreSQL Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%
C3%A1tico/Ap%C3%AAndices/Integridade%20Referencial%20-%20PostgreSQL?oldid=238543 Contribuidores: Ribafs, Jorge Morais,
He7d3r.bot, Shanmugamp7 e Annimo: 1
PostgreSQL Prtico/Apndices/Dicas Prticas de uso do SQL Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/
Ap%C3%AAndices/Dicas%20Pr%C3%A1ticas%20de%20uso%20do%20SQL?oldid=185979 Contribuidores: Ribafs, Jorge Morais,
He7d3r.bot e Annimo: 1
PostgreSQL Prtico/Apndices/Dicas sobre Desempenho e Otimizaes do PostgreSQL Fonte: http://pt.wikibooks.org/wiki/
PostgreSQL%20Pr%C3%A1tico/Ap%C3%AAndices/Dicas%20sobre%20Desempenho%20e%20Otimiza%C3%A7%C3%B5es%
20do%20PostgreSQL?oldid=185980 Contribuidores: Ribafs, Jorge Morais, He7d3r.bot e Annimo: 1
PostgreSQL Prtico/Exerccios Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/Exerc%C3%ADcios?oldid=
185989 Contribuidores: Ribafs, Jorge Morais e He7d3r.bot
PostgreSQL Prtico/Referncias Fonte: http://pt.wikibooks.org/wiki/PostgreSQL%20Pr%C3%A1tico/Refer%C3%AAncias?oldid=
264240 Contribuidores: Ribafs, Jorge Morais, He7d3r, He7d3r.bot, Rotlink e Annimo: 2

53.2. FONTES, CONTRIBUIDORES E LICENAS DE TEXTO E IMAGEM

53.2.2

117

Imagens

Ficheiro:Diamond-caution.png Fonte: http://upload.wikimedia.org/wikipedia/commons/a/ae/Diamond-caution.png Licena: CC-BYSA-3.0 Contribuidores: ? Artista original: ?


Ficheiro:Wikibooks-logo-pt.svg Fonte: http://upload.wikimedia.org/wikipedia/commons/4/41/Wikibooks-logo-pt.svg Licena: CC
BY-SA 3.0 Contribuidores: Image:Wikibooks-logo-en-unpathed.svg Artista original: User:Bastique, User:Ramac et al.

53.2.3

Licena

Creative Commons Attribution-Share Alike 3.0

Das könnte Ihnen auch gefallen