Anda di halaman 1dari 123

PostgreSQL Prtico

Contedo
1

Introduo

1.1

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

Instalao

2.1

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

No Linux

3.1

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

3.2

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

No Windows

4.1

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

DDL
5.1

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

Criao e Excluso de Bancos, Esquemas, Tabelas, Views, Constraints, etc

10

Alteraes nos objetos dos bancos

16

ndices, Tipos de Dados e Integridade Referencial

18

DML

22

9.1

22

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

10 Consultas

23

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

23

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

23

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

26

11 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 Sub Consultas

31

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


13 Funes Internas

31
33

13.1 5 - Funes Internas

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

14 Strings

33
34

14.1 5.1 Funes de Strings

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

15 Matemticas

34
36

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

36

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

37

16 Agrupamento

38

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


17 Data e Hora

39

17.1 5.4 Funes de Data/Hora

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

18 Formatao de Tipos de Dados

19 Converso de Tipos

41
42

19.1 5.6 - Converso Explcita de Tipos (CAST)

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

20 Funes Denidas pelo Usurio e Triggers

42
44

20.1 6 - Funes Denidas pelo Usurio e Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . .


21 SQL

44
45

21.1 6 - Funes no PostgreSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


22 PlpgSQL

45
47

22.1 6.2 - Funes em Pl/pgSQL

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

23 Triggers

47
49

23.1 6.3 - Triggers (Gatilhos)

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

24 DCL

49
51

24.1 7 - DCL (Data Control Language) - Administrao

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

25 Administrao de usurios, grupos e privilgios


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

27 Administrao

39
41

18.1 5.5 - Formatao de Tipos de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

26.1 8 Transaes

38

51
52
52
54

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

54
56

CONTEDO

iii

27.1 9 - Administrao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
28 Backup e Restore

56
57

28.1 9.1 - Backup e Restore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


29 Importar e Exportar

57
60

29.1 9.2 - Importar e Exportar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


30 Converter

60
61

30.1 9.3 - Converter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


31 Otimizao e Desempenho

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 Replicao

65

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

65

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

66

33 Conguraes
33.1 11 - Conguraes

67
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

34 Congurar acessos

68

34.1 11.1 - pg_hba.conf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


35 Conguraes Diversas

68
71

35.1 11.2 - postgresql.conf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


36 Metadados

71
73

36.1 12 - Metadados (Catlogo) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


37 Conectividade
37.1 13 - Conectividade

67

73
79

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

38 Ferramentas
38.1 14 - Ferramentas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

79
81
81

iv

CONTEDO

39 psql

82

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


40 phpPgAdmin

84

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


41 PgAdmin
41.1 14.3 PgAdmin

82

84
85

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

42 EMS PostgreSQL

86

42.1 14.4 - EMS PostgreSQL Manager

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

43 Azzurry Clay

86
88

43.1 14.5 - Azzurry Clay (modelagem)

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

44 dbVisualizer

88
89

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


45 OpenOce Base
45.1 14.7 Openoce2 Base

85

89
90

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

46 Apndices

91

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

91
92

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

48 Implementao de Banco de Dados com o PostgreSQL


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

90

92
95
95
98
98
100

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


51 Dicas sobre Desempenho e Otimizaes do PostgreSQL

105

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


52 Exerccios

109

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


53 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

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. 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

Instalao
2.1 2 - Instalao
1. No Linux
2. No Windows

Captulo 3

No Linux
O PostgreSQL roda em uma conta de usurio, chamada
de postgres. Esta conta no a mesma dos utilizadores
das bases de dados: os usurios da base de dados devem
ser criados pelo prprio PostgreSQL.

Idealmente mude para o superusurio logo aqui.


./congure make make install groupadd postgres
useradd -g postgres -d /usr/local/pgsql postgres mkdir /usr/local/pgsql/data chown postgres:postgres
/usr/local/pgsql/data passwd postgres su - postgres
/usr/local/pgsql/bin/initdb
-D
/usr/local/pgsql/data
/usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/data
>logle 2>&1 & /usr/local/pgsql/bin/pg_ctl -D
/usr/local/pgsql/data start /usr/local/pgsql/bin/createdb
test /usr/local/pgsql/bin/psql test

3.1 Pr-requisitos para instalao


do PostgreSQL num UNIX
make do GNU (gmake ou make)

Copiar o script de inicializao linux para o /etc/init.d


(Nos Debians):

compilador C, preferido GCC mais recente


gzip

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

biblioteca readline (para psql)

Dar permisso de
/etc/init.d/postgresql

gettext (para NLS)


kerberos, openssl e pam (opcional, para autenticao)

execuo:

chmod

u+x

Se no Ubuntu ou outro Debian:


sudo gedit /etc/prole (e adicione
PATH=/usr/local/pgsql/bin:$PATH

3.2 Instalao no Linux

linha):

Depois execute:
Vrias distribuies j contam com binrios para instalao 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
Antes de instalar:
LD_LIBRARY_PATH

export

sudo apt-get install build-essential libreadline5-dev Ou no ~/.bash_prole do usurio postgres


zlib1g-dev gettext
initdb inicializa o cluster, cria os scripts de conE use make ao invs de gmake.
gurao default.
Faa o download de http://www.postgresql.org/ftp/
postmaster inicia o processo do servidor responsource/
svel por escutar por pedidos de conexo.
e descompacte (gosto de descompactar em /usr/local/src
e instalar no diretrio default, que /usr/local/pgsql).
Para suporte aos locales do Brasil usar:
Instalar pelos binrios da distribuio tem as vantagens
--locale=pt_BR
-D
de j instalar e congurar praticamente tudo automati- /usr/local/pgsql/bin/initdb
/usr/local/pgsql/data
camente, mas instalar dos fontes d um maior controle
sobre as conguraes (voc sabe que tudo car no A instalao via fontes (sources) em algumas distribui/usr/local/pgsql) e temos a possibilidade de instalar sem- es muito enxutas, voltadas para para desktop, pode no
pre a ltima verso. Reita sobre a melhor opo para funcionar da primeira vez, pois faltaro algumas bibliotecas, compiladores, etc.
voc.
5

CAPTULO 3. NO LINUX

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.
Finalmente, restore seus dados usando o novo servidor
No arquivo pg_hba.conf utilizar autenticao tipo md5, com:
password ou cript, antes de iniciar o servidor pela pri/usr/local/pgsql/bin/psql -d postgres -f bancos.sql
meira vez.
Quando o programa que inicia o servidor (postmaster)
est em execuo, criado um PID e armazenado dentro
do arquivo postmaster.pid, dentro do subdiretrio data.
Ele impede que mais de um processo postmaster seja executado usando o mesmo cluster e diretrio de dados.
Baixar PostgreSQL via Anonymous CVS:
Baixar CVS de - http://www.nongnu.org/cvs/
Instalar e Logar com qualquer senha:

Para mais detalhes sobre os procedimentos de instalao,


veja itens 14.5 e 14.6 do manual.
Plataformas Suportadas
Atualmente o PostgreSQL suporta muitas plataformas,
entre elas o Windows, Linux, FreeBSD, NetBSD,
OpenBSD, Mac OS e diversos outros. Plataformas suportadas e as no suportadas na seo 14.7 do manual
ocial.

No PostgreSQL o processo postmaster escuta por conecvs


-d
:pserver:anoncvs@anoncvs.postgresql.org:
xes dos clientes.
/projects/cvsroot login Baixar fontes:
Existem mais dois processos tambm iniciados, ambos
cvs -z3 -d :pserver:anoncvs@anoncvs.postgresql.org: com nome postgres. Eles cuidam da gravao dos logs ou
/projects/cvsroot co -P pgsql Isto ir instalar o Post- 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
seu usurio e se tenha um maior controle.
Isto ir baixar somente as alteraes ocorridas aps a lOs arquivos de congurao (postgresql.conf,
tima instalao.
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
update -d -P

Sugesto de Padro
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, especialmente indicado para grupos de tabelas com muito
contrrio faa os devidos ajustes.
acesso.
1 Ateno para que seus bancos no estejam recebendo
atualizao durante o backup. Se preciso proba acesso O comando para criar um novo cluster na verso atual
(8.1.3) do PostgreSQL :
no pg_hba.conf.
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
anterior
mv /usr/local/pgsql /usr/local/pgsql.old

banco=# \h create tablespace


Comando: CREATE TABLESPACE
Descrio: dene uma nova tablespace
Sintaxe:
CREATE TABLESPACE nome_tablespace [ OWNER
usurio ] LOCATION 'diretrio'

3.2. INSTALAO NO LINUX


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

No Windows
4.1 2 Instalao no Windows

- Agora clique em Prximo e Sim


- Na tela Inicializar o agrupamento de bancos de dados":

Instalao no Windows XP

- Caso precise acessar sua mquina de outra remota marLembrar que: Precisa instalar em sistema de arquivos que Endereos
NTFS e no instala no XP Start Edition (onde falta su- - Em Locale selecione Portugus Brasil
porte a redes).
- Em Codicao selecione LATIN1
- Fazer download do site ocial (www.postgresql.org)
- Entre com uma senha e repita. Altere o usurio se for o
(hoje postgresql-8.2.zip)
caso e Prximo.
- Executar o arquivo postgresql-8.1.msi
- Na tela Habilitar Linguagens Procedurais deixe mar- Selecionar idioma e Start. Depois em Prximo.
cada PL/pgsql (caso pretenda utilizar) e Prximo
- Na tela Informaes de Instalao existem muitas in- - Na tela Habilitar Mdulos Contrib marque os desejaformaes importantes:
dos e Prximo
- Sugere a leitura da FAQ

- Na tela Habilitar PostGIS em templae1 marque so- Fala das licenas dos diversos softwares a serem insta- mente se precisar que todos os bancos tragam o PostGIS
e Prximo e Prximo novamente.
lados
- As verses 95, 98 e Me do Windows no so suportadas - Aps instalar, na tela Instalao concluda
recomenda-se que voc se cadastrar na lista pgsqlpelo PostgreSQL
announce, que envia informaes semanais sobre novas
- Usar obrigatoriamente em sistema de arquivos NTFS
verses e correes de erros. Basta clicar no boto, fazer
- Instalar como servio (mesmo que deixe como manual) o cadastro e Concluir.
- O PostgreSQL no executa com usurio que tenha privilgios 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:
- Painel de controle - Ferramentas administrativas - Gerenciamento do computador - Usurios e grupos locais Usurios. Remova o postgres
8

Captulo 5

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

Criao e Excluso de Bancos, Esquemas,


Tabelas, Views, Constraints, etc
DDL o conjunto de comandos SQL responsveis pela CREATE DATABASE nome
denio dos dados, ou seja, pela criao de bancos, es- [ [ WITH ] [ OWNER [=] dono_bd ] [ TEMPLATE [=]
quemas, tabelas, campos, tipos de dados, constraints, etc. modelo ] [ ENCODING [=] codicao ] [ TABLES3.1 - Criao e excluso de bancos, esquemas, tabelas, PACE [=] tablespace ] ] [ CONNECTION LIMIT [=]
views, etc
limite_con ] ]
Obs.: Nomes de objetos e campos no podem usar hfen CREATE DATABASE nomebanco;
(-). Alternativamente usar sublinhado (_).
Excluindo Um Banco
campo-1 Invlido
DROP DATABASE nomebanco;
campo_1 Vlido

Listar os bancos existentes:

Nomes de Identicadores

\l - - No psql
Utiliza-se por conveno as palavras chaves do SQL em psql -l (no prompt)
maisculas e os identicadores dos objetos que criamos
SELECT datname FROM pg_database;
em minsculas.
Identicadores digitados em maisculas sero gravados Quando se cria um novo banco de dados sem indicar o
modelo, o que de fato estamos fazendo clonar o banco
em minsculas, a no ser que venham entre aspas .
de dados template1.
Revises da Linguagem SQL
Criar um banco para outro usurio:
SQL 1989
CREATE DATABASE nomebanco OWNER nomeuser;
SQL 1992
createdb -O nomeusuario nomebanco
SQL 1999
Obs.: requer ser superusurio para poder criar banco para
SQL 2003
outro usurio.
Divises da SQL
Criar Tabela
DML Linguagem de Manipulao de Dados

postgres=# \h create table

DDL Linguagem de Denio de Dados

Comando: CREATE TABLE


DCL Linguagem de Controle de Dados (autorizao Descrio: dene uma nova tabela
de dados e licena de usurios para controlar quem tem
Sintaxe:
acesso aos dados).
DQL Linguagem de Consulta de Dados (Tem apenas CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY |
TEMP } ] TABLE nome_tabela ( [
um comando: SELECT).

Comando: CREATE DATABASE

{ nome_coluna tipo_dado [ DEFAULT expresso_padro ] [ restrio_coluna [ ... ] ] | restrio_tabela


| LIKE tabela_pai [ { INCLUDING | EXCLUDING }
DEFAULTS ] } [, ... ]

Descrio: cria um novo banco de dados

])

Sintaxe:

[ INHERITS ( tabela_pai [, ... ] ) ]

Criar Banco
banco=# \h create database

10

11
[ 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

);

CREATE TABLE 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 produtos (

);

CREATE TABLE produtos (


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

produto_no integer, descricao text, preco numeric DE- CREATE TABLE exemplo (
FAULT 9.99
a integer,
);

12

CAPTULO 6. CRIAO E EXCLUSO DE BANCOS, ESQUEMAS, TABELAS, VIEWS, CONSTRAINTS, ETC

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
QUE,
controla a remoo de registros na tabela principal que
nome text,
tenha registros relacionados na estrangeira.
preco numeric
Tabela principal
);
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
);
Composta (formada por mais de um campo)
CREATE TABLE exemplo (

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 t1 (
a integer PRIMARY KEY,
b integer,
c integer,
FOREIGN KEY (b, c) REFERENCES outra_tabela
(c1, c2)
);

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

Obs.: O nmero de colunas e tipo na restrio devem ser


semelhantes ao nmero e tipo das colunas referenciadas.
Simulando ENUM no PostgreSQL

13
Para simular a constraint enum do MySQL, podemos DROP SCHEMA nomeesquema;
usar a constraint check.
Aqui, quando o esquema tem tabelas em seu interior, no
Dica do site PostgreSQL & PHP Tutorials.
possvel apagar dessa forma, temos que utilizar:
DROP SCHEMA nomeesquema CASCADE;
Que apaga o esquema e todas as suas tabelas, portanto
CREATE TABLE pessoa(
muito cuidado.
codigo int null primary key,
cor_favorita varchar(255) not null,
check (cor_favorita IN ('vermelha', 'verde', 'azul'))
);
INSERT INTO pessoa (codigo, cor_favorita) values (1,
'vermelha'); -- OK
INSERT INTO pessoa (codigo, cor_favorita) values (1,
'amarela'); -- Erro, amarelo no consta
Herana
Podemos criar uma tabela que herda todos os campos de
outra tabela existente.
CREATE TABLE cidades (
nome text,
populacao oat,
altitude int -- (em ps)
);
CREATE TABLE capitais (

Obs.: O padro SQL exige que se especique RESTRICT


(default no PostgreSQL) OU CASCADE, mas nenhum
SGBD segue esta recomendao.
Obs.: recomendado ser explcito quanto aos campos a
serem retornados, ao invs de usar * para todos, entrar
com os nomes de todos os campos. Assim ca mais claro.
Alm do mais a consulta ter um melhor desempenho.
Acessando Tabelas Em Esquemas
SELECT * FROM nomeesquema.nometabela;
Privilgios Em Esquemas
\dp visualizar permisses
REVOKE CREATE ON SCHEMA public FROM PUBLIC; - - Remove o privilgio CREATE de todos os
usurios.
Obtendo Informaes sobre os Esquemas:
\dn
\df current_schema*

estado char(2)
) 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 public.
Criando Um Esquema
CREATE SCHEMA nomeesquema;
Excluindo Um Esquema

SELECT current_schema();
SELECT current_schemas(true);
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
ORDER BY max DESC LIMIT 3;
Destruindo Uma View
DROP VIEW nomeview;

14

CAPTULO 6. CRIAO E EXCLUSO DE BANCOS, ESQUEMAS, TABELAS, VIEWS, CONSTRAINTS, ETC

Criar as Tabelas que serviro de Base

CREATE VIEW minha_view AS

CREATE TABLE client (

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

clientid SERIAL NOT NULL PRIMARY KEY,


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.

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),
emailaddress VARCHAR(255)
);
CREATE VIEW client_contact_list AS

O comando CREATE RULE cria uma regra aplicada


tabela ou viso especicada.
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
Comando: CREATE RULE
apropriadas em outras tabelas. Para obter informaes
Descrio: dene uma nova regra de reescrita
adicionais consulte o comando CREATE RULE.
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


Supondo que uma consulta seja de particular interesse
para uma aplicao, mas que no se deseja digitar esta
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.

TO tabela [ WHERE condio ] DO [ ALSO | INSTEAD


] { NOTHING | comando | ( comando ; comando ... ) }
O comando CREATE RULE cria uma regra aplicada
tabela ou viso especicada.
evento
Evento um entre SELECT, INSERT, UPDATE e DELETE.
condio
Qualquer expresso condicional SQL (retornando boo-

15
lean). 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 adiplate=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
\c testes
postgres=# UPDATE pg_database SET datistemplate=false WHERE datname='template1';

Captulo 7

Alteraes nos objetos dos bancos


3.2 - Alteraes nos objetos dos bancos

ALTER TABLE produtos ALTER COLUMN data


Adicionar campo, remover campo, adicionar constraint, TYPE DATE USING CAST (data AS DATE);
remover constraint, alterar valor default, alterar nome de Mudar Nome De Campo
campo, alterar nome de tabela, alterar tipo de dado de ALTER TABLE tabela RENAME COLUMN
campo (>=8.0).
campo_atual TO campo_novo;
Adicionar Um Campo
ALTER TABLE tabela ADD COLUMN campo tipo;

ALTER TABLE produtos RENAME COLUMN


cod_prod TO cod_produto;

ALTER TABLE produtos ADD COLUMN descricao Setar/Remover Valor Default de Campo
text;
ALTER TABLE tabela ALTER COLUMN campo SET
Remover Campo
DEFAULT valor;
ALTER TABLE tabela DROP COLUMN campo;
ALTER TABLE produtos DROP COLUMN descricao;

ALTER TABLE produtos ALTER COLUMN cod_prod


SET DEFAULT 0;

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

Adicionar Constraint (Restrio)

ALTER TABLE tabela DROP CONSTRAINT nome;

ALTER TABLE produtos ADD CONSTRAINT produALTER TABLE produtos DROP CONSTRAINT pro- tos_pk PRIMARY KEY (codigo);
dutos_pk;
ALTER TABLE vendas ADD CONSTRAINT vendas_fk FOREIGN KEY (codigo) REFERENCES produALTERAR VALOR DEFAULT DE CAMPO:
tos(codigo_produto);
Mudar Tipo de Dados de Campo (S >=8.0):
ALTER TABLE vendas ADD CONSTRAINT venALTER TABLE tabela ALTER COLUMN campo das_fk FOREIGN KEY (codigo) REFERENCES produTYPE tipo;
tos; -- Neste caso usa a chave primria da tabela produtos
ALTER TABLE produtos ALTER COLUMN preco Remover Constraint (Restrio) ALTER TABLE produTYPE numeric(10,2);
16

17
tos DROP CONSTRAINT produtos_pk;
ALTER TABLE vendas DROP CONSTRAINT vendas_fk;

Captulo 8

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.
Hash ->indicados para consultas com comparaes de
18

19
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
com vrias colunas. ndices com mais de um campo somente ser utilizado se as clusulas com os campos indexados forem ligados por AND. Um ndice com mais de 3
campos dicilmente ser utilizado.
ndice Parcial

http://www.imasters.com.br/artigo.php?cn=1922&cc=
23
http://www.imasters.com.br/artigo.php?cn=1959&cc=
23
Vide manual ocial, captulo 11 para detalhes.

Boleanos
Criado apenas sobre um subconjunto dos registros de
uma tabela, denido numa expresso durante a criao Representaes:
do ndice parcial. um recurso para melhorar o desem- 't', 'true', 'y', 'yes e '1'
penho dos ndices, j que atualiza somente parte dos reFALSE
gistros.
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, desconhecido, representado pelo NULL.

Examinando a Utilizao dos ndices


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.

Exemplo de consulta com boolean:

Atentar para usar ndices nos campos das Clusulas

Retorno:

- FOREIGN KEY

a|b

- ORDER BY

---+---------

- WHERE

t | sic est f | non est

- ON

Alerta: a entrada pode ser: 1/0, t/f, true/false,


TRUE/FALSE, mas o retorno ser semp re t/f.

- GROUP BY
- HAVING
Exemplos prtico da vantagem do ndice

CREATE TABLE teste1 (a boolean, b text);


INSERT INTO teste1 VALUES (TRUE, 'sic est');
INSERT INTO teste1 VALUES (FALSE, 'non est');
SELECT * FROM teste1;

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
geral evitar os nomes INT2, INT4 e INT8, que no so
\timing
padro. O INT8 ou bigint no padro SQL. Em ndices
SELECT * FROM cep_tabela WHERE cep = 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, numeric, decimal, real, smallint, time (com ou sem zona
cep_pk PRIMARY KEY (cep);
horria), timezone (com ou sem zona horria).
A mesma consulta anterior agora gasta apenas 10 ms.
O tipo NUMERIC pode realizar clculos exatos. RecoIsso num AMD Duron 1300, 128MB de RAM).

20

CAPTULO 8. NDICES, TIPOS DE DADOS E INTEGRIDADE REFERENCIAL

mendado para quantias monetrias e outras quantidades


onde a exatido seja importante. Isso paga o preo de
queda de desempenho comparado aos inteiros e utuantes.

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']]);
dos os valores longos, para no interferirem no acesso dos Acessando:

21
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

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

22

Captulo 10

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 de- psql -l -U postgres


clarativa, onde voc diz ao computador o que deseja fazer
Excluir o banco criado:
e deixa a mquina decidir a forma correta de chegar ao
dropdb controle_estoque -U postgres
resultado.
Para o primeiro contato com o PostgreSQL e para ter cer- Ajuda sobre os comandos:
teza de que o mesmo est corretamente instalado e con- nome_comando --help
gurado, podemos digitar na linha de comando do sistema
Acessar o banco criado atravs do terminal interativo de
operacional (como usurio do postgresql):
gerenciamento do PostgreSQL (psql):
psql --version
psql controle_estoque -U postgres
psql -l
D:\Arquivos de programas\PostgreSQL\8.1\bin>psql
O psql o programa de gerenciamento e uso do Post- controle_estoque -U postgres
greSQL pelo usurio local.
Bem vindo ao psql 8.1.3, o terminal iterativo do PostCom ele podemos fazer praticamente tudo que se pode greSQL.
fazer com o PG.
Digite: \copyright para mostrar termos de distribuio
Alguns programas esto disponveis na linha de comando
do sistema operacional, permitindo criar e excluir ban- \h para ajuda com comandos SQL \? para ajuda com cocos, criar e excluir usurios, entre outros. Os programas mandos do psql \g ou terminar com ponto-e-vrgula para
a disponveis dependem da verso instalada, do sistema executar a consulta \q para sair
operacional e da forma que foi instalado.
controle_estoque=#
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.

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


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

24
psql

CAPTULO 10. CONSULTAS


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. 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

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 sele- Exemplo (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
Exemplo ANSI:
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,
adicionada uma linha juntada com valores nulos nas coTipos de Junes
lunas de T1. o oposto da juno esquerda: a tabela reINNER JOIN - Onde todos os registros que satisfazem sultante 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 IN- SELECT p.siape, p.nome, l.lotacao FROM pessoal p
NER JOIN lotacoes l ON p.siape = l.siape ORDER BY 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, lo- Primeiro, realizada uma juno interna. Depois, para
tacoes l WHERE p.siape = l.siape ORDER BY p.siape; 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 juntada com valores nulos nas colunas de T2. Tambm, para
RIGHT OUTER JOIN
cada linha de T2 que no satisfaz a condio de juno
LEFT OUTER JOIN ou simplesmente LEFT JOIN - Socom nenhuma linha de T1, adicionada uma linha junmente os registros da tabela da esquerda (left) sero retada com valores nulos nas colunas de T1.
tornados, tendo ou no registros relacionados na tabela
E tambm as:
da direita.
Primeiro, realizada uma juno interna. Depois, para
cada linha de T1 que no satisfaz a condio de juno
com nenhuma linha de T2, adicionada uma linha juntada com valores nulos nas colunas de T2. Portanto, a tabela juntada possui, incondicionalmente, no mnimo uma
linha para cada linha de T1.

CROSS JOIN e SELF JOIN (para si mesmo).


Vide item 7.2.1.1 do manualocial para mais detalhes e
exemplos.
LIMIT

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 da consulta. Podemos retornar desde apenas uma at to27

28
das.

CAPTULO 11. CONSULTAS JOIN

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
com uma expresso booleana. O escopo das expresses

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
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 11. CONSULTAS JOIN

Captulo 12

Sub Consultas
12.1 4.3 Sub consultas

ANY/SOME

So consultas dentro de consultas.

SELECT nome, CASE WHEN nome = ANY (SELECT


nome FROM frutas) THEN 'sim' ELSE 'no' END AS
fruta FROM alimentos;

Subconsulta escalar um comando SELECT comum, entre parnteses, que retorna exatamente um registro, com CASE WHEN
um campo.
EXEMPLO1
select nome, (select max(preco) from produtos where create table amigos( codigo serial primary key, nome
codigo=1) as maior preo from produtos; SELECT char(45), idade int );
* FROM tabela1 WHERE tabela1.col1 = (SELECT
col2 FROM tabela2 WHERE col2 = valor); SELECT insert into amigos (nome, idade) values ('Joo Brito', 25);
name FROM customer WHERE customer_id NOT IN insert into amigos (nome, idade) values ('Roberto', 35);
( SELECT customer_id FROM salesorder ); SELECT insert into amigos (nome, idade) values ('Antnio', 15);
'test' AS test, id FROM (SELECT * FROM books) AS insert into amigos (nome, idade) values ('Francisco Queiexample_sub_query; SELECT rstname, state, CASE roz', 23); insert into amigos (nome, idade) values ('BerWHEN state = 'PA' THEN 'close' WHEN state = 'NJ' nardo dos Santos, 21); insert into amigos (nome, idade)
OR state = 'MD' THEN 'far' ELSE 'very far' END AS values ('Francisca Pinto', 22); insert into amigos (nome,
idade) values ('Natanael', 55);
distance FROM friend;
select nome, idade, case when idade >= 21 then 'Adulto'
else 'Menor' end as status from amigos order by nome;
Expresses de Sub Consultas
-- CASE WHEN cria uma coluna apenas para exibio

EXISTS

SELECT campo1 FROM tabela1 WHERE EXISTS EXEMPLO2


(SELECT 1 FROM tabela2 WHERE campo2 = ta- create table amigos( codigo serial primary key, nome
bela1.campo2);
char(45), estado char(2) );
Combinando CASE e EXISTS
CREATE TEMPORARY TABLE frutas (id SERIAL
PRIMARY KEY, nome TEXT); INSERT INTO frutas
VALUES (DEFAULT, 'banana'); INSERT INTO frutas
VALUES (DEFAULT, 'ma');

insert into amigos (nome, estado) values ('Joo Brito',


'CE'); insert into amigos (nome, estado) values ('Roberto', 'MA'); insert into amigos (nome, estado) values
('Antnio', 'CE'); insert into amigos (nome, estado) values ('Francisco Queiroz', 'PB'); insert into amigos (nome,
estado) values ('Bernardo dos Santos, 'MA'); insert into
amigos (nome, estado) values ('Francisca Pinto', 'SP'); insert into amigos (nome, estado) values ('Natanael', 'SP');

CREATE TEMPORARY TABLE alimentos (id SERIAL PRIMARY KEY, nome TEXT); INSERT INTO
alimentos VALUES (DEFAULT, 'ma'); INSERT
select nome, estado, case when estado = 'PB' then 'FeINTO alimentos VALUES (DEFAULT, 'espinafre');
chado' when estado = 'CE' or estado = 'SP' then 'FunciSELECT nome, CASE WHEN EXISTS (SELECT nome onando' when estado = 'MA' then 'Funcionando a todo
FROM frutas WHERE nome=a.nome) THEN 'sim' 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;
menor, (SELECT MAX(nota) FROM notas) AS maior,
(ROUND(SELECT AVG(nota) FROM notas)) AS meNOT IN
31

32
dia FROM notas;

CAPTULO 12. SUB CONSULTAS

Captulo 13

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

Strings
14.1 5.1 Funes de Strings

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

Concatenao de Strings - dois || (pipes)

Remover Espaos de Strings

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

SELECT TRIM(' SQL - PADRO ');


SELECT CHR(67)||CHR(65)||CHR(84) AS Dog"; -Calcular MD5 de String
Dog CAT
SELECT
MD5('ribafs);
Retorna
Quantidade de Caracteres de String
53cd5b2af18063bea8ddc804b21341d1
char_length - retorna o nmero de caracteres
Repetir uma string n vezes
SELECT CHAR_LENGTH('UNIFOR'); - -Retorna 6
SELECT REPEAT('SQL-', 3); - - Retorna SQL-SQLOu SELECT LENGTH('Database'); - - Retorna 8
SQLConverter para minsculas

Sobrescrever substring em string

SELECT LOWER('UNIFOR');
Converter para maisculas

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

SELECT UPPER('universidade');

Dividir Cadeia de Caracteres com Delimitador

Posio de caractere

SELECT SPLIT_PART( 'PostgreSQL', 'gre', 2); - Retorna SQL

SELECT POSITION ('@' IN 'ribafs@gmail.com'); -SELECT SPLIT_PART( 'PostgreSQL', 'gre', 1); - Retorna 7
Retorna Post
Ou SELECT STRPOS('Ribamar' ,'mar'); - - Retorna 5
<------gre----->
Substring
Iniciais Maisculas
SUBSTRING(string [FROM inteiro] [FOR inteiro])
INITCAP(text) - INITCAP ('ol mundo') - - Ol Mundo
SELECT SUBSTRING ('Ribamar FS' FROM 9 FOR
Remover Espaos em Branco
10); - - Retorna FS
TRIM ([leading | trailing | both] [characters] from string)SUBSTRING(string FROM padro);
remove caracteres da direita e da esquerda. trim (both 'b'
SELECT SUBSTRING ('PostgreSQL' FROM '.......'); - - from 'babacatebbbb'); - - abacate
Retorna Postgre
RTRIM (string text, chars text) - Remove os caracteres
SELECT SUBSTRING ('PostgreSQL' FROM '...$'); - - chars da direita (default espao)
Retorna SQL
rtrim('removarrrr', 'r') - - remova
Primeiros ....... e ltimos ...$
LTRIM - (string text, chars text) - Remove os caracteres
Ou
chars da esquerda
SUBSTR ( 'string', inicio, quantidade);
ltrim('abssssremova', 'abs) - - remova
SELECT SUBSTR ('Ribamar', 4, 3); - - Retorna mar

Detalhes no item 9.4 do Manual:

Substituir todos os caracteres semelhantes

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

SELECT TRANSLATE(string, velho, novo);

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


34

14.1. 5.1 FUNES DE STRINGS


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' ~ 'abc' -- TRUE
'abc' ~ '^a' -- TRUE
'abc' ~ '(b|j)' -- TRUE
'abc' ~ '^(b|c)' -- FALSE

35

Captulo 15

Matemticas
15.1 5.2 Funes Matemticas

expresso IS NOT NULL


expresso IS TRUE

Operadores Matemticos

expresso IS NOT TRUE

+, -, *, /, % (mdulo, resto de diviso de inteiros), ^(po- expresso IS FALSE


tncia), !(fatorial), @(valor absoluto)
expresso IS NOT FALSE
| / - rais quadrada ( | / 25.0 = 5) | | / - raiz cbica ( | | / 27.0 expresso IS UNKNOWN
= 3)
expresso IS NOT UNKNOWN
Algumas funes Matemticas
OPERADOR NULL
ABS(x) - valor absoluto de x
Em SQL NULL para valores inexistentes. Regra geral:
CEIL(numeric) - arredonda para o prximo inteiro supe- NULL se propaga, o que signica que com quem NULL
rior
se combina o resultado ser um NULL. NULL no zero,
DEGREES(valor) - converte valor de radianos para graus no string vazia nem string de comprimento zero.
FLOOR(numeric) - arredonda para o prximo inteiro in- Um exemplo: num cadastro de alunos, para o aluno que
ainda no se conhece a nota, no correto usar zero para
ferior
sua nota, mas sim NULL. No se pode efetuar clculos
MOD(x,y) - resto da diviso de x por y
de expresses onde um dos elementos NULL.
PI() - constante PI (3,1415...)
COMPARANDO NULLs
POWER(x,y) - x elevado a y

NOT NULL com NULL -- Unknown

RADIANS(valor) - converte valor de graus para radianos NULL com NULL -- Unknown
RANDOM() - valor aleatrio entre 0 e 1
CONVERSO DE/PARA NULL
ROUND(numeric) - arredonda para o inteiro mais pr- NULLIF() e COALESCE()
ximo
NULLIF(valor1, valor2)
ROUND(v, d) - arredonda v com d casas decimais
NULLIF Retorna NULL se, e somente se, valor1 e vaSIGN(numeric) - retorna o sinal da entrada, como 1 ou lor2 forem iguais, caso contrrio retorna valor1.
+1
Algo como:
SQRT(X) - Raiz quadrada de X
if (valor1 == valor2){
TRUNC (numeric) - trunca para o nenhuma casa decimal
then NULL
TRUNC (v numeric, s int) - trunca para s casas decimais
else valor1;
Operadores Lgicos:
Retorna valor1 somente quando valor1 == valor2.
AND, OR e NOT. TRUE, FALSE e NULL
COALESCE retorna o primeiro de seus argumentos
Operadores de Comparao:
que no for NULL. S retorna NULL quando todos os
seus argumentos forem NULL.
<, >, <=, >=, =, <> ou !=
a BETWEEN x AND y

Uso: mudar o valor padro cujo valor seja NULL.

a NOT BETWEEN x AND y

create table nulos(nulo int, nulo2 int, nulo3 int);

expresso IS NULL

insert into nulos values (1,null,null);


36

15.2. NULL OU NO NULL, EIS A QUESTO!


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

Agrupamento
16.1 5.3 Funes de Agrupamento (Agregao)

Caso tenha problema com esta consulta use:


SELECT campo FROM tabela ORDER BY campo ASC
LIMIT 1; -- trar o menor

SELECT MAX(campo) AS Valor Mximo FROM taAs funes de agrupamento so usadas para contar o n- bela;
mero de registros de uma tabela.
Caso tenha problema com esta consulta use:
avg(expresso)

SELECT campo FROM tabela ORDER BY campo


DESC LIMIT 1; -- trar o maior

count(*)
count(expresso)
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';
SELECT MIN(campo) AS Valor Mnimo FROM tabela;

38

Captulo 17

Data e Hora
17.1 5.4 Funes de Data/Hora

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


No usar em campos somente timestamp.

Operaes com datas:

Funo date_part (retorna double)

timestamp '2001-09-28 01:00' + interval '23 hours -> ti- SELECT date_part('day', TIMESTAMP '2001-02-16
20:38:40');
mestamp '2001-09-29 00:00'
date '2001-09-28' + interval '1 hour' -> timestamp '2001- Resultado: 16 (day uma string, diferente de extract)
09-28 01:00'
Obtendo o dia da data atual:
date '01/01/2006' date '31/01/2006'
time '01:00' + interval '3 hourstime -> '04:00'

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

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

Obtendo o ms da data atual:

Funo age (retorna Interval) - Diferena entre datas

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

age(timestamp)interval (Subtrai de hoje)


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

CUR-

CUR-

Obtendo o ano da data atual:

SELECT
DATE_PART('YEAR',
CURage(timestamp, timestamp)interval Subtrai os argumen- RENT_TIMESTAMP) AS ano;
tos
Funo date_trunc (retorna timestamp)
age('2001-04-10', timestamp '1957-06-13') -> 43 years 9
SELECT date_trunc('year', TIMESTAMP '2001-02-16
mons 27 days
20:38:40');
Funo extract (retorna double) Extrai parte da data:
Retorna 2001-02-16 00:00:00
ano, ms, dia, hora, minuto, segundo.
select extract(year from age('2001-04-10', timestamp Convertendo (CAST)
'1957-06-13'))
select to_date('1983-07-18', 'YYYY-MM-DD')
select extract(month from age('2001-04-10', timestamp select to_date('19830718', 'YYYYMMDD')
'1957-06-13'))
Funo timeofday (retorna texto)
select extract(day from age('2001-04-10', timestamp
select timeofday() -> Fri Feb 24 10:07:32.000126 2006
'1957-06-13'))
BRT
Data e Hora atuais (retornam data ou hora)
Interval
SELECT CURRENT_DATE;
interval [ (p) ]
SELECT CURRENT_TIME;
to_char(interval '15h 2m 12s, 'HH24:MI:SS')
SELECT CURRENT_TIME(0);
date '2001-09-28' + interval '1 hour'
SELECT CURRENT_TIMESTAMP;
interval '1 day' + interval '1 hour'
SELECT CURRENT_TIMESTAMP(0);
interval '1 day' - interval '1 hour'
Somar dias e horas a uma data:
900 * interval '1 second'
SELECT CAST('06/04/2006' AS DATE) + INTERVAL
Interval trabalha com as unidades: second, minute, hour,
'27 DAYS' AS Data;
day, week, month, year, decade, century, millenium ou
Funo now (retorna timestamp with zone)
39

40

CAPTULO 17. DATA E HORA

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

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

Converso de Tipos
19.1 5.6 - Converso Explcita de
Tipos (CAST)

SELECT HAS_TABLE_PRIVILEGE('usuario','tabela','privilegio');
SELECT HAS_TABLE_PRIVILEGE('postgres,'nulos,'insert');
- - Retorna: t

CAST ( expresso AS tipo ) AS apelido; -- Sintaxe SQL SELECT HAS_DATABASE_PRIVILEGE('postgres,'testes,'create');


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

length(objeto) - - length(path '((1,0), (1,0))');

SELECT substr(CAST (1234 AS text), 3);

radius(circle) - - radius(circle '((0,0), 2.0)');

SELECT 1 AS real UNION SELECT CAST('2.2' AS width(box) - - width(box '((0,0), (1,1))');


REAL);
Funes para Redes
Funes Diversas
Funes cidr e inet
SELECT CURRENT_DATABASE();
host(inet) - - host('192.168.1.5/24') - - 192.168.1.5
SELECT CURRENT_SCHEMA();
masklen(inet) - - masklen('192.168.1.5/24') - - 24
SELECT CURRENT_SCHEMA(boolean);
netmask(inet) - - netmask('192.168.1.5/24') SELECT CURRENT_USER;
255.255.255.0
SELECT SESSION_USER;
SELECT VERSION();

network(inet) 192.168.1.0/24

SELECT CURRENT_SETTING('DATESTYLE');

Funo macaddr
42

network('192.168.1.5/24')

19.1. 5.6 - CONVERSO EXPLCITA DE TIPOS (CAST)


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)
pg_read_le(arquivo text, oset bigint, tamanho bigint)
pg_stat_le(arquivo text)

43

Captulo 20

Funes Denidas pelo Usurio e Triggers


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

44

Captulo 21

SQL
21.1 6 - Funes no PostgreSQL

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

O PostgreSQL oferece quatro tipos de funes:

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

Funes escritas em SQL

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


pelo usurio e seu uso.

Funes em linguagens de procedimento


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

O func.sql traz algumas funes em SQL e outras


em C.

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


etc).
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,
baia
SECURITY INVOKER indica que a funo deve 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 * 2
ser executada com os privilgios do usurio que a
AS salario; $$ LANGUAGE SQL; SELECT nome,
criou.
dobrar_salario(emp.*) AS sonho FROM empregados
WHERE empregados.baia ~= point '(2,1)';
Uma grande fora do PostgreSQL que ele permite a
criao de funes pelo usurio em diversas linguagens:
Algumas vezes prtico gerar o valor do argumento comSQL, PlpgSQL, TCL, Perl, Phyton, Ruby.
posto em tempo de execuo. Isto pode ser feito atravs
Para ter exemplos a disposio vamos instalar os do dire- da construo ROW.
trio tutorial dos fontes do PostgreSQL:
SELECT nome, dobrar_salario(ROW(nome, sala Acessar /usr/local/src/postgresql-8.1.3/src/tutorial e rio*1.1, idade, baia)) AS sonho FROM empregados;
executar: make install
Feito isso teremos 5 arquivos .sql.

Funo que retorna um tipo composto. Funo que retorna uma nica linha da tabela empregados:
45

46
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);
Mais detalhes no captulo 31 do manual.

CAPTULO 21. SQL

Captulo 22

PlpgSQL
22.1 6.2 - Funes em Pl/pgSQL
Exemplo para somar 3 Valores
As funes em linguagens procedurais no PostgreSQL,
como a Pl/pgSQL so correspondentes ao que se chama
comumente de Stored Procedures. Por default o PostgreSQL s traz suporte s funes na linguagem SQL.
Para dar suporte funes em outras linguagens temos
que efetuar procedimentos como a seguir.

CREATE FUNCTION somar_tres_valores(v1 anyelement, v2 anyelement, v3 anyelement) RETURNS


anyelement AS $$ DECLARE resultado ALIAS FOR
$0; BEGIN resultado := v1 + v2 + v3; RETURN
resultado; END; $$ LANGUAGE plpgsql; SELECT
somar_tres_valores(10,20,30);

Para que o banco postgres tenha suporte linguagem


de procedimento Pl/PgSQL executamos na linha de co- Utilizao de tipo composto:
mando como super usurio do PostgreSQL:
CREATE
FUNCTION
mesclar_campos(t_linha
createlang plpgsql U nomeuser nomebanco no prompt nome_da_tabela) RETURNS text AS $$ DECLARE
ou create language plpgsql por SQL.
t2_linha nome_tabela2%ROWTYPE; BEGIN SELECT
* INTO t2_linha FROM nome_tabela2 WHERE ...
PGSQL 8.4
; RETURN t_linha.f1 || t2_linha.f3 || t_linha.f5 ||
createlang -U nomeuser -W -e plpgsql nomebanco
t2_linha.f7; END; $$ LANGUAGE plpgsql; SELECT
A Pl/pgSQL a linguagem de procedimentos armaze- mesclar_campos(t.*) FROM nome_da_tabela t WHERE
nados mais utilizada no PostgreSQL, devido ser a mais ... ;
madura e com mais recursos.
//Cdigo-fonte CREATE FUNCTION func_escopo()
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 quantidade
integer := 80; BEGIN RAISE NOTICE 'Aqui a quantidade %', quantidade; -- A quantidade aqui 80 END;
RAISE NOTICE 'Aqui a quantidade %', quantidade;
-- A quantidade aqui 50 RETURN quantidade; END;
$$ LANGUAGE plpgsql; => SELECT func_escopo();
CREATE FUNCTION instr(varchar, integer) RETURNS integer AS $$ DECLARE v_string ALIAS
FOR $1; index ALIAS FOR $2; BEGIN -- algum
processamento neste ponto END; $$ LANGUAGE
plpgsql;

Temos uma tabela (datas) com dois campos (data e hora)


e queremos usar uma funo para manipular os dados
desta tabela:
CREATE or REPLACE FUNCTION data_ctl(opcao
char, fdata date, fhora time) RETURNS char(10) AS $$
DECLARE opcao ALIAS FOR $1; vdata ALIAS FOR
$2; vhora ALIAS FOR $3; retorno char(10); BEGIN IF
opcao = 'I' THEN insert into datas (data, hora) values
(vdata, vhora); retorno := 'INSERT'; END IF; IF opcao
= 'U' THEN update datas set data = vdata, hora = vhora
where data='1995-11-01'; retorno := 'UPDATE'; END
IF; IF opcao = 'D' THEN delete from datas where
data = vdata; retorno := 'DELETE'; ELSE retorno :=
'NENHUMA'; END IF; RETURN retorno; END; $$
LANGUAGE plpgsql; --select data_ctl('I','1996-11-01',
'08:15'); select data_ctl('U','1997-11-01','06:36'); select
data_ctl('U','1997-11-01','06:36');

Exemplo concatenar campos.


CREATE
FUNCTION
concatenar_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
plpgsql;

Mais Detalhes no captulo 35 do manual ocial.


Funes que Retornam Conjuntos de Registros
(SETS)
CREATE

47

OR

REPLACE

FUNCTION

co-

48
digo_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;

CAPTULO 22. PLPGSQL


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 Relacionando:


plpgsql que retornem um registro, antes precisamos criar select d.nome, a.minsal, a.maxsal, a.medsal from meduma varivel composta do tipo ROWTYPE, descrevendo sal() a, departamentos d where d.codigo = a.deptcod
o registro (tupla) de sada da funo.
CREATE TABLE empregados( nome_emp text,
salario int4, codigo int4 NOT NULL, departamento_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; 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

Captulo 23

Triggers
23.1 6.3 - Triggers (Gatilhos)

podem ser especicados utilizando OR.


Exemplos:

Captulo 32 do manual ocial: http://pgdocptbr. CREATE TABLE empregados( codigo int4 NOT
NULL, nome varchar, salario int4, departamento_cod
sourceforge.net/pg80/sql-createtrigger.html
int4, ultima_data timestamp, ultimo_usuario varAt a verso atual no existe como criar funes de gati- char(50), CONSTRAINT empregados_pkey PRIlho na linguagem SQL.
MARY KEY (codigo) ) CREATE FUNCTION
Uma funo de gatilho pode ser criada para executar an- empregados_gatilho() RETURNS trigger AS $empretes (BEFORE) ou aps (AFTER) as consultas INSERT, gados_gatilho$ BEGIN -- Vericar se foi fornecido o
UPDATE OU DELETE, uma vez para cada registro (li- nome e o salrio do empregado IF NEW.nome IS NULL
nha) modicado ou por instruo SQL. Logo que ocorre THEN RAISE EXCEPTION 'O nome do empregado
um desses eventos do gatilho a funo do gatilho dispa- no pode ser nulo'; END IF; IF NEW.salario IS NULL
THEN RAISE EXCEPTION '% no pode ter um
rada automaticamente para tratar o evento.
salrio nulo', NEW.nome; END IF; -- -- Quem paga
A funo de gatilho deve ser declarada como uma funo
para trabalhar? -- IF NEW.salario < 0 THEN RAISE
que no recebe argumentos e que retorna o tipo TRIGEXCEPTION '% no pode ter um salrio negativo',
GER. Aps criar a funo de gatilho, estabelecemos o
NEW.nome; END IF; -- -- -- Registrar quem alterou a
gatilho pelo comando CREATE TRIGGER. Uma funo
folha de pagamento e quando -- NEW.ultima_data :=
de gatilho pode ser utilizada por vrios gatilhos.
'now'; NEW.ultimo_usuario := current_user; RETURN
As funes de gatilho chamadas por gatilhos-por- NEW; END; $empregados_gatilho$ LANGUAGE
instruo devem sempre retornar NULL.
plpgsql; CREATE TRIGGER empregados_gatilho
As funes de gatilho chamadas por gatilhos-por-linha BEFORE INSERT OR UPDATE ON empregapodem retornar uma linha da tabela (um valor do tipo dos FOR EACH ROW EXECUTE PROCEDURE
HeapTuple) para o executor da chamada, se assim o de- empregados_gatilho(); INSERT INTO empregados
(codigo,nome, salario) VALUES (5,'Joo',1000);
cidirem.
INSERT INTO empregados (codigo,nome, salario)
Sintaxe:
VALUES (6,'Jos',1500); INSERT INTO empregados
CREATE TRIGGER nome { BEFORE | AFTER } (codigo,nome, salario) VALUES (7,'Maria',2500);
{ evento [ OR ... ] } ON tabela [ FOR [ EACH ] { SELECT * FROM empregados; INSERT INTO empreROW | STATEMENT } ] EXECUTE PROCEDURE gados (codigo,nome, salario) VALUES (5,NULL,1000);
NEW Para INSERT e UPDATE OLD Para DEnome_da_funo ( argumentos )
LETE CREATE TABLE empregados ( nome varchar
NOT NULL, salario integer ); CREATE TABLE emO gatilho ca associado tabela especicada e executa a
pregados_audit( operacao char(1) NOT NULL, usuario
funo especicada nome_da_funo quando determinavarchar NOT NULL, data timestamp NOT NULL,
dos eventos ocorrerem.
nome varchar NOT NULL, salario integer ); CREATE
O gatilho pode ser especicado para disparar antes de OR REPLACE FUNCTION processa_emp_audit() REtentar realizar a operao na linha (antes das restries TURNS TRIGGER AS $emp_audit$ BEGIN -- -- Cria
serem vericadas e o comando INSERT, UPDATE ou uma linha na tabela emp_audit para reetir a operao
DELETE ser tentado), ou aps a operao estar completa -- realizada na tabela emp. Utiliza a varivel especial
(aps as restries serem vericadas e o INSERT, UP- TG_OP -- para descobrir a operao sendo realizada.
DATE ou DELETE ter completado).
-- IF (TG_OP = 'DELETE') THEN INSERT INTO
evento Um entre INSERT, UPDATE ou DELETE; es- emp_audit SELECT 'E', user, now(), OLD.*; RETURN
pecica o evento que dispara o gatilho. Vrios eventos OLD; ELSIF (TG_OP = 'UPDATE') THEN INSERT
49

50
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;
Outro exemplo:
CREATE TABLE empregados ( codigo serial PRIMARY KEY, nome varchar NOT NULL, salario integer
); CREATE TABLE empregados_audit( usuario varchar
NOT NULL, data timestamp NOT NULL, id integer
NOT NULL, coluna text NOT NULL, valor_antigo text
NOT NULL, valor_novo text NOT NULL ); CREATE
OR REPLACE FUNCTION processa_emp_audit()
RETURNS TRIGGER AS $emp_audit$ BEGIN
-- -- No permitir atualizar a chave primria -- IF
(NEW.codigo <> OLD.codigo) THEN RAISE EXCEPTION 'No permitido atualizar o campo codigo';
END IF; -- -- Inserir linhas na tabela emp_audit para
reetir as 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
= 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

CAPTULO 23. TRIGGERS


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 $$ declare r record; begin select into
r * from clientes where id = $1; if not found then
raise exception ''Cliente no existente !''; end if; return
r.nome; end; $$ language 'plpgsql';
Crie uma funo que retorne os nome de toda a tabela
clientes concatenados em um s campo
create or replace function clientes_nomes() returns text
as $$ declare x text; r record; begin x:=''Inicio''; for r in
select * from clientes order by id loop x:= x||'' : ''||r.nome;
end loop; return x||'' : m''; end; $$ language 'plpgsql';

Captulo 24

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

51

Captulo 25

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

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

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

56

Captulo 28

Backup e Restore
28.1 9.1 - Backup e Restore
Administrao

pg_dump -U nomeusuario -d nomebanco -t nometabela


> nomescript
Restaurar apenas uma tabela

Para conseguir restaurar apenas uma tabela uma forma


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

pg_stat_get_backend_activity(s.backendid)
rent_query

AS

cur-

Obs.: Cuidado ao restaurar um banco, especialmente se


existirem tabelas sem integridade. Corre-se o risco de FROM (SELECT pg_stat_get_backend_idset() AS backendid) AS s;
duplicar os registros.
Descompactar e fazer o restore em um s comando: Determinao da utilizao em disco pelas Tabelas
gunzip -c backup.tar.gz | pg_restore -d banco
ou

Tendo um banco com cadastro de CEPs e apenas uma tabela cep_tabela, mostrar o uso do disco por esta tabela.
Precisamos ltrar as tabelas de sistema, veja:

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

VACUUM ANALYZE;
(o cat envia um stream do arquivo para o gunzip que passa O utilitrio VACUUM recupera espao em disco ocupara o pg_restore)
pado pelos registros excludos e atualizados, atualiza os
dados para as estatsticas usadas pelo planejador de conBackup local de apenas uma tabela de um banco:
57

58

CAPTULO 28. BACKUP E RESTORE

sultas e tambm protege contra perda de dados quando dbsize mostra o tamanho de tabelas e bancos
atingir um bilho de transaes.
oid2name retorna OIDs, leinode e nomes de tabelas
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 ********
relname | rellenode | relpages

All databases:

+-------------+----------

Oid Database Name Tablespace 33375 bdcluster ncluster


16948 cep_brasil pg_default 25146 cep_full pg_default
33360 controle_estoque pg_default 16879 municipios
O daemon do auto-vacuum
pg_default 33340 pgbench pg_default 10793 postgres
Iniciando na verso 8.1 um processo opcional do ser- pg_default 10792 template0 pg_default 33377 template1
vidor, chamado de autovacuum daemon, cujo uso pg_default 16898 testes pg_default
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 atualiPortanto o postgresql.conf deve car assim:
zado pelo comando VACUUM.
stats_start_collector = on
Backup Automtico de Bancos no Windows com o
Agendador de Tarefas
stats_row_level = on
cep_pk | 25140 | 2441 cep_tabela | 16949 | 27540

autovacuum = on

Criao do script backuppg.bat:

Por default ser executado a casa 60 segundos. Para alte- rem Adaptao de Ribamar FS do original de Ivlison
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;
Veja que no resultado tambm aparece a tabela de ndices, rem (Deletando o backup existente)
e com uso signicativo.
del banco*.sql
Ferramentas Contrib
echo Aguarde, realizando o backup do Banco de Dados
pgbench testa desempenho do SGBD.

28.1. 9.1 - BACKUP E RESTORE


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

Importar e Exportar
29.1 9.2 - Importar e Exportar

- Desmarque Colar tudo, marque Nmeros, desmarque


Frmulas e OK

Estando na console e usando pg_dumpall e psql:

- Tecle Ctrl+S para salvar

Efetuando backup:

- Em Tipo de arquivo escolha Texto CSV, digite o nome


e Salvar. Conrme

pg_dumpall > bancos.sql - Para preservar os OIDs use a


- Como Delimitador de Campo escolha Tabulao
opo -o no pg_dumpall.
- Em Delimitador de texto delete as aspas e OK
Restore de seus dados:
- Ignore a mensagem de erro, caso aparea.

psql -d postgres -f bancos.sql

Para importar scripts gerados via pg_dump de dentro do Importar o arquivo texto CSV para uma tabela com
estrutura semelhante do arquivo csv:
psql devemos utilizar o comando
su - postgres
\i /path/script.sql
\i ./script.sql -- Tambm para o windows com o arquivo psql nomebanco
no diretrio atual
\copy nometabela from /home/nomearquivo.csv
Para importar arquivos texto com delimitadores, tipo No Windows
TXT, CSV ou binrios utilizamos os comandos do banco
\copy nometabela from ./arquivo.csv -- o arquivo estando
(psql), como usurio do banco:
no path do usurio
Importando:
Exportar um Banco Access para uso no PostgreSQL
\COPY tabela FROM script.csv
ou outros bancos
\COPY paises FROM 'paises.csv';
Selecionar a tabela e Exportar
Exportando:

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

CREATE TEMP TABLE paises AS SELECT * FROM Em avanado: Delimitador de campos Tabulao
teste WHERE nome LIKE '%tina%';
Qualicador de texto remover (deixar em branco)
\COPY paises TO '/usr/teste.copy';
Com Delimitadores
\COPY tabela FROM '/arquivo.csv' DELIMITERS '|';
\COPY tabela TO '/arquivo.txt' DELIMITERS '|';
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
- 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
60

Captulo 30

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

Otimizao e Desempenho
31.1 Otimizao e Desempenho

apenas ser congurado para que seja executado automaticamente.

Para isso ajusta-se bem o postgresql.conf, utiliza-se o va- Na linha de comando:


cuum, analyze e explain.
vacuumdb -faze ou vacuumdb -fazq.
Lembrando que na verso 8.1 o vacuum no mais
um programa separado e vem embutido no executvel.
Mesmo embutido ele congurvel e podemos utilizar
31.5 ANALYZE
ou no e se usar, podemos tambm congurar sua periodicidade.
O comando ANALYZE coleta estatsticas sobre o contedo das tabelas do banco de dados e armazena os resulna tabela do sistema pg_statistic. Posteriormente,
31.2 How to optimize PostgreSQL tados
o planejador de comandos utiliza estas estatsticas para
database size
ajudar a determinar o plano de execuo mais eciente
para os comandos. Caso no atualizemos estas estatsticas com freqncia podemos comprometer o desempehttp://www.linuxinsight.com/optimize_postgresql_
nho do banco de dados por uma escolha errada do plano
database_size.html
de comandos.
Normalmente operaes DELETE ou UPDATE no removem os registros automaticamente. Somente aps a
execuo do VACUUM isso acontece.

31.3 Uma tima fonte de consulta


http://www.metatrontech.com/wpapers/
mysql2postgresql.pdf

31.6 Recomendao

Captulo 21 do manual:
http://pgdocptbr.sourceforge.net/pg80/maintenance.
html

Para a maioria das instalaes executar o comando VACUUM ANALYZE para todo o banco de dadosuma vez
ao dia em horrio de pouca utilizao. Tambm podemos
utilizar o comando: vacuumdb -fazq.

Vacuum:
http://pgdocptbr.sourceforge.net/pg80/sql-vacuum.html

Quando foi excluda a maioria dos registros de uma taAnalyze:


http://pgdocptbr.sourceforge.net/pg80/
bela sugere-se a execuo do comando VACUUM FULL.
sql-analyze.html
Este comando gera um forte bloqueio nas tabelas em que
executado.

31.4 VACUUM
O comando Vacuum tanto recupera espao em disco,
quanto otimiza o desempenho do banco e previne contra perda de dados muito antigos devido ao recomeo do
ID das transaes, portanto deve ser utilizado constantemente, como tambm atualiza as estatsticas dos dados
utilizados pelo planejador de comandos. Lembrando que
na verso 8.1 j vem embutido no executvel, podendo

Em tabelas cujo contedo excludo periodicamente,


como tabelas temporrias, indicado o uso do comando
TRUNCATE ao invs de DELETE.
Exemplo de uso do vacuum. Acesse o banco e execute:
VACUUM VERBOSE ANALYZE nometabela;
De fora do psql usar o comando vacuumdb -faze ou
vacuumdb -fazq (silencioso).
VACUUM VERBOSE ANALYZE autor;

62

31.9. PLANO DE CONSULTA

63

INFO: vacuuming public.autor

red_buers, que quanto maior melhor, respeitando-se a


INFO: autor": found 0 removable, 0 nonremovable row RAM.
versions in 0 pages
O default da verso 8.1.4 :
DETAIL: 0 dead row versions cannot be removed yet.
There were 0 unused item pointers.

shared_buers = 1000 # min 16 ou max_connections*2


(8KB cada)

0 pages are entirely empty.


CPU 0.00s/0.00u sec elapsed 0.00 sec.

31.9 Plano de Consulta

INFO: analyzing public.autor


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

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
- Separar bancos em um HD e logs em outro HD
- Aumentar shared buers (postgresql.conf) de acordo
com RAM disponvel.
Recomendaes: 25% da RAM para shared buers cache
e 2-4% para sort buer.

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).
Largura mdia estimada (em bytes) das linhas de
sada deste n do plano.
EXPLAIN SELECT * FROM NOMETABELA;

31.8 Separando bancos e Logs

Mostra plano de execuo interna da consulta, acusando


tempo gasto

bancos em /usr/local/pgsql/data (hda)

EXPLAIN SELECT sum(i) FROM tabela1 WHERE i =


4;

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

Agora a consulta ser modicada para incluir uma condio WHERE:

Utilizar links simblicos para mover tabelas, ndices, ...


EXPLAIN SELECT * FROM tenk1 WHERE unique1 <
para outro HD.
1000;
Ativar o chip DMA do HD
Modicando-se a consulta para restringir mais ainda a
Testar: hdparm -Tr /dev/hda (status)
condio
Ativar o chip: hdparm -d 1 /dev/hda
EXPLAIN SELECT * FROM tenk1 WHERE unique1 <
Desativar: hdparm -d 0 /dev/hda

50;

No postgresql.conf existem conguraes para sha- Adio de outra condio clusula WHERE:

64
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.

31.11 Alerta
Caso um banco j esteja com mais de 1,5 bilhes de transaes, ao executar o comando VACUUM para o banco
inteiro receber um alerta sobre a necessidade de execuo do VACUUM.

CAPTULO 31. OTIMIZAO E DESEMPENHO

Captulo 32

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. 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

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

67

Captulo 34

Congurar acessos
34.1 11.1 - pg_hba.conf

Sem um registro tipo local essa conexo negada


1. host DATABASE USER
METHOD [OPTION]

Ao instalar o PostgreSQL 8.1.4 via fontes ele cria (e


alerta) o arquivo pg_hba.conf com autenticao do tipo
trust (sem senha mas somente para conexo local).

CIDR-ADDRESS

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

DATABASE pode ser:

Arquivo de congurao da autenticao dos clientes do - all


PostgreSQL
- sameuser (para quando o usurio tiver o mesmo nome
do banco)
Este arquivo controla:
- Quais hosts tm permisso de conectar
- Como os clientes so autenticados
- Nomes dos usurios que podem usar
- Quais bancos eles podem acessar
Os registros deste arquivo tm as formas seguintes:

- samerole (para quando o usurio for membro de uma


role (papel) com o mesmo nome de um banco)
- um nome de banco ou
- uma lista separados por vrgula
USER pode ser:
- all (para qualquer usurio)

1. local DATABASE USER METHOD [OPTION]

- um nome de usurio

Este mtodo de conexo para uso somente atravs soc- - um nome de grupo prexado por "+"
kets de domnio UNIX
- uma lista separados por vrgula
68

34.1. 11.1 - PG_HBA.CONF


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

69
1. TYPE DATABASE USER CIDR-ADDRESS
METHOD

CIDR-ADDRESS especica uma faixa de IPs. Atravs


1. IPv4 local connections:
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.
Alternativamente podemos escrever o IP separado da
mscara em colunas diferentes para especicar o conjunto de hosts.
Exemplos (IPV4):
172.20.143.89/32 para um nico host
172.20.143.0/24 para uma rede

1. IPv6 local connections:


1. host all all ::1/128 md5
Alerta: este arquivo examinado sequencialmente para
cada tentativa de conexo.

O campo CIDR-ADDRESS somente se aplica aos regis- A ordem dos registros signicativa.
tros host, hostssl e hostnossl.
Caso um registro que venha primeiro entre em conito
IP-address e IP-mask
com outro que vem em seguida, o primeiro ser execuEstes campos podem ser utilizados como alternativa no- tado e o segundo, no.
tao CIDR-ADDRESS. ao invs
de especicar o comprimento da mscara, a atual mscara
especicada em uma coluna separada.
Exemplo:

Exemplos:
1. TYPE DATABASE USER CIDR-ADDRESS
METHOD

255.0.0.0 representa uma mscara CIDR em IPV4 com


local all all md5
comprimenro 8
255.255.255.255 representa uma mscara CIDR com local all all trust
comprimenro 32

Acima todas as conexes locais exigiro senha md5.

172.20.143.89 255.255.255.255

local all all trust

Estes campos somente se aplica aos registros host, hostssl local all all md5
e hostnossl.
J este acima aceitar todas as conexes locais incondiciMETHOD pode ser trust, reject, md5, crypt, onalmente (sem senha)
password,
A segunda linha ser ignorada.
1. krb5, ident, ou pam

Veja vrios exemplos do pg_hba.conf e mais detlahes no


captulo 20 do manual ocial do PostgreSQL em

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
host all all 127.0.0.1/32 md5
krb5 - somente disponvel para conexes via TCP/IP
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

password - envia senha em texto claro

host banco usuario 192.168.93.1/32 reject

md5 - deve ser preferido, pois envia senhas criptografadas ident

70

CAPTULO 34. CONFIGURAR ACESSOS

Obtm o nome de usurio do sistema operacional do cli1. TYPE DATABASE USER IP-ADDRESS IPente (para conexes TCP/IP fazendo contato com o serMASK METHOD
vidor 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 especiMais detalhes sobre o pg_hba.conf em:
cado aps a palavra chave ident.
Exemplo para Ubuntu (facilmente adaptvel para outras http://pgdocptbr.sourceforge.net/pg80/
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:
1. Aceitar toda a Internet, exceto 200.217.23.234

Captulo 35

Conguraes Diversas
35.1 11.2 - postgresql.conf

6 bytes each #max_fsm_relations = 1000 # min 100, ~70


bytes each Algumas Conguraes no postgresql.conf
... # AUTOVACUUM PARAMETERS #autovacuum
O postgresql.conf permite congurar as demais funcio- = o # enable autovacuum subprocess? ... # - Locale
and Formatting - #datestyle = 'iso, mdy' # Era o original
nalidades do PostgreSQL
datestyle = 'sql, european' # Formato dd/mm/yyyy ...
Liberando acesso via rede TCP/IP na verso 7.4.x:
#client_encoding = sql_ascii #client_encoding = latin1 #
tcp_socket = true (default = false)
Suporte acentuao do Brasil ...
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.

Consultando no psql: SHOW DATESTYLE;


Retorna -> SQL, DMY
Ajustando o estilo da data no psql: SET DATESTYLE
TO SQL, DMY;

sameuser o usurio padro no ident.conf (signica o ALTER ROLE nomeuser SET datestyle TO SQL, DMY;
mesmo user do sistema operacional).
O caminho de entrada num banco do PostgreSQL: ->
# FILE LOCATIONS #hba_le = 'Cong- postgresql.conf -> ph_hba.conf -> ident.conf (caso este
Dir/pg_hba.conf' # host-based authentication le # exista e seja citado no pg_hba.conf)
CONNECTIONS AND AUTHENTICATION # - O encoding e outros recursos podem ser passados para
Connection Settings # # O parmetro listen_address cada banco, no momento de sua criao, como por exemdene que interfaces de rede do servidor, atravs plo:
de seus endereos IP, aceitam tentativas de conexo
via TCP/IP #listen_addresses = 'localhost' # Quais De fora do banco: createdb -E LATIN1 nomebanco.
endereos IP ou nomes onde sero feitas as escutas; De dentro do banco (psql): CREATE DATABASE no# lista de endereos/nomes separados por vrgula; # mebanco WITH ENCODING 'LATIN1';
se fr omitido, o default 'localhost' # '*' = todas
Para a relao completa dos encoding suportados veja tainterfaces de rede estaro habilitadas para escutar
bela 21-2. Para visualizar a codicao no psql digite
requisies #port = 5432 max_connections = 100 (duas
\encoding.
so reservadas para o superusurio) # note: increasing
max_connections costs ~400 bytes of shared memory Para mudar a codicao de um banco dinamicamente,
per #superuser_reserved_connections = 2 # - Security estando nele utilize: \encoding novoencoding
& Authentication - #authentication_timeout = 60 # Como tambm podemos utilizar o comando SET: SET
1-600, in seconds #ssl = o #password_encryption = on CLIENT_ENCODING 'LATIN1'; Consultando o enco# RESOURCE USAGE (except WAL) # - Memory - ding existente SHOW CLIENT_ENCODING;
shared_buers = 1000 # min 16 or max_connections*2,
8KB each #temp_buers = 1000 # min 100, 8KB each PARA DESFAZER AS ALTERAES E VOL#max_prepared_transactions = 5 # can be 0 or more # TAR CODIFICAO PADRO: RESET CLInote: increasing max_prepared_transactions costs ~600 ENT_ENCODING;
bytes of shared memory # per transaction slot, plus lock Mais detalhes:
http://www.postgresql.org/docs/8.1/
space (see max_locks_per_transaction). #work_mem = interactive/runtime-config.html#CONFIG-SETTING
1024 # min 64, size in KB #maintenance_work_mem
= 16384 # min 1024, size in KB #max_stack_depth Para saber os locales existentes execute de dentro do psql:
= 2048 # min 100, size in KB # - Free Space Map - \l -- Exibe bancos, donos e locales (Codicao)
#max_fsm_pages = 20000 # min max_fsm_relations*16,
71

72
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 35. CONFIGURAES DIVERSAS

Captulo 36

Metadados
36.1 12 - Metadados (Catlogo)
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,
AS
Retornar banco, dono, codicao, comentrios e ta- pg_catalog.oidvectortypes(pc.proargtypes)
proarguments,
proargnames
AS
proargnames,
blespace
pg_catalog.obj_description(pc.oid,
'pg_proc')
SELECT pdb.datname AS banco, pu.usename AS AS procomment FROM pg_catalog.pg_proc pc,
dono, pg_encoding_to_char(encoding) AS codica- pg_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 Este exemplo mostra uma consulta que lista os nopt.oid=pdb.dattablespace) AS tablespace FROM mes dos esquemas, tabelas, colunas e chaves das chapg_database pdb, pg_user pu WHERE pdb.datdba = ves estrangeiras, e os nomes dos esquemas, tabelas e colunas referenciadas. Exemplo tirado da lista de discusso
pu.usesysid ORDER BY pdb.datname
pgsql-sql
Tabelas, donos, comentrios, registros e tablespaces
CREATE TEMPORARY TABLE t1 (id SERIAL
de um schema
PRIMARY KEY, nome TEXT); CREATE TEMSELECT
c.relname
as
tabela, PORARY TABLE t2 (id INT REFERENCES
pg_catalog.pg_get_userbyid(c.relowner)
AS
dono, t1, nome TEXT); SELECT n.nspname AS espg_catalog.obj_description(c.oid,
'pg_class)
AS quema, cl.relname AS tabela, a.attname AS coluna,
comentario, reltuples::integer as registros, (SE- ct.conname AS chave, nf.nspname AS esquema_ref,
LECT spcname FROM pg_catalog.pg_tablespace clf.relname AS tabela_ref, af.attname AS coluna_ref,
pt WHERE pt.oid=c.reltablespace) AS tables- pg_get_constraintdef(ct.oid) AS criar_sql FROM
pace FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_attribute a JOIN pg_catalog.pg_class
pg_catalog.pg_namespace n ON n.oid = c.relnamespace cl ON (a.attrelid = cl.oid AND cl.relkind = 'r')
WHERE c.relkind = 'r' AND nspname='public' ORDER JOIN pg_catalog.pg_namespace n ON (n.oid =
BY c.relname
cl.relnamespace) JOIN pg_catalog.pg_constraint ct
ON (a.attrelid = ct.conrelid AND ct.confrelid != 0 AND
Mostrar Sequences de um Esquema
73

74

CAPTULO 36. METADADOS

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]);

select datname, oid from pg_database;

Mostrar Esquemas e Tabelas

select indexrelname as indice, relname as tabela from


pg_catalog.pg_statio_user_indexes as A INNER JOIN
pg_catalog.pg_index as B ON A.indexrelid=B.indexrelid
WHERE A.schemaname='public' AND B.indisprimary
= true;

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;

Dado a tabela, qual o seu arquivo:


select relname, rellenode from pg_class;
Mostrar chaves primrias das tabelas do esquema
public

Para visualizar como as consultas so feitas internamente via psql usamos o comando assim:
psql -U user banco -E
Vamos usar o banco municipios, criado com os municpios do Brasil. A tabela opt_cidades.

Mostrar Esquemas e respectivas tabelas do Banco Veja Um Exemplo Que Retorna a Chave Primria da Taatual:
bela opt_cidades
SELECT n.nspname as esquema, c.relname as tabela
FROM pg_namespace n, pg_class c 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 ORDER BY nspname, relname

SELECT ic.relname AS index_name, bc.relname AS


tab_name, ta.attname AS column_name, i.indisunique
AS unique_key, i.indisprimary AS primary_key

Dado o banco de dados, qual o seu diretrio:

doskey

FROM pg_class bc, pg_class ic, pg_index i, pg_attribute


ta, pg_attribute ia WHERE bc.oid = i.indrelid AND
ic.oid = i.indexrelid AND ia.attrelid = i.indexrelid AND
Contar Todos os Registros de todas as tabelas de to- ta.attrelid = bc.oid AND bc.relname = 'opt_cidades
dos os bancos:
AND ta.attrelid = i.indrelid AND ta.attnum =
<?php
$conexao=pg_connect(host=127.0.0.1 i.indkey[ia.attnum-1] ORDER BY index_name,
user=postgres password=postabir); $sql="SELECT tab_name, column_name;
datname AS banco FROM pg_database ORDER Retornar:
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>banco; $banco[] .= $cons; $c++; } $sql2="SELECT opt_cidades_pkey | opt_cidades | id | t | t
n.nspname as esquema,c.relname as tabela FROM Retornando o Nome do Esquema
pg_namespace n, pg_class c WHERE n.oid =
c.relnamespace and c.relkind = 'r' -- no indices and SELECT n.nspname AS Esquema FROM
n.nspname not like 'pg\\_%' -- no catalogs and n.nspname pg_catalog.pg_namespace AS n, pg_catalog.pg_class
!= 'information_schema' -- no information_schema AS c WHERE c.relnamespace = n.oid AND
ORDER BY nspname, relname"; for ($x=0; $x < c.relname='opt_cidades;
count($banco);$x++){ if ($banco[$x] !="template0 Retorno: Esquema
&& $banco[$x] != template1 && $banco[$x] !="postgres){ $conexao2=pg_connect(host=127.0.0.1 db- Retornar nomes de bancos:
name=$banco[$x] user=postgres password=postabir); SELECT datname AS banco FROM pg_database
$consulta2=pg_query(
$conexao2,
$sql2
); WHERE datname != 'template0' and datname != 'temwhile ($data = pg_fetch_object($consulta2)) { plate1' and datname != 'postgres ORDER BY datname
$esquematab=$data->esquema.'.'.$data->tabela;
Retornar nomes e OIDs dos bancos:
$sql3="SELECT
count(*)
FROM
$esquematab";
$consulta3=pg_query($conexao2,$sql3); SELECT oid, datname FROM pg_database;
$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].'
'; $total += $res[0]; } } } print Total de Registro de No Windows
todas as tabelas de todos os bancos ". $total; ?>
Podemos passar parmetros para as macros, por exemplo:
/exename=psql.exe

dbinfo=SELECT

dat-

36.1. 12 - METADADOS (CATLOGO)


name,pg_encoding_to_char(encoding)
pg_database WHERE datname='$1';

75
FROM

E ento apenas passar o parmetro na linha de comando:

Tabelas e Soma
SELECT tablename, SUM( size_kb )
FROM

postgres=# dbinfo postgres

( SELECT c1.relname AS tablename,

Listar tabelas, e dono do esquema atual:

c2.relpages * 8 AS size_kb

SELECT n.nspname as Schema,

FROM pg_class c1, pg_class c2, pg_index i

c.relname as Tabela,

WHERE c1.oid = i.indrelid


CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' AND i.indexrelid = c2.oid
THEN 'view' WHEN 'i' THEN
UNION
'index' WHEN 'S' THEN 'sequence' WHEN 's THEN
SELECT relname, relpages * 8
'special' END as Tipo,
u.usename as Dono

FROM pg_class

FROM pg_catalog.pg_class c

WHERE relkind = 'r' ) AS relations

LEFT JOIN pg_catalog.pg_user u ON u.usesysid = GROUP BY tablename;


c.relowner
-- r = ordinary table, i = index, S = sequence, v = view, c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = = composite type, -- s = special, t = TOAST table
c.relnamespace
Tamanho em bytes de um banco:
WHERE c.relkind IN ('r',)

select pg_database_size('banco');

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

Tamanho em bytes de uma tabela:

AND pg_catalog.pg_table_is_visible(c.oid)

pg_total_relation_size('tabela')

ORDER BY 1,2;

Tamanho em bytes de tabela ou ndice:

Listar Tabelas

pg_relation_size('tabelaouindice')

select c.relname FROM pg_catalog.pg_class c

Lista donos e bancos:


LEFT JOIN pg_catalog.pg_namespace n ON n.oid = SELECT rolname as dono, datname as banco
c.relnamespace
FROM pg_roles, pg_database
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);
SELECT tablename FROM pg_tables WHERE table- Nomes de bancos:
name NOT LIKE 'pg%' AND tablename NOT LIKE select datname from pg_database where datname not in
'sql\_%'
('template0','template1') order by 1
Listar todas as tabelas, ndices, tamanho em KB e Nomes e colunas:
OIDs:
select tablename,'T' from pg_tables where tablename not
VACUUM; --Executar antes este comando
like 'pg\_%' and tablename not in ('sql_features,
'sql_implementation_info',
'sql_languages,
SELECT c1.relname AS tabela, c2.relname AS indice,
'sql_packages, 'sql_sizing', 'sql_sizing_proles)
c2.relpages * 8 AS tamanho_kb, c2.rellenode AS arunion
quivo
select viewname,'V' from pg_views where viewname not
FROM pg_class c1, pg_class c2, pg_index i
like 'pg\_%'
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
ORDER BY tabela, indice DESC, tamanho_kb;
and t.oid=idx.indrelid ) ) * cast( 8192 AS bigint ) as in-

76

CAPTULO 36. 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
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';
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:

CAPTULO 36. METADADOS


and n.nspname not like 'pg\\_%' -- no catalogs
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

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
JDBC
com o Java e com o Visual BASIC.
Tambm mostrarei a conectividade atravs do ODBC Crie no PostgreSQL um pequeno banco de dados chamado agenda com uma nica tabela chamada amigos.
com o Access.
Esta tabela contendo os campos nome e email apenas.
Cadastre um ou mais registros para melhor visualizao
Com o PHP existe uma conexo nativa. Veja um exemdos resultados.
plo:
import java.sql.*;
$conexao = pg_connect(host=127.0.0.1 dbname=testes
public class SQLStatement {
user=postgres password=******* port=5432);
Conectando com o PHP

if (!$conexao){
echo Falha na conexo com o banco. Veja detalhes tcnicos: " . pg_last_error($conexao); }
Conexo com Java
A conexo do PostgreSQL com Java utilizada por diversos clientes de gerenciamento ou modelagem do PostgreSQL. Neste caso utiliza-se o driver JDBC do PostgreSQL. Vide pasta \jdbc da instalao.
Baixar de acordo com sua verso do PostgreSQL, o driver
JDBC para o PostgreSQL daqui:
http://jdbc.postgresql.org/download.html#jdbcselection
Aqui para o PostgreSQL verso 8.1.3 baixei o arquivo
8.1-405 JDBC 3.
VB Acessando PostgreSQL via ODBC
O PGODBC deve ser instalado no micro cliente e
encontra-se em:
http://www.postgresql.org/ftp/odbc/versions/msi

public static void main(String args[]) { //String url =


"jdbc:postgresql://10.0.1.53:5432/agenda"; String url =
"jdbc:postgresql://localhost:5432/agenda"; //String url =
"jdbc:postgresql:agenda"; //Assim pega os defaults Connection con; String query = select * from amigos; Statement stmt; try { Class.forName(org.postgresql.Driver);
} catch(java.lang.ClassNotFoundException e) {
System.err.print(ClassNotFoundException:
");
System.err.println(e.getMessage()); } try { con =
DriverManager.getConnection(url,"postgres,
postgres); stmt = con.createStatement(); ResultSet
rs = stmt.executeQuery(query);
ResultSetMetaData rsmd = rs.getMetaData(); int numberOfColumns = rsmd.getColumnCount(); int rowCount =
1; while (rs.next()) { System.out.println(Registro
" + rowCount + ": "); for (int i = 1; i <= numberOfColumns; i++) { System.out.print(" Campo
" + i + ": "); System.out.println(rs.getString(i));
}
System.out.println("");
rowCount++;
}
stmt.close();
con.close();
} catch(SQLException
ex) { System.err.print(SQLException:
"); System.err.println(ex.getMessage()); } }

Criar uma conexo ODBC ao banco do PostgreSQL


e no cdigo:
}
Global Conex As New ADODB.Connection
Conexo Com o Visual BASIC
Global AccessConnect As String
Public Sub Conexao()
AccessConnect =

Podemos nos conectar a uma base de dados PostgreSQL


usando o Visual Basic via ADO. Para isto temos que usar
um driver ODBC para a plataforma Windows.

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
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 37. CONECTIVIDADE

Captulo 38

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

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

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

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

EMS PostgreSQL
42.1 14.4 - EMS PostgreSQL Manager

- Observe a estrutura criada para o novo banco:


- Clique sobre Tables com o boto direito e New Table
(ou tecle Ctrl+N)

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

Isso mostra que este campo nossa chave primria.

- Criar tabelas

- Clique em Compile e veja como ca

- Criar campos

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

- Criar chave primria

- Adicione os demais campos de forma semelhante.

- Criar chave estrangeira (relacionamento)


- 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

ABRIR UM BANCO EXISTENTE

- Importar script .sql para um banco existente

CRIAR UM NOVO BANCO

Caso queiramos trabalhar em um banco que j exista no


- Em Getting Starting (acima e direita) clique no boto servidor, vamos apenas abri-lo:
Create new database
- Aps abrir o EMS apenas executamos um duplo clique
sobre o nome do banco.
- Ento digite o nome do novo banco:
- Ento entre com os dados do servidor

- 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

- Na prxima tela mude algo somente se tiver certeza

- Clicamos em Next.

- Clique em Next

- E selecionamos o banco na lista Database Name

- Ento clique em Finish

- E clicamos em Finish

- E clique no boto Next

- Ento clique em OK.

COMO CRIAR UMA CHAVE ESTRANGEIRA


- Ento vemos o banco junto ao servidor (abaixo e di- (FOREIGN KEY)
reita)
- Aps criar a tabela e os campos, devemos criar a segunda tabela, que ir se relacionar com a primeira atravs
Para abri-lo e criar tabelas basta um duplo clique nele.
de um campo (chave estrangeira).
CRIAR TABELAS
- Vamos supor duas tabelas: pedidos e pedido_itens, que
- Execute um duplo clique no novo banco
86

42.1. 14.4 - EMS POSTGRESQL MANAGER

87

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
em Tools SQL Script - Ao centro clique em Open script
e indique onde est o script a ser importado. - Se tudo
for importado a contendo clique no boto Refresh Tables
direita do boto Create para visualizar a importao.
EXECUTANDO CONSULTAS SQL NO EMS

Captulo 43

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

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

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

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

Planejamento e Projeto de Bancos de


Dados
47.1 15.1 Planejamento e Projeto
de Bancos de Dados

Dica de Desempenho: O tamanho da chave primria


afeta o desempenho das operaes, portanto usar o menor tamanho que possa acomodar os dados do campo.
Exemplo

Projeto de bancos de dados genrico e se aplica a qual- Tabela - Clientes


quer SGBDR.
Campo - Nome (atributo)
com um bom planejamento do banco de dados que se Chave Primria (Primary-Key) - CPF
determina o quo ecaz foi o processo de anlise.
Todos os campos correspondentes a um nico CPF junIntroduo
tamente com seus valores formam um Registro ou Linha
O projeto do banco de dados e tambm os testes so (Row)
muito importantes para a ecincia e consistncia das informaes e do aplicativo. muito importante gastar
algum tempo nesta etapa, pois depois de algum tempo
de implantado ca muito trabalhoso alterar estruturas de
bancos e aplicativos.
Projetos de banco de dados inecazes geram consultas
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.

A correta determinao das tabelas, bem como dos campos algo primordial no sucesso do projeto do banco de
dados.
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
se tente inserir dois clientes com o mesmo CPF o banco
no permitir e emitir uma mensagem de erro acusando
tentativa de violao da chave primria.

Exemplo de software de administrao de SGBD para o Exemplos de Campos indicados para chave primria:
PostgreSQL - PGAdmin Informaes de bancos de dados
CPF
relacionais so armazenadas em tabelas ou entidades no
CNPJ
Modelo Entidade Relacionamento (MER).
Dicas sobre Campos

Matrcula de aluno

No armazenar resultado de clculos ou dados derivados Matrcula de funcionrio


de outros
Uma chave primria pode ser formada por mais de um
Armazenar todas as informaes (campos) separada- campo, quando um nico campo no capaz de caractemente. Cuidado com campos que contm duas ou mais rizar a tabela.
informaes.
Cada tabela somente pode conter uma nica chave priSelecionando o Campo para a Chave Primria

mria.

A chave primria o campo ou campos que identicam Relacionamentos - Um banco de dados formado por
vrias tabelas. Idealmente essas tabelas devem ser relacide forma exclusiva cada registro.
onadas entre si para facilitar a troca de informaes e ga No permitido valores nulos na chave nem duplicados
rantir a integridade. Para relacionar tabelas usamos cha Caso a tabela no tenha um campo que a identique, ves existentes nas mesmas.
pode-se usar um campo que numere os registros seqenTipos de Relacionamentos
cialmente
92

47.1. 15.1 PLANEJAMENTO E PROJETO DE BANCOS DE DADOS


Um para um
Um para vrios
Vrios para vrios
Relacionamento Um para Um

93

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

Normalizar bancos tem o objetivo de tornar o banco mais


Aquele onde os campos que fazem o relacionamento so eciente.
chaves primrias. Cada registro de uma tabela se relaciona com apenas um registro da outra tabela. Este relaci- Uma regra muito importante ao criar tabelas atentar
para que cada tabela contenha informaes sobre um
onamento no muito comum.
nico assunto, de um nico tipo.
Exemplo: CorrentistaBanco - Conjuge
1a Forma Normal
Relacionamento Um para Vrios ou Vrios para Um
Os campos no devem conter grupos de campos que se
Aquele onde uma tabela tem um campo chave primria repetem nos registros.
que se relaciona com outra tabela atravs de um campo
chave estrangeira. o tipo de relacionamento mais utili- Exemplo:
zado.
Alunos: matricula, nome, data_nasc, serie, pai, mae
Exemplos:
Produtos - 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.

Categorias - Itens

2 Forma Normal

Fornecedores - Produtos

Quando a chave primria composta por mais de um


campo.

Clientes - Pedidos

NotaFiscal - Produtos

Veja que cada um da esquerda se relaciona com vrios do Devemos observar se todos os campos que no fazem
parte da chave dependem de todos os campos que fazem
da direita.
parte da chave.
Importante:
Caso algum campo dependa somente de parte da chave,
O nmero de campos do relacionamento no precisa ser ento devemos colocar este campo em outra tabela.
o mesmo
Exemplo:
O tipo de dados dos campos do relacionamento deve ser
TabelaAlunos
igual, assim como o tamanho dos campos e formatos
Chave (matricula, codigo_curso)
Chave primria - Chave estrangeira (um - vrios)
Relacionamento Vrios para Vrios

avaliacao descricao_curso

Este tipo de relacionamento no d para ser implementado no modelo relacional, portanto sempre que nos deparamos com um deles devemos dividir em dois relacionamentos um para vrios (criando uma terceira tabela,
que armazenar o lado vrios dos relacionamentos).

Neste caso o campo descricao_curso depende apenas do


codigo_curso, ou seja, tendo o cdigo do curso conseguimos sua descrio. Ento esta tabela no est na 2 Forma
Normal.

Exemplo:

Dividir a tabela em duas (alunos e cursos):

Pedidos - Produtos

TabelaAlunos

Soluo:

Cada pedido pode conter vrios produtos, assim como Chave (matricula, codigo_curso)
cada produto pode estar em vrios pedidos. A sada
avaliacao
criar uma tabela que contenha os itens do pedido.
TabelaCursos
Pedidos - Pedidos_Itens - Produtos
codigo_curso
Pedidos 1 - N Pedidos_Itens N - 1 Produtos
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.

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

94

CAPTULO 47. PLANEJAMENTO E PROJETO DE BANCOS DE DADOS

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

Implementao de Banco de Dados com o


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

Criao do Banco

Criaremos o banco do projeto de testes com o PGAdmin,


contendo esquemas, tabelas, views, funes do tipo SQL
e Pl/PgSQL, usurios, privilgios, consultas, etc. para
ilustrar nosso projeto e servir de base para os testes (em
Softwares free de Modelagem e Gerenciamento do Post- seguida).
greSQL
Analisar o modelo sugerido e detalhar o banco, tipos
PGAdmin: (http://www.postgresql.org/ftp/pgadmin3/ de dados de cada campo, tamanho, esquemas do banco,
usurios e senhas, privilgios de cada um (cuidados com
release/)
a segurana), etc.
EMS:
(http://www.sqlmanager.net/en/products/
Ativar o Suporte s Funes Pl/Pgsql (Stored Procepostgresql/manager/download)
dures)
DBDesigner: (http://fabforce.net/downloads.php)
Aps ter criado o banco, podemos ativar o suporte a
DbVisualizer: http://www.dbvis.com/products/dbvis/
plpgsql.
Em forma de Plug-ins para Eclipse
Ativar suporte a Pl/PgSQL requer dois passos:
QuantumDB: (http://quantum.sourceforge.net/)

- instalar a biblioteca Pl/PgSQL, que do tipo contrib


Azzurri/Clay: (http://www.azzurri.jp/en/software/clay/ - denir a linguagem (como sugerido abaixo)
download.jsp)
Ativando na console do PG depois de conectar ao banco
SQLExplorer:
(http://sourceforge.net/projects/ onde car o suporte:
eclipsesql)
CREATE
LANGUAGE
'plpgsql'
HANDLER
Uma grande e boa relao de softwares de projeto, mode- plpgsql_call_handler LANCOMPILER 'PL/pgSQL'
lagem e gerenciamento para o PostgreSQL, free e comercial pode ser encontrada em no site ocial so PostgreSQL - Ativando como superusurio na console (fora dos bancos)
Brasil:
su - postgres
https://wiki.postgresql.org.br/wiki/Ferramentas.
Suporte Acentuao na Criao de Bancos no Post- $ createlang plpgsql -U nomesuperuser nomebanco
greSQL
Ou simplesmente:
A codicao default do PG 7.X a SQL_ASCII
$ createlang plpgsql nomebanco
A do PG 8.X a UNICODE

JDBC
Ambas tem suporte a acentuao, mas geram problemas Alguns programas em Java o utilizam, como o plugin
no backup/importao.
QuantumDB.
Codicao
O JDBC para o PostgreSQL encontra-se em:
Para um suporte estvel acentuao em portugus do http://jdbc.postgresql.org/download.html#jars
Brasil uma boa opo criar o banco passando a codiVeja que para selecionar o arquivo .jar correto, precisacao (Encoding) LATIN1
mos cruzar a verso do PostgreSQL esquerda com a
ENCODING = 'LATIN1'
95

96

CAPTULO 48. IMPLEMENTAO DE BANCO DE DADOS COM O POSTGRESQL

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 ban- Tabelas
cos de dados. Mas quando da implementao do aplicativo que ir utilizar estes bancos os desenvolvedores se O PostgreSQL permite adicionar privilgios por objeto
depararo com a diculdade de comunicao e acesso en- do banco: tabela, esquema, banco, etc. Em termos de setre os bancos, j que com uma nica conexo tero acesso gurana importante, em geral, que os privilgios sejam
a todos os objetos do banco. muito til para estes casos adicionados ao usurio por tabela, cada tabela tendo um
dono e cada dono tendo seus especcos privilgios.
criar um nico banco e neste criar vrios esquemas, organizados por reas: pessoal, administracao, contabilidade, Dica de Desempenho: Na criao das tabelas alertar para
engenharia, etc.
a criao de ndices para os campos envolvidos na cluMas e quando uma destas reas tem outras sub-reas, sula WHERE. Isso tornar essas consultas mais rpidas.
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

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.
REVOKE CREATE ON SCHEMA public FROM PU- Ento selecione o banco funcionarios e clique no boto
BLIC
SQL acima.
Com isso estamos tirando o privilgio de todos os usu- Clique no boto open le para indicar o nosso script sql
rios acessarem o esquema public.
gerado anteriormente.

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


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

Integridade Referencial - PostgreSQL


49.1 15.3 - Integridade Referencial
- Postgresql

pedidos (relaciona-se Clientes pelo campo cod_cliente)


cod_pedido cod_cliente descricao
Caso tentemos cadastrar um pedido com cod_cliente 2
ele ser aceito.

Traduo livre do documentao CBT Integrity Refe- Mas caso tentemos cadastrar um pedido com cod_cliente
rential":
3 ele ser recusado pelo banco.
http://techdocs.postgresql.org/college/002_
Criando uma Chave Primria
referentialintegrity/.
Deve ser criada quando da criao da tabela, para garantir
Integridade Referencial (relacionamento) onde uma in- valores exclusivos no campo.
formao em uma tabela se refere informaes em outra
CREATE TABLE clientes(cod_cliente BIGINT,
tabela e o banco de dados refora a integridade.
nome_cliente VARCHAR(60) PRIMARY KEY
Tabela1 ------------> Tabela2
(cod_cliente));
Onde Utilizado?
Criando uma Chave Estrangeira (Foreign Keys)
Onde pelo menos em uma tabela precisa se referir para o campo de uma tabela que se refere ao campo Primary
informaes em outra tabela e ambas precisam ter seus Key de outra.
dados sincronizados.
O campo pedidos.cod_cliente refere-se ao campo clienExemplo: uma tabela com uma lista de clientes e outra tes.codigo, ento pedidos.cod_cliente uma chave estabela com uma lista dos pedidos efetuados por eles.
trangeira, que o campo que liga esta tabela a uma outra.
Com integridade referencial devidamente implantada CREATE TABLE pedidos(
nestas tabelas, o banco ir garantir que voc nunca ir
cadastrar um pedido na tabela pedidos de um cliente que cod_pedido BIGINT,
no exista na tabela clientes.
cod_cliente BIGINT REFERENCES clientes,
O banco pode ser instrudo para automaticamente atuali- descricao VARCHAR(60)
zar ou excluir entradas nas tabelas quando necessrio.
);
Primary Key (Chave Primria) - o campo de uma tabela
Outro exemplo:
criado para que as outras tabelas relacionadas se reram
a ela por este campo. Impede mais de um registro com FOREIGN KEY (campoa, campob)
valores iguais. a combinao interna de UNIQUE e REFERENCES tabela1 (campoa, campob)
NOT NULL.
ON UPDATE CASCADE
Qualquer campo em outra tabela do banco pode se referir
ao campo chave primria, desde que tenham o mesmo ON DELETE CASCADE);
tipo de dados e tamanho da chave primria.
Cuidado com excluso em cascata. Somente utilize com
certeza do que faz.
Exemplo:
clientes (codigo INTEGER, nome_cliente VAR- Dica: Caso desejemos fazer o relacionamento com um
campo que no seja a chave primria, devemos passar este
CHAR(60))
campo entre parnteses aps o nome da tabela e o mesmo
codigo nome_cliente
deve obrigatoriamente ser UNIQUE.
1 PostgreSQL inc.
...
2 RedHat inc.
98

49.1. 15.3 - INTEGRIDADE REFERENCIAL - POSTGRESQL


cod_cliente
BIGINT
tes(nomecampo),

REFERENCES

99

clien- chave so excludos.

SET NULL - Quando um registro com a chave primria


excludo, os respectivos campos na tabela relacionada
Parmetros Opcionais: ON UPDATE parametro e so setados para NULL.
ON DELETE parametro.
SET DEFAULT - Quando um registro com a chave primria excludo, os campos respectivos da tabela relaciON UPDATE paramentros:
onada so setados para seu valor DEFAULT.
NO ACTION (RESTRICT) - quando o campo chave
primria est para ser atualizado a atualizao abortada Excluindo Tabelas Relacionadas
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 TA...

Exemplo: ERRO Ao tentar usar UPDATE clientes SET


codigo = 5 WHERE codigo = 2. Ele vai tentar atualizar
o cdigo para 5 mas como em pedidos existem registros
do cliente 2 haver o erro.

BLE: http://www.postgresql.org/docs/8.0/interactive/
sql-createtable.html
ALTER TABLE http://www.postgresql.org/docs/8.0/
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.
Exemplo: Funciona: Ao tentar usar UPDATE clientes codigo INTEGER,
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.
SET NULL (atribuir NULL) - Quando um registro na PRIMARY KEY (codigo, data)
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
esta clusula no recebe nenhum parmetro.
Exemplo: ERRO em DELETE FROM clientes WHERE
codigo = 2. No funcionar caso o cod_cliente em pedidos contenha um valor mais antigo que codigo em clientes.
CASCADE - Quando um registro com a chave primria
excludo, todos os registros relacionados com aquela

Captulo 50

Dicas Prticas de uso do SQL


50.1 15.4 - Dicas Prticas de uso do
SQL

select 'ribafs@gmail.com' like '%@%'


select 'ribafs@gmail.com' similar to '%@%.%';
Alguns
da
lista
de
PHP
(phpfortaleza@yahoogrupos.com.br - groups.yahoo.com).

Armazenar Arquivos Binrios no Prprio Banco

Temos um campo (insumo) com valores = 1, 2, 3, ...


87

Utilize a contrib LO para esta nalidade.

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

Outra sada mais elegante ainda:

Ento execute o comando make install.


Acesse o banco e:

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

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

INSERINDO COM SELECT

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

SELECT * FROM tabela; - - Este um comentrio


- - Este outro comentrio

AS

INT2)

select trim(length(bairro)) from cep_tabela where


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

Tambm so aceitos os comentrios herdados do C:


/* Comentrio herdado do C e vlido em SQL */

Atravs do PHP

Dicas Prticas de Uso do SQL


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

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

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

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

select 'ribafs@gmail.com' ~ '@'


100

db-

50.1. 15.4 - DICAS PRTICAS DE USO DO SQL

101

$sql="update engenharia.precos set custo_produtivo = close OUTPUT;


(select custo_produtivo from engenharia.apagar where Via PHP
insumo='$x') where insumo='00' || '$x'";
$con=pg_connect(host=127.0.0.1 user=postgres pas$ret=pg_query($conn,$sql);
sword=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)

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


'$data_inicial'"; $recordset = pg_query($con, $str);
$diferena=pg_fetch_array($recordset); return $diferena[0];

POPULAR BANCO COM MASSA DE TESTES

Script el Perl

echo Diferena: " . datedi(1969-01-08, 1968-1016);

1. !/usr/bin/perl

Ajustando o formato da Data do Sistema


SHOW DATESTYLE;

$count = 1;
$arquivosaida = populate.sql";
@chars = (A .. Z, a .. z, 0 .. 9);

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

SET DATESTYLE TO NONEUROPEAN, GERMAN;


DD.MM.YYYY

open(OUTPUT, "> $arquivosaida);


print OUTPUT DROP TABLE index_teste;\n";
print OUTPUT CREATE TABLE index_teste (";

SET DATESTYLE TO EUROPEAN; DD/MM/YYYY


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

Outros usos para SHOW:


print OUTPUT codigo INT, nome VARCHAR(10), nuSHOW server_version;
mero INT, letra CHAR(1)";
SHOW server_encoding; -- Idioma para ordenao do
print OUTPUT ");\n";
texto (denido pelo initdb)
print OUTPUT COPY index_teste (codigo, nome, nuSHOW lc_collate; -- Idioma para classicao de caracmero, letra) FROM stdin;\n";
teres (denido pelo initdb)
while ($count <= $totalrecords){
SHOW all; -- Mostra todos os parmetros
$randstring = join("", @chars [map{rand @chars} ( 1 .. 8
) ]); $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 VA- SQL, DMY;
LUES($count,'$randstring',$randnum,'$randletter');\n";
Tambm pode ser atribudo juntamente com o Usu$count."\t.$randstring."\t.$randnum."\t.$randletter."\n";
rio:
$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)
ORDER BY publication DESC LIMIT 5;
1. print OUTPUT CREATE INDEX indexteste_numero_index ON index_teste(numero);\n"; SELECT isbn, title, publication FROM editions NATURAL JOIN books AS b (book_id)
1. print OUTPUT VACUUM ANALYZE in- ORDER BY publication DESC LIMIT 5 OFFSET 2;
dex_teste;\n";

102

CAPTULO 50. DICAS PRTICAS DE USO DO SQL

Trar 5 registros, iniciando do segundo.

Comando para alterar as variveis do kernel sem refsync - checa integridade dos dados gravados no banco, iniciar o Linux:
vindos dos logs. Vem ligado por padro
sysctl -w kernel.shmmax=309329920
Gargalo de SGBDs:

sysctl -w kernel.shmall=309329920

leitura/gravao (I/O) de discos.

sysctl -w kernel.shmmni=1

Ligar/Desligar fsync no:

Dicas de instalao do PostgreSQL em GNU/Linux.

postgresql.conf, setar para


fsync=true Nunca deve car false
REORDENAR CAMPOS DE TABELA
Se voc estiver falando da ordem dos campos na tabela
no existe razo para isso no modelo relacional.
Voc sempre pode especicar os campos desejados, e na
ordem desejada, no SELECT.

Utilizar HD do tipo SATA


Criar uma partio exclusiva para os dados. Ex: /database
Utilizar nesta partio o sistema de arquivos XFS
Deixar nesta partio
RW,NOATIME

apenas

os

ags:

Se necessrio voc pode criar uma view:


CREATE VIEW nome_view AS SELECT id,cpf,nome Do site: http://www.gescla.com.br/oficina_postgre.asp
FROM sua_tabela;
Criao de Tipos de Dados
Se ainda no estiver satisfeito pois quer suas tabelas bo- CREATE TYPE img (input = int4in, output =
nitinhas e organizadas:
int4out, internallength = 4, externallength = 10, delimi1.
CREATE TABLE novo_nome AS SELECT ter = ",, send = int4out, receive = int4in, passedbyvalue, alignment = int, storage = plain);
id,cpf,nome FROM sua_tabela;
2. DROP TABLE sua_tabela;

Uso:

3.
ALTER TABLE novo_nome RENAME TO create table imagens (codigo int8, descricao varchar(60),
imagem img);
sua_tabela;
Construtor de Matriz
Osvaldo (Na lista PostgreSQL-Brasil).
Calculando a Memria a ser usada pelo PostgreSQL Matriz unidimensional - array[2,4,6+2]
SELECT array[2,4,6+2]; -- Retorna 2,4,8
Shared Buers

Multidimensional - composta por duas ou mais matrizes


unidimensionais:

Exemplo de 1GB RAM

Obs.: O ndice do valor da matriz construdo com ARRAY sempre comea com um.

A shared buers ser 25% da RAM


256 * 1024 / 8 = 32768
logo shared_buers = 32768
Shared Memory

Ao criar uma tabela podemos usar matriz em seus tipos


de dados, ao invs de tipos simples.
Exemplo:
CREATE TABLE testematriz (codigo INT [], nome
char[30][30]);

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

select array(select oid from pg_proc where proname like


'bytea%');

Retorna: 1244,31,1948,1949,1950,1951,1952,1953,1954,2005,2006,2011
ENCONTRAR REGISTROS DUPLICADOS
SELECT DISTINCT cep FROM cep_tabela
WHERE cep IN (SELECT cep FROM cep_tabela AS
Tmp GROUP BY cep,tipo,logradouro, bairro, municipio,uf HAVING Count(*) >1 ) ORDER BY cep;

50.1. 15.4 - DICAS PRTICAS DE USO DO SQL

103

(Adaptao de consulta gerada pelo assistente Encontrar cape para escrever caracteres especiais:
duplicadas do Access).
SELECT 'Editora O\'Reyle';
Ou:
Concatenao de expresses no terminal:
select count(*) as quantos, cep from cep_tabela group by SELECT 'Concate'
cep having count(*) > 1;
'nao';
REMOVER DUPLICADOS
Equivale a:
Para tabelas criadas WITH OIDS:
SELECT 'Concatenao';
DELETE FROM cep_tabela2 WHERE oid NOT IN
Quando resolvendo expresses matemticas usar parn(SELECT min(oid) FROM cep_tabela2 GROUP BY teses para tornar mais claras as precedncias.
cep, tipo, logradouro, bairro, municipio, uf);
Convertendo para Nmeros
Do exemplo 8.10 do manual em portugus do Brasil.
SELECT TO_NUMBER('0' || '1,500.64',99999999.99);
Ou:
Total de 8 dgitos com 2 decimais.
Criando uma segunda tabela que conter somente os registros exclusivos e ainda guarda uma cpia da tabela ori- Variveis no psql
ginal:
\pset null '(nulo)' -- traduzindo null por nulo
CREATE TABLE cep_tabela2 AS SELECT cep, tipo, SELECT NULL;
logradouro, bairro, municipio, uf FROM cep_tabela
GROUP BY cep, tipo, logradouro, bairro, municipio, uf \set variavel 14 -- Dando valor 14 varivel
ORDER BY cep;
SELECT :variavel;
Caso no importe qual das duplicatas ir permanecer:

COPIAR TABELA COM REGISTROS

CREATE TABLE tab_temp AS SELECT DISTINCT * CREATE TABLE tabeladestino AS SELECT * FROM
FROM tabela;
tabelaorigem;
DROP tabela;

Aps o que teremos que recriar as constraints.

ALTER TABLE tab_temp RENAME TO tabela;

phpPgGIS

(Dica de Osvaldo Rosario Kussama na lista de Post- http://www.geolivre.org.br/modules/news/


greSQL Brasil)
Em mais um grande lanamento, a OpenGEO coloca
Delimitadores
disposio da comunidade uma ferramenta extremaA maioria dos tipos de dados tem seus valores delimitados mente ltil para gerncia de dados geogrcos no PostgreSQL. O phpPgGIS mais um produto da OpenGEO
por apstrofos (), a exemplo de:
que contempla uma demanda na rea de Geotecnologias
caracteres
e visa atender usurios do mundo inteiro.
data/hora
Desenvolvido com base no phpPgAdmin, o phpPgGIS
monetrio
boleanos
binrios

utiliza o MapServer para visualizar o contedo espacial


dos campos do PostGIS com muita simplicidade (um clique). Seqncias de cdigos complexos (campo de geometria) agora podem ser vistos num mapa.

geomtricos

O OpenGEO tem atuado no mercado brasileiro de Geotecnologias com solues inovadoras com base em softarrays
ware livre e j ganhou referncia internacional com alA exceo para os demais tipos numricos: date guns importantes projetos como o Open 3D GIS e o Ge18/12/2005 numeric 12345.45
oLivre Linux.
Caracteres Especiais
Este sistema vai integrar a soluo de Hosting que a emPara poder escrever uma barra no valor de uma constante, presa dever lanar nas prximas semanas.
usa-se duas barras:

Algumas Denies

SELECT '\\Barra';

Cursor

Para escrever um apstrofo usa-se dois apstrofos:

um ponteiro para uma linha (registro).

SELECT 'Editora OReyle';

Replicao

PostgreSQL tambm permite o uso de caracteres de es- a distribuio de dados corporativos para vrios locais

104
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 50. DICAS PRTICAS DE USO DO SQL

Captulo 51

Dicas sobre Desempenho e Otimizaes do


PostgreSQL
51.1 15.5 Dicas sobre Desempenho e Otimizaes do PostgreSQL

cia so colocadas prximas CPU. Quem determina que


informaes devem car nos registradores so os compiladores. Cache da CPU guarda ar informaes utilizadas
recentemente. O Sistema Operacional controla o que est
armazenado na RAM e o que mandar para o disco rgido.

Existem duas principais formas de melhorar o desempenho de SGBDs: uma melhorando o hardware, com
CPUs, RAM, Discos mais novos, rpidos e conveis.
A outra otimizando as consultas realizadas nos bancos
(usando VACUUM, VACUUM ANALYZE, EXPLAIN,
criando CLUSTERS, entre outros).

Cache e Registradores da CPU no podem ser otimizados


diretamente pelo administrador do SGBD. Efetivamente
otimizao em bancos de dados envolvem aumento da
quantidade de informaes teis na RAM, prevenindo
acesso a disco sempre que possvel.

Uma das medidas bsicas adotada para melhorar o desempenho 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.
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.

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.
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.
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
varivel e alocada separadamente para cada conexo
feita ao SGBD.

A administrao do PostgreSQL tambm muito impor- Memria Cache Compartilhada do PostgreSQL


tante para tornar o SGBD mais eciente e rpido. Desde
O PostgreSQL no altera as informaes diretamente no
a instalao e congurao temos cuidados que ajudam a
disco. Ao invs disso ele solicita que os dados sejam lidos
otimizar o PostgreSQL.
da memria cache compartilhada do PostgreSQL. O cliAdaptao do Artigo sobre otimizao do PostgreSQL ente PostgreSQL ento l e escreve os blocos e nalmente
do Diogo Biazus e do original do Bruce Momjian escreve no disco.
(http://www.ca.postgresql.org/docs/momjian/hw_
Clientes que precisam acessar tabelas primeiro procuram
performance).
pelos blocos necessrios no cache. Caso estejam a ento
Hardware
continuam processando normalmente. Caso contrrio
No computador as informaes so manipuladas pelos re- feita uma solicitao ao sistema operacional para carregar
gistradores da CPU, pelo cache da CPU, pela memria os blocos. Os blocos so carregados do cache de buer de
disco do kernel ou diretamente do disco. Estas operaes
RAM e pelos discos rgidos.
podem ser onerosas (lentas).
Na prtica as informaes utilizadas com mais freqn105

106

CAPTULO 51. DICAS SOBRE DESEMPENHO E OTIMIZAES DO POSTGRESQL

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

vel (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 entre discos diferentes.

Idealmente a PostgreSQL shared buer cache (Memria


Supondo que temos dois HDs, hda e hdb:
Cache Compartilhada do PostgreSQL) deve ser:
Grande o suciente para conseguir manipular as tabelas Movendo os logs de transao para outro disco:

mais comumente acessadas. Pequena o bastante para evi- - Parar o PostgreSQL


tar atividades de swap pagein.
- Montar hdb em /mnt/hdb
Exemplo:
- Mover a pasta /usr/local/pgsql/data/pg_xlog para o
Por exemplo queremos x MB para memria comparti- /mnt/hdb
lhada ( x / 8 ) * 1024 = Resultado a ser congurado em
- Criar um link simblico para o diretrio original:
shared_buer
ln -s /mnt/hdb/pg_xlog /usr/local/pgsql/data/pg_xlog
Se x = 768 MB
(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 /mnt/hdb/pg_xlog).

Para informaes sobre uma congurao do kernel para


que vrios sistemas operacionais trabalharem com o Post- Os logs de transao so os nicos registros que no podem ter o seu salvamento em disco adiado sem comprogreSQL:
meter a segurana do sistema.
http://developer.postgresql.org/docs/postgres/
Mover os ndices para um HD diferente de onde esto as
kernel-resources.html
tabelas:
Memria Individual (Sort Memory)
- Parar PostgreSQL
Principalmente utilizada em ordenaes de registros das
tabelas, em operaes de criao de ndices, ordenao - Mover os ndices para o hdb
(order by), merge join, etc.
- Criar link simblico para o local original
Esta memria pode ser congurada atravs do parmetro Para recriar os ndices em outro Tablespace:
sort_mem do postgresql.conf.
ALTER TABLE nometabela DROP CONSTRAINT noPara a congurao leve em conta sua memria dispon- meconstraint;

51.1. 15.5 DICAS SOBRE DESEMPENHO E OTIMIZAES DO POSTGRESQL

107

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
ALTER TABLE nometabela ADD CONSTRAINT no buer do kernel e na CPU.
nome_pk PRIMARY KEY (nomecampo);
ALTER INDEX nome_idx SET TABLESPACE nometablespace;
Ainda podemos separar astabelas mais utilizadas para
o hdb, utilizando o comando tablespace no PostgreSQL
8.1.3 podemos fazer isso:

Deve ser manipulada com cuidado, pois simplesmente


ampliada pode prejudicar a performance. Esta a rea
que o PostgreSQL usa atualmente para trabalhar. Ela
deve ser suciente para controlar a carga do servidor
do SGBD, do contrrio o PostgreSQL ir iniciar empurrando dados para arquivos e isto ir prejudicar a performance geral. Esta a principal congurao em termos
de performance.

- Criar diretrio /mnt/hdb/hotcluster e tornar postgres seu


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
Caso no reste nenhuma opo, poder usar a proteo do
uso da memria.
WAL e melhor performance. Simplesmente mova seus
Traduo do Tutorial Tuning PostgreSQL for Perfor- arquivos de WAL, montando outro dispositivo ou criando
mance
um link simblico para o diretrio pg_xlog, para um disco
separado ou para o conjunto dos arquivos do seu cluster
De Shridhar Daithankar e John Berkus
principal de arquivos de dados.
Shared Buers
random_page_cost (custo de pgina aleatria)

108

CAPTULO 51. DICAS SOBRE DESEMPENHO E OTIMIZAES DO POSTGRESQL

Congura o custo para trazer um registro aleatrio de um @numbers = (1 .. 9);


banco de dados, que inuencia a escolha do planejador @single_chars = (a .. e);
em usar index ou table scan.
$totalrecords = 5000; # 5 milhes
Caso tenha um disco razoavelmente rpido como SCSI
open(OUTPUT, "> $arquivosaida);
ou RAID, pode baixar o custo para 2.
Vacuum_mem

print OUTPUT DROP TABLE index_teste;\n";

Congura a memria alocada para Vacuum. Deve acele- print OUTPUT CREATE TABLE index_teste (";
rar permitindo que PostgreSQL copie grandes quantida- print OUTPUT codigo INT, nome VARCHAR(10), nudes para a memria.
mero INT, letra CHAR(1)";
Entre 16-32MB uma boa quantidade para muitos siste- print OUTPUT ");\n";
mas.
print OUTPUT COPY index_teste (codigo, nome, numax_fsm_pages
mero, letra) FROM stdin;\n";
PostgreSQL grava espao livre em cada uma de suas p- while ($count <= $totalrecords){
ginas de dados.
$randstring = join("", @chars [map{rand @chars} ( 1 .. 8
Caso tenha um banco que usa muitos updates e deletes, ) ]); $randnum = join("", @numbers [map{rand @numque ir gerar registros mortos, devido ao sistema MVCC bers} ( 1 .. 8 ) ]); $randletter = join("", @single_chars
do PostgreSQL, ento expanda o FSM para cobrir todos [map{rand @single_chars} (1)]); print OUTPUT
estes registros deads (mortos) e nunca mais precisar ro- #print OUTPUT INSERT INTO index_teste VAdar vacuum full a no ser em feriados.
LUES($count,'$randstring',$randnum,'$randletter');\n";
$count."\t.$randstring."\t.$randnum."\t.$randletter."\n";
O mnimo FSM max_fsm_relations * 16.
$count++;
max_fsm_relations
};
Diz quantas tabelas devem ser localizadas no mapa de espao livre.
1. print OUTPUT "\n";
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 "\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 post- close OUTPUT;
gresq.conf e altere para autovacuum = on. Ir executar o
Um bom artigo sobre performance no PostgreSQL Postvacuum quando necessrio.
greSQL 8.0 Checklist de Performance encontra-se na
Melhor executar o comando vacuum juntamente com o revista eletrnica DBFree Magazine, nmero 02.
comando analyze:
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
EXPLAIN
1. !/usr/bin/perl
$count = 1;
$arquivosaida = populate.sql";
@chars = (A .. Z, a .. z, 0 .. 9);

Captulo 52

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 cliente_codigo_seq TO operador;


'latin1';
-- Para SGBDs que no estejam com esta congurao, -- Considerando que o nome da sequncia seja cliente_codigo_seq.
pelo menos este banco a usar
Para permitir ao usurio operador que faa login, use:
Para Exibir a Codicao do lado do Cliente
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
consultas abaixo:
SQL, DMY;
-- No caso este banco apenas car com esta congurao INSERT INTO cliente (codigo, nome, data_nasc, bonus,
observacao) VALUES (1, 'Joo Pedro', '01/01/1967',
de data
18.35, 'Apenas um texto de teste');
-- Para alterao denitiva para todos os bancos alterar o
INSERT INTO cliente (codigo, nome, data_nasc, boscript postgresql.conf.
nus, 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)
CREATE TABLE cliente (
codigo INT PRIMARY KEY,
nome VARCHAR(40) NOT NULL,
data_nasc DATE NOT NULL,
bonus NUMERIC(12,2),

observacao) VALUES (3, 'Jos Roberto', '25/06/1938',


12.65, NULL);
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;

observacao TEXT
109

110

CAPTULO 52. 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

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://
Para ser imparcial:

http://www-128.ibm.com/developerworks/db2/library/
techarticle/dm-0606khatri/

www.postgresql.org/docs/books/pghandbuch.html.de

http://www-128.ibm.com/developerworks/db2/library/
techarticle/dm-0603wasserman2/

Lista Ocial do PostgreSQL, com diversas categorias

Comparison of dierent SQL implementations - http:


//troels.arvin.dk/db/rdbms/

http://archives.postgresql.org/index.php?adv=1

- 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
- Lista de News (freqncia semanal) http://www.
17 caractersticas do PostgreSQL que fazem falta no postgresql.org/community/weeklynews/
Oracle
- Cadastro e Descadastro em Uma das Vrias Listas
Mais
um
bom
artigo
do
Fbio
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

Site Ocial

- Lista da Comunidade Brasileira


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
http://www.postgresql.org/community/international
Brasil - PDF - http://ufpr.dl.sourceforge.net/
Empresas que utilizam PostgreSQL
sourceforge/pgdocptbr/pgdocptbr800-pdf-1.1.zip
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
Esto aqui algumas das centenas das companhias que
PostgreSQL Technical Documentation - http://techdocs. 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. 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: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%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: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%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: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/Instala%C3%A7%C3%
A3o/No_Linux?oldid=252076 Contribuidores: Marcos Antnio Nunes de Moura, Ribafs, Albmont, He7d3r.bot, Abacaxi e Annimo: 3
PostgreSQL Prtico/Instalao/No Windows Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/Instala%C3%A7%
C3%A3o/No_Windows?oldid=266870 Contribuidores: Marcos Antnio Nunes de Moura, He7d3r.bot, Abacaxi e Annimo: 2
PostgreSQL Prtico/DDL Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%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:
https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/DDL/Cria%C3%A7%C3%A3o_e_Exclus%C3%A3o_de_Bancos%
2C_Esquemas%2C_Tabelas%2C_Views%2C_Constraints%2C_etc?oldid=207722 Contribuidores: Marcos Antnio Nunes de Moura,
Ribafs e He7d3r.bot
PostgreSQL Prtico/DDL/Alteraes nos objetos dos bancos Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/
DDL/Altera%C3%A7%C3%B5es_nos_objetos_dos_bancos?oldid=207720 Contribuidores: Marcos Antnio Nunes de Moura, Ribafs e
He7d3r.bot
PostgreSQL Prtico/DDL/ndices, Tipos de Dados e Integridade Referencial Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_
Pr%C3%A1tico/DDL/%C3%8Dndices%2C_Tipos_de_Dados_e_Integridade_Referencial?oldid=207723 Contribuidores: Marcos Antnio Nunes de Moura, Ribafs e He7d3r.bot
PostgreSQL Prtico/DML Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/DML?oldid=207725 Contribuidores:
Marcos Antnio Nunes de Moura, Ribafs, He7d3r.bot e Annimo: 1
PostgreSQL Prtico/DML/Consultas Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/DML/Consultas?oldid=
207726 Contribuidores: Marcos Antnio Nunes de Moura, Ribafs e He7d3r.bot
PostgreSQL Prtico/DML/Consultas Join Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/DML/Consultas_Join?
oldid=207727 Contribuidores: Marcos Antnio Nunes de Moura, Ribafs, He7d3r.bot e Annimo: 2
PostgreSQL Prtico/DML/Sub Consultas Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/DML/Sub_Consultas?
oldid=216889 Contribuidores: Marcos Antnio Nunes de Moura, Ribafs, He7d3r.bot e Annimo: 2
PostgreSQL Prtico/Funes Internas Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/Fun%C3%A7%C3%B5es_
Internas?oldid=207733 Contribuidores: Marcos Antnio Nunes de Moura, Ribafs, He7d3r.bot e Annimo: 1
PostgreSQL Prtico/Funes Internas/Strings Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/Fun%C3%A7%
C3%B5es_Internas/Strings?oldid=290263 Contribuidores: Marcos Antnio Nunes de Moura, Ribafs, He7d3r.bot e Annimo: 1
PostgreSQL Prtico/Funes Internas/Matemticas Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/Fun%C3%
A7%C3%B5es_Internas/Matem%C3%A1ticas?oldid=207738 Contribuidores: Marcos Antnio Nunes de Moura, Ribafs e He7d3r.bot
PostgreSQL Prtico/Funes Internas/Agrupamento Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/Fun%C3%
A7%C3%B5es_Internas/Agrupamento?oldid=207734 Contribuidores: Marcos Antnio Nunes de Moura, Ribafs, He7d3r.bot e Annimo:
1
PostgreSQL Prtico/Funes Internas/Data e Hora Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/Fun%C3%
A7%C3%B5es_Internas/Data_e_Hora?oldid=207736 Contribuidores: Marcos Antnio Nunes de Moura, Ribafs e He7d3r.bot
PostgreSQL Prtico/Funes Internas/Formatao de Tipos de Dados Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%
A1tico/Fun%C3%A7%C3%B5es_Internas/Formata%C3%A7%C3%A3o_de_Tipos_de_Dados?oldid=261878 Contribuidores: Marcos
Antnio Nunes de Moura, Ribafs, He7d3r.bot, LlamaAl e Annimo: 1
PostgreSQL Prtico/Funes Internas/Converso de Tipos Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/Fun%
C3%A7%C3%B5es_Internas/Convers%C3%A3o_de_Tipos?oldid=207735 Contribuidores: Marcos Antnio Nunes de Moura, Ribafs e
He7d3r.bot
PostgreSQL Prtico/Funes Denidas pelo Usurio e Triggers Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/
Fun%C3%A7%C3%B5es_Definidas_pelo_Usu%C3%A1rio_e_Triggers?oldid=216822 Contribuidores: Marcos Antnio Nunes de
Moura, Ribafs, He7d3r.bot e Annimo: 1
PostgreSQL Prtico/Funes Denidas pelo Usurio e Triggers/SQL Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%
A1tico/Fun%C3%A7%C3%B5es_Definidas_pelo_Usu%C3%A1rio_e_Triggers/SQL?oldid=276165 Contribuidores: Marcos Antnio
Nunes de Moura, Ribafs, He7d3r.bot e Annimo: 2
PostgreSQL Prtico/Funes Denidas pelo Usurio e Triggers/PlpgSQL Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%
C3%A1tico/Fun%C3%A7%C3%B5es_Definidas_pelo_Usu%C3%A1rio_e_Triggers/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: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%
A1tico/Fun%C3%A7%C3%B5es_Definidas_pelo_Usu%C3%A1rio_e_Triggers/Triggers?oldid=249049 Contribuidores: Marcos Antnio Nunes de Moura, Ribafs, He7d3r.bot e Annimo: 3
PostgreSQL Prtico/DCL Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/DCL?oldid=185988 Contribuidores: Ribafs, Jorge Morais e He7d3r.bot

116

CAPTULO 53. REFERNCIAS

PostgreSQL Prtico/DCL/Administrao de usurios, grupos e privilgios Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%


C3%A1tico/DCL/Administra%C3%A7%C3%A3o_de_usu%C3%A1rios%2C_grupos_e_privil%C3%A9gios?oldid=207718 Contribuidores: Ribafs, Jorge Morais, He7d3r.bot e Annimo: 1
PostgreSQL Prtico/Transaes Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/Transa%C3%A7%C3%B5es?
oldid=217960 Contribuidores: Ribafs, Jorge Morais, He7d3r.bot e Annimo: 3
PostgreSQL Prtico/Administrao Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/Administra%C3%A7%C3%
A3o?oldid=185973 Contribuidores: Ribafs, SallesNeto BR e He7d3r.bot
PostgreSQL Prtico/Administrao/Backup e Restore Fonte:
https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/
Administra%C3%A7%C3%A3o/Backup_e_Restore?oldid=185974 Contribuidores: Ribafs, Jorge Morais e He7d3r.bot
PostgreSQL Prtico/Administrao/Importar e Exportar Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/
Administra%C3%A7%C3%A3o/Importar_e_Exportar?oldid=199105 Contribuidores: Ribafs, Jorge Morais, He7d3r.bot e Annimo: 1
PostgreSQL Prtico/Administrao/Converter Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/Administra%C3%
A7%C3%A3o/Converter?oldid=185975 Contribuidores: Ribafs, Jorge Morais e He7d3r.bot
PostgreSQL Prtico/Administrao/Otimizao e Desempenho Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/
Administra%C3%A7%C3%A3o/Otimiza%C3%A7%C3%A3o_e_Desempenho?oldid=185977 Contribuidores: Ribafs, Jorge Morais e
He7d3r.bot
PostgreSQL Prtico/Replicao Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/Replica%C3%A7%C3%A3o?
oldid=247737 Contribuidores: Ribafs, Jorge Morais, He7d3r.bot e Annimo: 1
PostgreSQL Prtico/Conguraes Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/Configura%C3%A7%C3%
B5es?oldid=185985 Contribuidores: Ribafs, Jorge Morais e He7d3r.bot
PostgreSQL Prtico/Conguraes/Congurar acessos Fonte:
https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/
Configura%C3%A7%C3%B5es/Configurar_acessos?oldid=232673 Contribuidores: Ribafs, Jorge Morais, He7d3r.bot e Annimo: 1
PostgreSQL Prtico/Conguraes/Conguraes Diversas Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/
Configura%C3%A7%C3%B5es/Configura%C3%A7%C3%B5es_Diversas?oldid=259184 Contribuidores:
Ribafs, Jorge Morais,
He7d3r.bot e Annimo: 2
PostgreSQL Prtico/Metadados Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/Metadados?oldid=185998 Contribuidores: Ribafs, Jorge Morais, He7d3r.bot e Annimo: 1
PostgreSQL Prtico/Conectividade Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/Conectividade?oldid=185984
Contribuidores: Ribafs, Jorge Morais e He7d3r.bot
PostgreSQL Prtico/Ferramentas Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/Ferramentas?oldid=185990 Contribuidores: Ribafs, Jorge Morais e He7d3r.bot
PostgreSQL Prtico/Ferramentas/psql Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/Ferramentas/psql?oldid=
253097 Contribuidores: Ribafs, Jorge Morais, He7d3r.bot e Algum
PostgreSQL Prtico/Ferramentas/phpPgAdmin Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/Ferramentas/
phpPgAdmin?oldid=185996 Contribuidores: Ribafs, Jorge Morais e He7d3r.bot
PostgreSQL Prtico/Ferramentas/PgAdmin Fonte:
https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/Ferramentas/
PgAdmin?oldid=185995 Contribuidores: Ribafs, Jorge Morais e He7d3r.bot
PostgreSQL Prtico/Ferramentas/EMS PostgreSQL Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/Ferramentas/
EMS_PostgreSQL?oldid=185993 Contribuidores: Ribafs, Jorge Morais e He7d3r.bot
PostgreSQL Prtico/Ferramentas/Azzurry Clay Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/Ferramentas/
Azzurry_Clay?oldid=185991 Contribuidores: Ribafs, Jorge Morais e He7d3r.bot
PostgreSQL Prtico/Ferramentas/dbVisualizer Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/Ferramentas/
dbVisualizer?oldid=185992 Contribuidores: Ribafs, Jorge Morais e He7d3r.bot
PostgreSQL Prtico/Ferramentas/OpenOce Base Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/Ferramentas/
OpenOffice_Base?oldid=185994 Contribuidores: Ribafs, Jorge Morais e He7d3r.bot
PostgreSQL Prtico/Apndices Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%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: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%
C3%A1tico/Ap%C3%AAndices/Planejamento_e_Projeto_de_Bancos_de_Dados?oldid=185983 Contribuidores: Ribafs, Jorge Morais e
He7d3r.bot
PostgreSQL Prtico/Apndices/Implementao de Banco de Dados com o PostgreSQL Fonte: https://pt.wikibooks.org/wiki/
PostgreSQL_Pr%C3%A1tico/Ap%C3%AAndices/Implementa%C3%A7%C3%A3o_de_Banco_de_Dados_com_o_PostgreSQL?
oldid=185981 Contribuidores: Ribafs, Jorge Morais e He7d3r.bot
PostgreSQL Prtico/Apndices/Integridade Referencial - PostgreSQL Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%
A1tico/Ap%C3%AAndices/Integridade_Referencial_-_PostgreSQL?oldid=238543 Contribuidores: Ribafs, Jorge Morais, He7d3r.bot,
Shanmugamp7 e Annimo: 1
PostgreSQL Prtico/Apndices/Dicas Prticas de uso do SQL Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/
Ap%C3%AAndices/Dicas_Pr%C3%A1ticas_de_uso_do_SQL?oldid=185979 Contribuidores: Ribafs, Jorge Morais, He7d3r.bot e Annimo: 1
PostgreSQL Prtico/Apndices/Dicas sobre Desempenho e Otimizaes do PostgreSQL Fonte: https://pt.wikibooks.org/wiki/
PostgreSQL_Pr%C3%A1tico/Ap%C3%AAndices/Dicas_sobre_Desempenho_e_Otimiza%C3%A7%C3%B5es_do_PostgreSQL?
oldid=290226 Contribuidores: Ribafs, Jorge Morais, He7d3r.bot e Annimo: 2
PostgreSQL Prtico/Exerccios Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/Exerc%C3%ADcios?oldid=185989
Contribuidores: Ribafs, Jorge Morais e He7d3r.bot
PostgreSQL Prtico/Referncias Fonte: https://pt.wikibooks.org/wiki/PostgreSQL_Pr%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: https://upload.wikimedia.org/wikipedia/commons/a/ae/Diamond-caution.png Licena: CC-BYSA-3.0 Contribuidores: ? Artista original: ?


Ficheiro:Wikibooks-logo-pt.svg Fonte: https://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

Anda mungkin juga menyukai