Contedo
1
PostgreSQL Prtico/Introduo
1.1
1 - Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
PostgreSQL Prtico/Instalao
2.1
2 - Instalao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.1
3.2
Instalao no Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.1
2 Instalao no Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
PostgreSQL Prtico/DDL
5.1
16
18
PostgreSQL Prtico/DML
22
9.1
22
10 PostgreSQL Prtico/DML/Consultas
23
10.1 DML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
23
10.2 Consultas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
23
26
27
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
27
28
29
29
29
ii
CONTEDO
31
33
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
31
33
34
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
34
36
36
37
38
39
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
24 PostgreSQL Prtico/DCL
24.1 7 - DCL (Data Control Language) - Administrao
. . . . . . . . . . . . . . . . . . . . . . . . .
27 PostgreSQL Prtico/Administrao
39
41
41
42
42
44
44
45
45
47
47
49
49
51
26.1 8 Transaes
38
51
52
52
54
54
56
CONTEDO
iii
27.1 9 - Administrao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
28 PostgreSQL Prtico/Administrao/Backup e Restore
28.1 9.1 - Backup e Restore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
29 PostgreSQL Prtico/Administrao/Importar e Exportar
29.1 9.2 - Importar e Exportar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
30 PostgreSQL Prtico/Administrao/Converter
30.1 9.3 - Converter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
31 PostgreSQL Prtico/Administrao/Otimizao e Desempenho
56
57
57
60
60
61
61
62
62
62
62
31.4 VACUUM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
62
31.5 ANALYZE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
62
31.6 Recomendao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
62
63
63
63
31.10Reincio do ID de Transaes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
64
31.11Alerta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
64
32 PostgreSQL Prtico/Replicao
65
32.1 10 - Replicao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
65
66
33 PostgreSQL Prtico/Conguraes
33.1 11 - Conguraes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
38 PostgreSQL Prtico/Ferramentas
38.1 14 - Ferramentas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
67
67
68
68
71
71
73
73
79
79
81
81
iv
CONTEDO
39 PostgreSQL Prtico/Ferramentas/psql
82
84
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
88
89
89
90
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
46 PostgreSQL Prtico/Apndices
90
91
46.1 15 - Apndices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
47 PostgreSQL Prtico/Apndices/Planejamento e Projeto de Bancos de Dados
47.1 15.1 Planejamento e Projeto de Bancos de Dados
86
88
44 PostgreSQL Prtico/Ferramentas/dbVisualizer
85
86
84
85
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
82
. . . . . . . . . . . . . . . . . . . . . . . . .
91
92
92
95
95
98
98
100
105
109
112
CONTEDO
Captulo 1
PostgreSQL Prtico/Introduo
1.1 1 - Introduo
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
Mtodos de ndice
Mohawk Software
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
1.1. 1 - INTRODUO
vidor de banco de dados altamente sosticado, com
alta performance, estvel e capacitado para lidar com
grandes volumes de dados. O fato de ser um produto Open Source, sem custos de licena para nenhum
uso, torna o PostgreSQL uma alternativa extremamente
atraente para empresas que buscam um custo total de
propriedade (TCO) menor para os ativos de TI. Citao de: http://www.dib.com.br/dib%20cd/LC2003/P%
C3%A1ginas/LC2003_Conf.html
Metr de So Paulo e DATAPREV tambm utilizam o
PostgreSQL.
Captulo 2
PostgreSQL Prtico/Instalao
2.1 2 - Instalao
1. No Linux
2. No Windows
Captulo 3
De
/usr/local/src/postgresql-8.1.4/contrib/startscript/linux para /etc/init.d/postgresql
Dar permisso de
/etc/init.d/postgresql
execuo:
chmod
u+x
linha):
Antes de instalar:
export
postmaster inicia o processo do servidor responsvel por escutar por pedidos de conexo.
--locale=pt_BR
-D
A instalao via fontes (sources) em algumas distribuies muito enxutas, voltadas para para desktop, pode no
5
Sugesto de Padro
update -d -P
Exemplo:
banco clientes
tabela - cliente
Captulo 4
PostgreSQL Prtico/Instalao/No
Windows
4.1 2 Instalao no Windows
- Painel de controle - Ferramentas administrativas - Gerenciamento do computador - Usurios e grupos locais Usurios. Remova o postgres
Instalao no Windows XP
Lembrar que: Precisa instalar em sistema de arquivos - Na tela Inicializar o agrupamento de bancos de dados":
NTFS e no instala no XP Start Edition (onde falta su- - Caso precise acessar sua mquina de outra remota marporte a redes).
que Endereos
- Fazer download do site ocial (www.postgresql.org) - Em Locale selecione Portugus Brasil
(hoje postgresql-8.2.zip)
- Em Codicao selecione LATIN1
- Executar o arquivo postgresql-8.1.msi
- Entre com uma senha e repita. Altere o usurio se for o
- Selecionar idioma e Start. Depois em Prximo.
caso e Prximo.
- Na tela Informaes de Instalao existem muitas in- - Na tela Habilitar Linguagens Procedurais deixe marformaes importantes:
cada PL/pgsql (caso pretenda utilizar) e Prximo
- Sugere a leitura da FAQ
- Na tela Habilitar Mdulos Contrib marque os deseja- Fala das licenas dos diversos softwares a serem insta- dos e Prximo
lados
- Na tela Habilitar PostGIS em templae1 marque so- As verses 95, 98 e Me do Windows no so suportadas mente se precisar que todos os bancos tragam o PostGIS
e Prximo e Prximo novamente.
pelo PostgreSQL
- Aps instalar, na tela Instalao concluda
- Usar obrigatoriamente em sistema de arquivos NTFS
recomenda-se que voc se cadastrar na lista pgsql- Instalar como servio (mesmo que deixe como manual) announce, que envia informaes semanais sobre novas
- O PostgreSQL no executa com usurio que tenha pri- verses e correes de erros. Basta clicar no boto, fazer
o cadastro e Concluir.
vilgios de administrador
- Os drivers jdbc esto no subdiretrio \jdbc, que deve
ser adicionada ao CLASSPATH
- Na Tela Opes de Instalao marque:
- Suporte para idioma nativo (importante para ter as mensagens em pt_BR)
- E outros que considere importantes e clique em Prximo
- Na tela Congurao do Servio":
- Poder optar por instalar como servio ou no. Como
servio mais prtico. Clique em Prximo (ele criar
uma senha)
- Obs.: Caso j tenha instalado o PostgreSQL antes nesta
mquina dever remover o usurio postgres antes de
continuar:
8
Captulo 5
PostgreSQL Prtico/DDL
5.1 3 - DDL (Data Denition Language)
1. Criao e Excluso de Bancos, Esquemas, Tabelas,
Views, Constraints, etc
2. Alteraes nos objetos dos bancos
3. ndices, Tipos de Dados e Integridade Referencial
Captulo 6
PostgreSQL Prtico/DDL/Criao e
Excluso de Bancos, Esquemas, Tabelas,
Views, Constraints, etc
DDL o conjunto de comandos SQL responsveis pela Descrio: cria um novo banco de dados
denio dos dados, ou seja, pela criao de bancos, esSintaxe:
quemas, tabelas, campos, tipos de dados, constraints, etc.
CREATE DATABASE nome
3.1 - Criao e excluso de bancos, esquemas, tabelas,
[ [ WITH ] [ OWNER [=] dono_bd ] [ TEMPLATE [=]
views, etc
modelo ] [ ENCODING [=] codicao ] [ TABLESObs.: Nomes de objetos e campos no podem usar hfen PACE [=] tablespace ] ] [ CONNECTION LIMIT [=]
(-). Alternativamente usar sublinhado (_).
limite_con ] ]
campo-1 Invlido
CREATE DATABASE nomebanco;
campo_1 Vlido
Excluindo Um Banco
Nomes de Identicadores
Criar Tabela
DCL Linguagem de Controle de Dados (autorizao postgres=# \h create table
de dados e licena de usurios para controlar quem tem
Comando: CREATE TABLE
acesso aos dados).
DQL Linguagem de Consulta de Dados (Tem apenas Descrio: dene uma nova tabela
um comando: SELECT).
Sintaxe:
Criar Banco
banco=# \h create database
Comando: CREATE DATABASE
11
| LIKE tabela_pai [ { INCLUDING | EXCLUDING } CREATE TABLE produtos (
DEFAULTS ] } [, ... ]
produto_no integer, descricao text, preco numeric DE])
FAULT 9.99
[ INHERITS ( tabela_pai [, ... ] ) ]
);
Constraints (Restries)
[ CONSTRAINT nome_restrio ]
{ 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 (
campo2 text
Unique Constraint
);
Excluindo Tabela
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.
);
b integer,
c integer,
PRIMARY KEY (a, c)
a integer,
b integer,
c integer,
UNIQUE (a, c)
);
Chave Estrangeira (Foreign Key)
Criadas com o objetivo de relacionar duas tabelas,
mantendo a integridade referencial entre ambas. Especica que o valor da coluna (ou grupo de colunas) deve
);
corresponder a algum valor existente em um registro
CREATE TABLE produtos (
da outra tabela. Normalmente queremos que na tabela
estrangeira existam somente registros que tenham um
cod_prod integer CONSTRAINT unq_cod_prod UNI- registro relacionado na tabela principal. Como tambm
controla a remoo de registros na tabela principal que
QUE,
tenha registros relacionados na estrangeira.
nome text,
Tabela principal
preco numeric
);
Evitando duplicao com nulos:
create table teste(
id serial not null,
parent integer null,
component integer not null
);
postgres=# create unique index naoduplic on teste using
btree (component) where (parent is null);
Chaves Primrias (Primary Key)
A chave primria de uma tabela formada internamente
pela combinao das constraints UNIQUE e NOT
NULL. Uma tabela pode ter no mximo uma chave
primria. A teoria de bancos de dados relacional dita que
toda tabela deve ter uma chave primria. O PostgreSQL
no obriga que uma tabela tenha chave primria, mas
recomendvel, a no ser que esteja criando uma tabela
para importar de outra que contenha registros duplicados
para tratamento futuro ou algo parecido ou apenas para
testes.
CREATE TABLE produtos (
cod_prod integer UNIQUE NOT NULL,
nome text,
preco numeric
);
CREATE TABLE produtos (
);
CREATE TABLE t1 (
);
Composta (formada por mais de um campo)
CREATE TABLE exemplo (
a integer,
);
13
Obs.: O nmero de colunas e tipo na restrio devem ser blic.
semelhantes ao nmero e tipo das colunas referenciadas. Criando Um Esquema
Simulando ENUM no PostgreSQL
CREATE SCHEMA nomeesquema;
Excluindo Um Esquema
Para simular a constraint enum do MySQL, podemos DROP SCHEMA nomeesquema;
Aqui, quando o esquema tem tabelas em seu interior, no
usar a constraint check.
possvel apagar dessa forma, temos que utilizar:
Dica do site PostgreSQL & PHP Tutorials.
DROP SCHEMA nomeesquema CASCADE;
Que apaga o esquema e todas as suas tabelas, portanto
CREATE TABLE pessoa(
muito cuidado.
codigo int null primary key,
Obs.: O padro SQL exige que se especique RESTRICT
cor_favorita varchar(255) not null,
(default no PostgreSQL) OU CASCADE, mas nenhum
check (cor_favorita IN ('vermelha', 'verde', 'azul'))
SGBD segue esta recomendao.
);
Obs.: recomendado ser explcito quanto aos campos a
INSERT INTO pessoa (codigo, cor_favorita) values (1, serem retornados, ao invs de usar * para todos, entrar
com os nomes de todos os campos. Assim ca mais claro.
'vermelha'); -- OK
INSERT INTO pessoa (codigo, cor_favorita) values (1, Alm do mais a consulta ter um melhor desempenho.
'amarela'); -- Erro, amarelo no consta
Acessando Tabelas Em Esquemas
Herana
SELECT * FROM nomeesquema.nometabela;
Podemos criar uma tabela que herda todos os campos de
Privilgios Em Esquemas
outra tabela existente.
CREATE TABLE cidades (
\dp visualizar permisses
nome text,
REVOKE CREATE ON SCHEMA public FROM PUpopulacao oat,
BLIC; - - Remove o privilgio CREATE de todos os
altitude int -- (em ps)
usurios.
);
CREATE TABLE capitais (
estado char(2)
SELECT current_schema();
SELECT current_schemas(true);
) INHERITS (cidades);
capitais assim passa a ter tambm todos os campos da
tabela cidades.
Segundo uma entrevista (vide DBFree Magazine No. 2)
com a equipe de desenvolvimento do PostgreSQL, evite
utilizar herana de tabelas.
Esquemas (Schema)
\dn visualizar esquemas
Um banco de dados pode conter vrios esquemas e dentro de cada um desses podemos criar vrias tabelas. Ao
invs de criar vrios bancos de dados, criamos um e criamos esquemas dentro desse. Isso permite uma maior
exibilidade, pois uma nica conexo ao banco permite
acessar todos os esquemas e suas tabelas. Portanto devemos planejar bem para saber quantos bancos precisaremos, quantos esquemas em cada banco e quantas tabelas
em cada esquema.
Cada banco ao ser criado traz um esquema public, que
onde cam todas as tabelas, caso no seja criado outro
esquema. Este esquema public no padro ANSI. Caso
se pretenda ao portvel devemos excluir este esquema public e criar outros. Por default todos os usurios criados
tem privilgio CREATE e USAGE para o esquema pu-
SELECT current_schemas(false);
Vises (views)
\dp visualizar views e outros objetos
Que so VIEWS?
So uma maneira simples de executar e exibir dados selecionados de consultas complexas em bancos. Em que
elas so teis? Elas economizam grande quantidade de
digitao e esforo e apresentam somente os dados que
desejamos.
Criando Uma View
CREATE VIEW recent_shipments
AS
SELECT
count(*)
AS
num_shipped,
max(ship_date), title FROM shipments JOIN editions
USING (isbn) NATURAL JOIN books AS b (book_id)
GROUP BY b.title ORDER BY num_shipped DESC;
Usando Uma View
SELECT * FROM recent_shipments;
SELECT * FROM recent_shipments
SELECT cidade, temp_min, temp_max, prcp, data, localizacao FROM clima, cidades WHERE cidade = nome;
clientname VARCHAR(255)
);
clientid int CONSTRAINT client_contact_check REFEAs vises podem ser utilizadas em praticamente todos os
RENCES client(clientid),
lugares onde uma tabela real pode ser utilizada. Construir
name VARCHAR(255),
vises baseadas em vises no raro.
phone VARCHAR(255),
RULES
fax VARCHAR(255),
O comando CREATE RULE cria uma regra aplicada
emailaddress VARCHAR(255)
tabela ou viso especicada.
);
CREATE VIEW client_contact_list AS
Uma regra faz com que comandos adicionais sejam executados quando um determinado comando executado
em uma determinada tabela.
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;
evento
Supondo que uma consulta seja de particular interesse
para uma aplicao, mas que no se deseja digitar esta Evento um entre SELECT, INSERT, UPDATE e DE-
15
LETE.
\c testes
condio
Qualquer expresso condicional SQL (retornando boolean). A expresso condicional no pode fazer referncia testes=# DROP DATABASE template1;
a nenhuma tabela, exceto NEW e OLD, e no pode con- testes=# CREATE DATABASE template1 TEMPLATE
ter funes de agregao.
template0 ENCODING 'latin1';
INSTEAD
testes=# \c template1
INSTEAD indica que os comandos devem ser executados
template1=# VACUUM FULL FREEZE;
em vez dos (instead of) comandos originais.
template1=# VACUUM FULL;
ALSO
template1=# UPDATE pg_database SET datistemALSO indica que os comandos devem ser executados adi- plate=true WHERE datname='template1';
cionalmente aos comandos originais. Se no for especiAgora temos um template1 original e limpo.
cado nem ALSO nem INSTEAD, ALSO o padro.
comando
O comando ou comandos que compem a ao da regra.
Os comandos vlidos so SELECT, INSERT, UPDATE,
DELETE e NOTIFY.
Dentro da condio e do comando, os nomes especiais de
tabela NEW e OLD podem ser usados para fazer referncia aos valores na tabela referenciada. O NEW vlido
nas regras ON INSERT e ON UPDATE, para fazer referncia nova linha sendo inserida ou atualizada. O OLD
vlido nas regras ON UPDATE e ON DELETE, para
fazer referncia linha existente sendo atualizada ou excluda.
Obs.: necessrio possuir o privilgio RULE na tabela
para poder denir uma regra para a mesma.
Exemplos:
CREATE RULE me_notique AS ON UPDATE TO datas DO ALSO NOTIFY datas;
CREATE RULE r1 AS ON INSERT TO TBL1 DO
(INSERT INTO TBL2 VALUES (new.i); NOTIFY
TBL2);
CREATE RULE "_RETURN AS ON SELECT TO minha_viso DO INSTEAD
SELECT * FROM minha_tabela; -- Ao invs de selecionar da viso seleciona da tabela.
Banco de dados modelo intocado
Existe um modelo de banco de dados que sempre se preserva original, que o template0. O template template1
pode incorporar objetos e acaba algumas vezes cando
invivel seu uso como modelo. Quando isso acontece podemos substitui-lo com uma cpia do template0.
Criando banco de dados baseado em outro modelo
CREATE DATABSASE nomebanco TEMPLATE template0;
createdb -T template0 nomebanco
Recriando o template1
Captulo 7
TYPE tipo;
Adicionar Um Campo
ALTER TABLE produtos DROP CONSTRAINT pro- ALTER TABLE produtos RENAME TO equipamentos;
Adicionar Constraint (Restrio)
dutos_pk;
ALTERAR VALOR DEFAULT DE CAMPO:
Mudar Tipo de Dados de Campo (S >=8.0):
ALTER TABLE tabela ALTER COLUMN campo ALTER TABLE vendas ADD CONSTRAINT vendas_fk FOREIGN KEY (codigo) REFERENCES produ16
17
tos(codigo_produto);
ALTER TABLE vendas ADD CONSTRAINT vendas_fk FOREIGN KEY (codigo) REFERENCES produtos; -- Neste caso usa a chave primria da tabela produtos
Remover Constraint (Restrio) ALTER TABLE produtos DROP CONSTRAINT produtos_pk;
ALTER TABLE vendas DROP CONSTRAINT vendas_fk;
Captulo 8
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.
Exemplo:
Regra
geral
para
nome
idx_nometabela_nomecampo
de
ndice:
Remover ndice:
Se um campo tipo inteiro ir precisar de valores at 100 e
nunca mudar esta faixa. No devemos usar este campo DROP INDEX nomeindice;
com o tipo INT8, quando o INT2 atende e sobra.
Criar um ndice nico:
De forma semelhante escolher todos os demais campos CREATE UNIQUE INDEX nomeindice ON tabela
da tabela com bom senso. Mais Detalhes no Captulo 8 (campo);
do Manual:
Obs.: Somente os ndices tipo B-tree podem ser do tipo
http://pgdocptbr.sourceforge.net/pg80/datatype.html
Unique.
ndices
Criar um ndice com vrias colunas:
Os ndices so recursos do SGBD para melhorar o desem- CREATE INDEX idx_clientes_ps ON clientes (codigo,
penho de consultas. Mas como o uso de ndices tambm nome);
tem um preo importante planejar bem e conhecer as
Boa indicao para consultas com WHERE...AND. Ao
particularidades antes de adicionar um ndice.
usar OR o ndice no ser utilizado pelo PostgreSQL:
Cada vez que um registro inserido ou atualizado a tabela
SELECT nome FROM clientes WHERE codigo = 12
de ndices tambm atualizada.
AND nome = 'Joo';
Quando criamos consultas SQL, que pesquisam tabelas com muitos registros e esta consulta usa a clusula Usar ndices com vrias colunas com moderao. ndices
WHERE, ento os campos que fazem parte da clusula com mais de 3 colunas tem grandes possibilidades de no
WHERE so bastante indicados para ndice, para que serem utilizados internamente.
melhore o desempenho da consulta.
Tipos de ndices
Os ndices so uma forma de melhorar o desempenho
de bancos de dados. Ao invs de procurar de forma sequencial, o servidor procura pelo ndice, como se faz uma
busca em ndices de livros e vai-se diretamente pgina
procurada.
O PostgreSQL suporta atualmente quatro tipos de ndices: B-tree (rvore B), R-tree (rvore R), Hash e GiST.
B-tree -> o tipo padro (assume quando no indicamos).
So ndices que podem tratar consultas de igualdade e de
faixa, em dados que podem ser classicados.
O ndice passado para cada registro adicionado ou reIndicado para consultas com os operadores: <, <=, =, >=,
movido.
>. Tambm pode ser utilizado com LIKE, ILIKE, ~ e ~*.
difcil criar regras genricas para determinar que ndiR-tree -> tipo mais adequado a dados espaciais. Adeces devem ser denidos. Muita experincia por parte do
quado para consultas com os operadores: <<, &<, &>,
administrador e muita vericao experimental neces>>, @, ~=, &&.
sria na maioria dos casos.
18
19
Hash ->indicados para consultas com comparaes de Isso num AMD Duron 1300, 128MB de RAM).
igualdade simples. desencorajado seu uso. Em seu lu- ndice Funcional
gar recomenda-se o B-tree. GiST ->
CREATE INDEX nomeindice ON tabela (lower (nomeCriando ndices de tipos diferentes:
campo));
CREATE INDEX nome ON tabela USING tipo timo artigo no iMasters
(campo);
http://www.imasters.com.br/artigo.php?cn=1897&cc=
tipo: BTREE, RTREE, HASH, GIST
23
Obs.: Somente os tipos B-tree e GiST suportam ndices
http://www.imasters.com.br/artigo.php?cn=1922&cc=
com vrias colunas. ndices com mais de um campo so- 23
mente ser utilizado se as clusulas com os campos indexados forem ligados por AND. Um ndice com mais de 3 http://www.imasters.com.br/artigo.php?cn=1959&cc=
23
campos dicilmente ser utilizado.
ndice Parcial
Boleanos
Representaes:
't', 'true', 'y', 'yes e '1'
FALSE
21
Acessando:
SELECT
name
FROM
sal_emp
pay_by_quarter[1] <> pay_by_quarter[2];
WHERE
Captulo 9
PostgreSQL Prtico/DML
9.1 4 - DML (Data Manipulation
Language)
1. Consultas (select, insert, update e delete)
2. Consultas Join
3. Sub Consultas
22
Captulo 10
PostgreSQL Prtico/DML/Consultas
10.1 DML
10.2 Consultas
- simples e claras
psql -l
24
psql
ASC o default
Sintaxe resumida:
SELECT * FROM tabela; -- retorna todos os registros da
tabela com todos os campos
A lista_de_campos o retorno da consulta.
2) SELECT
coes.lotacao
pessoal.siape,
pessoal.senha,
loca-
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
Comando: SELECT
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 ] ]
10.2. CONSULTAS
25
26
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
Captulo 11
As junes SQL so utilizadas quando precisamos seleExemplo (voltar todos somente de pessoal):
cionar dados de duas ou mais tabelas.
SELECT p.siape, p.nome, l.lotacao FROM pessoal p
Existem as junes com estilo non-ANSI ou theta (juno
LEFT JOIN lotacoes l ON p.siape = l.siape ORDER BY
com WHERE).
p.siape;
E as junes ANSI join (com JOIN). As junes ANSI
Veja que pessoal ca esquerda em FROM pessoal p
podem ser de dois tipos, as INNER JOINS e as OUTER
LEFT JOIN lotacoes l.
JOINS. A padro a INNER JOIN. INNER JOIN pode
RIGHT OUTER JOIN
ser escrito com apenas JOIN.
Inverso do LEFT, este retorna todos os registros somente
da tabela da direita (right). Primeiro, realizada uma
SELECT p.siape, p.senha, l.lotacao FROM pessoal p
juno interna. Depois, para cada linha de T2 que no
CROSS JOIN lotacoes l;
satisfaz a condio de juno com nenhuma linha de T1,
Tipos de Junes
adicionada uma linha juntada com valores nulos nas coINNER JOIN - Onde todos os registros que satisfazem lunas de T1. o oposto da juno esquerda: a tabela resultante possui, incondicionalmente, uma linha para cada
condio sero retornados.
linha de T2.
Exemplo:
Exemplo (retornar somente os registros de lotacoes):
SELECT p.siape, p.nome, l.lotacao FROM pessoal p INNER JOIN lotacoes l ON p.siape = l.siape ORDER BY SELECT p.siape, p.nome, l.lotacao FROM pessoal p
RIGHT JOIN lotacoes l ON p.siape = l.siape ORDER
p.siape;
BY p.nome;
Exemplo no estilo theta:
FULL OUTER JOIN
SELECT p.siape, p.nome, l.lotacao FROM pessoal p, lotacoes l WHERE p.siape = l.siape ORDER BY p.siape; Primeiro, realizada uma juno interna. Depois, para
cada linha de T1 que no satisfaz a condio de juno
OUTER JOIN que se divide em LEFT OUTER JOIN e com nenhuma linha de T2, adicionada uma linha junRIGHT OUTER JOIN
tada com valores nulos nas colunas de T2. Tambm, para
LEFT OUTER JOIN ou simplesmente LEFT JOIN - So- cada linha de T2 que no satisfaz a condio de juno
mente os registros da tabela da esquerda (left) sero re- com nenhuma linha de T1, adicionada uma linha juntornados, tendo ou no registros relacionados na tabela tada com valores nulos nas colunas de T1.
da direita.
E tambm as:
Primeiro, realizada uma juno interna. Depois, para CROSS JOIN e SELF JOIN (para si mesmo).
cada linha de T1 que no satisfaz a condio de juno
com nenhuma linha de T2, adicionada uma linha jun- Vide item 7.2.1.1 do manualocial para mais detalhes e
tada com valores nulos nas colunas de T2. Portanto, a ta- exemplos.
bela juntada possui, incondicionalmente, no mnimo uma LIMIT
linha para cada linha de T1.
LIMIT (limite) juntamente com OFFSET (deslocaA tabela esquerda do operador de juno exibir cada mento) permite dizer quantas linhas desejamos retornar
um dos seus registros, enquanto que a da direita exibir
Exemplo ANSI:
27
28
da consulta. Podemos retornar desde apenas uma at to- com uma expresso booleana. O escopo das expresses
das.
na clusula ON inclui as tabelas correntes, e as tabelas
nos blocos de consulta externos ao SELECT corrente. No
Sintaxe:
exemplo a seguir, a clusula ON faz referncia s tabelas
SELECT lista_de_campos FROM expresso [LIMIT { correntes:
nmero | ALL }] [OFFSET inicio]
SELECT * FROM SAMP.EMPREGADOS INLIMIT ALL mesmo que imitir LIMIT.
NER JOIN SAMP.EQUIPES ON EMPREGAOFFSET inicio orienta para que a consulta retorne so- DOS.SAL?RIO < EQUIPES.SAL?RIO;
mente a partir de inicio.
A clusula ON pode fazer referncia a tabelas que no
esto sendo juntadas, e no obrigada a fazer referncia a
OFFSET 0 mesmo que omitir OFFSET.
nenhuma das tabelas sendo juntadas (embora tipicamente
LIMIT 50 OFFSET 11 Dever trazer 50 registros do o faa).
11 at o 60, caso existam.
-- Juno das tabelas ATIV_EMP e EMPREGADOS
Obs.: Quando se utiliza LIMIT importante utilizar a -- selecionar todas as colunas da tabela ATIV_EMP
clusula ORDER BY para estabelecer uma ordem nica e -- adicionar o sobrenome do empregado (Lpara as linhas do resultado. Caso contrrio, ser retor- TIMO_NOME) da tabela -- EMPREGADOS a todas
nado um subconjunto imprevisvel de linhas da consulta; as linhas do resultado SELECT SAMP.ATIV_EMP.*,
pode-se desejar obter da dcima a vigsima linha, mas da LTIMO_NOME FROM SAMP.ATIV_EMP JOIN
dcima a vigsima de qual ordem? A ordem desconhe- SAMP.EMPREGADO ON ATIV_EMP.NUM_EMP
cida a no ser que seja especicado ORDER BY. Isto = EMPREGADOS.NUM_EMP; -- Juntar as tabelas
uma conseqncia inerente ao fato do SQL no prometer EMPREGADOS e DEPARTAMENTOS, -- selecionar
retornar os resultados de uma consulta em qualquer or- o nmero do empregado (NUM_EMP), -- o sobrenome
dem especca, a no ser que ORDER BY seja utilizado do empregado (LTIMO_NOME), -- o nmero do
para impor esta ordem.
departamento (DEP_TRAB na tabela EMPREGADOS
e -- NUM_DEP na tabela DEPARTAMENTOS) -- e o
Exemplos:
nome do departamento (NOME_DEP) -- de todos os
SELECT id, name FROM products ORDER BY name
empregados nascidos (DATA_NASC) antes de 1930.
LIMIT 20 OFFSET 1;
SELECT NUM_EMP, LTIMO_NOME, DEP_TRAB,
Ir retornar os registros do 1 at o 20.
NOME_DEP FROM SAMP.EMPREGADOS JOIN
SELECT * FROM news_m LIMIT $inicio, SAMP.DEPARTAMENTOS ON DEP_TRAB =
NUM_DEP AND YEAR(DATA_NASC) < 1930; -$n_resultados
Outro exemplo de gerar novos valores de dado, -- utiliO comando SELECT * FROM news_m LIMIT zando uma consulta que seleciona da clusula VALUES
$n_resultados OFFSET $inicio
-- (que uma forma alternativa de FULLSELECT). SEir pesquisar as noticias da tabela news_m comeando LECT * FROM (VALUES (3, 4), (1, 5), (2, 6)) AS TABELA1_VALORES(C1, C2) JOIN (VALUES (3, 2), (1,
do resultado "$inicio e ir listar "$n_resultados.
2),(0, 3)) AS TABELA2_VALORES(C1, C2) ON TAExemplo: SELECT * FROM news_m LIMIT 3 OFF- BELA1_VALORES.C1 = TABELA2_VALORES.C1;
SET 2 ir exibir 3 notcias a partir da 2a. notcia da tabela, ou seja, ir exibir as notcias 2, 3 e 4 da nossa tabela O que resulta em:
news_m.
C1 |C2 |C1 |2 ---------------------------------------------- 3 |4 |3 |2 1 |5 |1 |2 -- Listar todos os departamentos, juntamente com o -- nmero do empregado
e o ltimo nome do gerente SELECT NUM_DEP,
11.2 INNER JOIN
NOME_DEP, NUM_EMP, LTIMO_NOME FROM
Denio e exemplos no site db.apache.org e muitas ou- DEPARTAMENTOS INNER JOIN EMPREGADOS
ON NUM_GER = NUM_EMP; -- Listar todos os ntras boas informaes sobre SQL:
meros do empregado e ltimo nome, juntamente -http://db.apache.org/derby/docs/dev/pt_BR/ref/
com o nmero do empregado e ltimo nome de seus
rrefsqlj35034.html
gerentes SELECT E.NUM_EMP, E.LTIMO_NOME,
INNER JOIN (juno interna) uma Operao JOIN que M.NUM_EMP, M.LTIMO_NOME FROM EMPREGADOS E INNER JOIN DEPARTAMENTOS INpermite especicar uma clusula de juno explcita.
NER JOIN EMPREGADOS M ON NUM_GER =
Sintaxe
M.NUM_EMP ON E.DEP_TRAB = NUM_DEP;
ExpressoTabela [ INNER ] JOIN ExpressoTabela {
ON ExpressoBooleana }
A clusula de juno pode ser especicada utilizando ON
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;
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.
Sintaxe
ExpressoTabela RIGHT [ OUTER ] JOIN ExpressoTabela { ON ExpressoBooleana }
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 12
NOT IN
ANY/SOME
EXISTS
select nome, estado, case when estado = 'PB' then 'FeSELECT nome, CASE WHEN EXISTS (SELECT nome chado' when estado = 'CE' or estado = 'SP' then 'FunciFROM frutas WHERE nome=a.nome) THEN 'sim' onando' when estado = 'MA' then 'Funcionando a todo
vapor' else 'Menor' end as status from amigos order by
ELSE 'no' END AS fruta FROM alimentos a;
nome;
IN
Mostrar cada nota junto com a menor nota, a maior nota,
SELECT nome, CASE WHEN nome IN (SELECT nome e a mdia de todas as notas.
FROM frutas) THEN 'sim' ELSE 'no' END AS fruta
SELECT nota, (SELECT MIN(nota) FROM notas) AS
FROM alimentos;
31
32
Captulo 13
33
Captulo 14
PostgreSQL Prtico/Funes
Internas/Strings
14.1 5.1 Funes de Strings
SELECT
MD5('ribafs);
53cd5b2af18063bea8ddc804b21341d1
SELECT LOWER('UNIFOR');
Converter para maisculas
SELECT UPPER('universidade');
Retorna
Posio de caractere
<------gre----->
Ou
34
35
http://pgdocptbr.sourceforge.net/pg80/functions-string.
html
Like e %
Captulo 15
PostgreSQL Prtico/Funes
Internas/Matemticas
15.1 5.2 Funes Matemticas
Operadores Matemticos
expresso IS TRUE
+, -, *, /, % (mdulo, resto de diviso de inteiros), ^(poexpresso IS NOT TRUE
tncia), !(fatorial), @(valor absoluto)
| / - rais quadrada ( | / 25.0 = 5) | | / - raiz cbica ( | | / 27.0 expresso IS FALSE
= 3)
expresso IS UNKNOWN
ROUND(numeric) - arredonda para o inteiro mais pr- NULL com NULL -- Unknown
ximo
CONVERSO DE/PARA NULL
ROUND(v, d) - arredonda v com d casas decimais
NULLIF() e COALESCE()
SIGN(numeric) - retorna o sinal da entrada, como 1 ou NULLIF(valor1, valor2)
+1
NULLIF Retorna NULL se, e somente se, valor1 e vaSQRT(X) - Raiz quadrada de X
lor2 forem iguais, caso contrrio retorna valor1.
TRUNC (numeric) - trunca para o nenhuma casa decimal Algo como:
TRUNC (v numeric, s int) - trunca para s casas decimais if (valor1 == valor2){
Operadores Lgicos:
then NULL
AND, OR e NOT. TRUE, FALSE e NULL
else valor1;
Operadores de Comparao:
a BETWEEN x AND y
36
37
Captulo 16
PostgreSQL Prtico/Funes
Internas/Agrupamento
16.1 5.3 Funes de Agrupamento (Agregao)
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';
38
Captulo 17
PostgreSQL Prtico/Funes
Internas/Data e Hora
17.1 5.4 Funes de Data/Hora
timestamp '2001-09-28 01:00' + interval '23 hours -> ti- No usar em campos somente timestamp.
mestamp '2001-09-29 00:00'
Funo date_part (retorna double)
date '2001-09-28' + interval '1 hour' -> timestamp '2001- SELECT date_part('day', TIMESTAMP '2001-02-16
09-28 01:00'
20:38:40');
date '01/01/2006' date '31/01/2006'
SELECT
DATE_PART('DAY',
RENT_TIMESTAMP) AS dia;
SELECT
DATE_PART('MONTH',
RENT_TIMESTAMP) AS mes;
CUR-
CUR-
DATE_PART('YEAR',
age('2001-04-10', timestamp '1957-06-13') -> 43 years 9 SELECT
RENT_TIMESTAMP) AS ano;
mons 27 days
CUR-
Funo extract (retorna double) Extrai parte da data: Funo date_trunc (retorna timestamp)
ano, ms, dia, hora, minuto, segundo.
SELECT date_trunc('year', TIMESTAMP '2001-02-16
select extract(year from age('2001-04-10', timestamp 20:38:40');
'1957-06-13'))
Retorna 2001-02-16 00:00:00
select extract(month from age('2001-04-10', timestamp Convertendo (CAST)
'1957-06-13'))
select to_date('1983-07-18', 'YYYY-MM-DD')
select extract(day from age('2001-04-10', timestamp
select to_date('19830718', 'YYYYMMDD')
'1957-06-13'))
Funo timeofday (retorna texto)
Data e Hora atuais (retornam data ou hora)
select timeofday() -> Fri Feb 24 10:07:32.000126 2006
BRT
SELECT CURRENT_DATE;
SELECT CURRENT_TIME;
Interval
SELECT CURRENT_TIME(0);
interval [ (p) ]
SELECT CURRENT_TIMESTAMP;
SELECT CURRENT_TIMESTAMP(0);
39
40
'YYYY-
Tipos Geomtricos:
CREATE TABLE geometricos(ponto POINT, segmento
LSEG, retangulo BOX, poligono POLYGON, circulo
CIRCLE);
ponto (0,0),
segmento de (0,0) at (0,1),
retngulo (base inferior (0,0) at (1,0) e base superior
(0,1) at (1,1)) e
crculo com centro em (1,1) e raio 1.
INSERT
INTO
geometricos
VALUES
('(0,0)','((0,0),(0,1))',
'((0,0),(0,1))',
'((0,0),(0,1),(1,1),(1,0))','((1,1),1)');
Tipos de Dados para Rede:
Para tratar especicamente de redes o PostgreSQL tem
os tipos de dados cidr, inet e macaddr.
cidr para redes IPV4 e IPV6
inet para redes e hosts IPV4 e IPV6
macaddr endereos MAC de placas de rede
Assim como tipos data, tipos de rede devem ser preferidos ao invs de usar tipos texto para guardar IPs, Mscaras ou endereos MAC.
Veja um exemplo em ndices Parciais e a documentao
ocial para mais detalhes.
Captulo 18
PostgreSQL Prtico/Funes
Internas/Formatao de Tipos de Dados
18.1 5.5 - Formatao de Tipos de
Dados
TO_CHAR - Esta funo deve ser evitada, pois est prevista sua descontinuao.
TO_DATE
date TO_DATE(text, text); Recebe dois parmetros text
e retorna date.
Um dos parmetros a data e o outro o formato.
SELECT TO_DATE('29032006','DDMMYYYY'); Retorna 2006-03-29
TO_TIMESTAMP
tmt TO_TIMESTAMP(text,text) - Recebe dois text e retorna timestamp with zone
SELECT
TO_TIMESTAMP('29032006
14:23:05','DDMMYYYY HH:MI:SS'); - Retorna
2006-03-29 14:23:05+00
TO_NUMBER
numeric TO_NUMBER(text,text)
SELECT TO_NUMBER('12,454.8-', '99G999D9S');
Retorna 12454.8
SELECT TO_NUMBER('12,454.8-', '99G999D9'); Retorna 12454.8
SELECT TO_NUMBER('12,454.8-', '99999D9'); Retorna 12454
Detalhes no item 9.8 do manual.
41
Captulo 19
PostgreSQL Prtico/Funes
Internas/Converso de Tipos
19.1 5.6 - Converso Explcita de
Tipos (CAST)
SELECT VERSION();
SELECT CURRENT_SETTING('DATESTYLE');
SELECT HAS_TABLE_PRIVILEGE('usuario','tabela','privilegio');
SELECT HAS_DATABASE_PRIVILEGE('postgres,'testes,'create');
- - Retorna: t
SELECT HAS_SCHEMA_PRIVILEGE('postgres,'public','create');
- - Retorna: t
SELECT DATE '10/05/2002' - DATE '10/05/2001'; -SELECT relname FROM pg_class WHERE
Retorna a quantidade de dias - -entre as duas datas
pg_table_is_visible(oid);
Para este tipo de converso devemos:
Arrays
Usar oat8 ao invs de double precision;
SELECT
ARRAY[1.1,2.2,3.3]::INT[]
=
ARUsar entre aspas alguns tipos como interval, time e times- RAY[1,2,3];
tamp
SELECT ARRAY[1,2,3] = ARRAY[1,2,8];
Obs.: aplicaes portveis devem evitar esta forma de
SELECT ARRAY[1,3,5] || ARRAY[2,4,6];
converso e em seu lugar usar o CAST explicitamente.
SELECT 0 || ARRAY[2,4,6];
A funo CAST() utilizada para converter explicitaArray de char com 48 posies e cada uma com 2:
mente tipos de dados em outros.
SELECT CAST(2 AS double precision) ^ CAST(3 AS campo char(2) [48]
double precision) AS exp";
Funes Geomtricos
SELECT ~ CAST('20' AS int8) AS negativo"; - Retorna area(objeto) - - area(box '((0,0), (1,1))');
21
center(objeto) - - center(box '((0,0), (1,2))');
SELECT round(CAST (4 AS numeric), 4); - Retorna
diameter(circulo double) - - diameter(circle '((0,0), 2.0)');
4.0000
height(box) - - height(box '((0,0), (1,1))');
SELECT substr(CAST (1234 AS text), 3);
SELECT 1 AS real UNION SELECT CAST('2.2' AS length(objeto) - - length(path '((1,0), (1,0))');
REAL);
radius(circle) - - radius(circle '((0,0), 2.0)');
Funes Diversas
SELECT CURRENT_DATABASE();
SELECT CURRENT_SCHEMA();
SELECT CURRENT_SCHEMA(boolean);
SELECT CURRENT_USER;
masklen(inet) - - masklen('192.168.1.5/24') - - 24
SELECT SESSION_USER;
42
43
netmask(inet) 255.255.255.0
netmask('192.168.1.5/24')
network(inet) 192.168.1.0/24
network('192.168.1.5/24')
pg_stat_le(arquivo text)
Funo macaddr
trunt(macaddr) - - trunc(maraddr '12:34:34:56:78:90:ab')
- - 12:34:56:00:00:00
Funes de Informao do Sistema
current_database()
current_schema()
current_schemas(boolean)
current_user()
inet_client_addr()
inet_client_port()
inet_server_addr()
inet_server_port()
pg_postmaster_start_time()
version()
has_table_privilege(user, table, privilege) - d privilgio
ao user na tabela
has_table_privilege(table, privilege) - d privilgio ao
usurio atual na tabela
has_database_privilege(user, database, privilege) - d
privilgio ao user no banco
has_function_privilege(user, function, privilege) - d privilgio ao user na funo
has_language_privilege(user, language, privilege) - d
privilgio ao user na linguagem
has_schema_privilege(user, schema, privilege) - d privilgio ao user no esquema
has_tablespace_privilege(user, tablespace, privilege) - d
privilgio ao user no tablespace
current_setting(nome) - valor atual da congurao
set_cong(nome, novovalor, is_local) - seta parmetro de
retorna novo valor
pg_start_backup(label text)
pg_stop_backup()
pg_column_size(qualquer)
pg_tablespace_size(nome)
pg_database_size(nome)
pg_relation_size(nome)
pg_total_relation_size(nome)
pg_size_pretty(bigint)
pg_ls_dir(diretorio)
Captulo 20
44
Captulo 21
Funes na linguagem C
45
46
Funo que retorna um tipo composto. Funo que retorna uma nica linha da tabela empregados:
Mais detalhes no captulo 31 do manual.
CREATE FUNCTION novo_empregado() RETURNS
empregados AS $$ SELECT text 'Nenhum' AS nome,
1000.0 AS salario, 25 AS idade, point '(2,2)' AS baia; $$
LANGUAGE SQL;
Ou
CREATE
OR
REPLACE
FUNCTION
novo_empregado() RETURNS empregados AS $$
SELECT ROW('Nenhum', 1000.0, 25, '(2,2)')::empregados; $$ LANGUAGE SQL;
Chamar assim:
SELECT novo_empregado();
ou
SELECT * FROM novo_empregado();
Funes SQL como fontes de tabelas
CREATE TEMP TABLE teste (testeid INT, testesubid
INT, testename text); INSERT INTO teste VALUES
(1, 1, 'Joo'); INSERT INTO teste VALUES (1, 2,
'Jos'); INSERT INTO teste VALUES (2, 1, 'Maria');
CREATE FUNCTION getteste(INT) RETURNS teste
AS $$ SELECT * FROM teste WHERE testeid = $1;
$$ LANGUAGE SQL; SELECT *, UPPER(testename)
FROM getteste(1) AS t1;
Tabelas Temporrias - criar tabelas temporrias (TEMP),
faz com que o servidor se encarregue de remov-la (o que
faz logo que a conexo seja encerrada).
CREATE TEMP TABLE nometabela (campo tipo);
Funes SQL retornando conjunto
CREATE FUNCTION getteste(INT) RETURNS SETOF teste AS $$ SELECT * FROM teste WHERE
testeid = $1; $$ LANGUAGE SQL; SELECT * FROM
getteste(1) AS t1;
Funes SQL polimrcas
As funes SQL podem ser declaradas como recebendo e
retornando os tipos polimrcos anyelement e anyarray.
CREATE FUNCTION constroi_matriz(anyelement,
anyelement) RETURNS anyarray AS $$ SELECT
ARRAY[$1, $2]; $$ LANGUAGE SQL; SELECT constroi_matriz(1, 2) AS intarray, constroi_matriz('a'::text, 'b') AS textarray; CREATE
FUNCTION eh_maior(anyelement, anyelement) RETURNS BOOLEAN AS $$ SELECT $1 > $2; $$
LANGUAGE SQL; SELECT eh_maior(1, 2);
Captulo 22
nar_campos_selecionados(in_t
nome_da_tabela)
RETURNS text AS $$ BEGIN RETURN in_t.f1 ||
in_t.f3 || in_t.f5 || in_t.f7; END; $$ LANGUAGE
As funes em linguagens procedurais no PostgreSQL, plpgsql;
como a Pl/pgSQL so correspondentes ao que se chama
comumente de Stored Procedures. Por default o PostExemplo para somar 3 Valores
greSQL s traz suporte s funes na linguagem SQL.
Para dar suporte funes em outras linguagens temos CREATE FUNCTION somar_tres_valores(v1 anyelement, v2 anyelement, v3 anyelement) RETURNS
que efetuar procedimentos como a seguir.
anyelement AS $$ DECLARE resultado ALIAS FOR
Para que o banco postgres tenha suporte linguagem
$0; BEGIN resultado := v1 + v2 + v3; RETURN
de procedimento Pl/PgSQL executamos na linha de coresultado; END; $$ LANGUAGE plpgsql; SELECT
mando como super usurio do PostgreSQL:
somar_tres_valores(10,20,30);
createlang plpgsql U nomeuser nomebanco no prompt
ou create language plpgsql por SQL.
Utilizao de tipo composto:
PGSQL 8.4
CREATE
FUNCTION
mesclar_campos(t_linha
createlang -U nomeuser -W -e plpgsql nomebanco
nome_da_tabela) RETURNS text AS $$ DECLARE
A Pl/pgSQL a linguagem de procedimentos armaze- t2_linha nome_tabela2%ROWTYPE; BEGIN SELECT
nados mais utilizada no PostgreSQL, devido ser a mais * INTO t2_linha FROM nome_tabela2 WHERE ...
; RETURN t_linha.f1 || t2_linha.f3 || t_linha.f5 ||
madura e com mais recursos.
t2_linha.f7; END; $$ LANGUAGE plpgsql; SELECT
//Cdigo-fonte CREATE FUNCTION func_escopo() mesclar_campos(t.*) FROM nome_da_tabela t WHERE
RETURNS INTEGER AS $$ DECLARE quantidade ... ;
INTEGER := 30; BEGIN RAISE NOTICE 'Aqui a
quantidade %', quantidade; -- A quantidade aqui 30
quantidade := 50; -- -- Criar um sub-bloco -- DECLARE Temos uma tabela (datas) com dois campos (data e hora)
quantidade INTEGER := 80; BEGIN RAISE NOTICE e queremos usar uma funo para manipular os dados
'Aqui a quantidade %', quantidade; -- A quantidade desta tabela:
aqui 80 END; RAISE NOTICE 'Aqui a quantidade CREATE OR REPLACE FUNCTION data_ctl(opcao
%', quantidade; -- A quantidade aqui 50 RETURN CHAR, fdata DATE, fhora TIME) RETURNS
quantidade; END; $$ LANGUAGE plpgsql; => SE- CHAR(10) AS $$ DECLARE opcao ALIAS FOR
LECT func_escopo();
$1; vdata ALIAS FOR $2; vhora ALIAS FOR $3; retorno CHAR(10); BEGIN IF opcao = 'I' THEN INSERT
CREATE FUNCTION instr(VARCHAR, INTEGER) INTO datas (DATA, hora) VALUES (vdata, vhora);
RETURNS INTEGER AS $$ DECLARE v_string retorno := 'INSERT'; END IF; IF opcao = 'U' THEN UPALIAS FOR $1; INDEX ALIAS FOR $2; BEGIN -- al- DATE datas SET DATA = vdata, hora = vhora WHERE
gum processamento neste ponto END; $$ LANGUAGE DATA='1995-11-01'; retorno := 'UPDATE'; END IF;
IF opcao = 'D' THEN DELETE FROM datas WHERE
plpgsql;
DATA = vdata; retorno := 'DELETE'; ELSE retorno :=
'NENHUMA'; END IF; RETURN retorno; END; $$
Exemplo concatenar campos.
LANGUAGE plpgsql; --select data_ctl('I','1996-11-01',
CREATE
FUNCTION
concate- '08:15'); SELECT data_ctl('U','1997-11-01','06:36');
47
48
SELECT data_ctl('U','1997-11-01','06:36');
Mais Detalhes no captulo 35 do manual ocial.
Funes que Retornam Conjuntos de Registros
(SETS)
CREATE
OR
REPLACE
FUNCTION
codigo_empregado (codigo INTEGER) RETURNS
SETOF INTEGER AS $$ DECLARE registro RECORD; retval INTEGER; BEGIN FOR registro IN
SELECT * FROM empregados WHERE salario >= $1
LOOP RETURN NEXT registro.departamento_cod;
END LOOP; RETURN; END; $$ LANGUAGE
'plpgsql'; SELECT * FROM codigo_empregado (0);
SELECT COUNT (*), g FROM codigo_empregado
(5000) g GROUP BY g;
Captulo 23
evento Um entre INSERT, UPDATE ou DELETE; especica o evento que dispara o gatilho. Vrios eventos
podem ser especicados utilizando OR.
50
CREATE
OR
REPLACE
FUNCTION
id_nome_cliente(INTEGER) RETURNS text AS
Outro exemplo:
$$ DECLARE r record; BEGIN SELECT INTO r *
CREATE TABLE empregados ( codigo serial PRI- FROM clientes WHERE id = $1; IF NOT found THEN
MARY KEY, nome VARCHAR NOT NULL, salario raise exception ''Cliente no existente !''; END IF;
INTEGER ); CREATE TABLE empregados_audit( RETURN r.nome; END; $$ LANGUAGE 'plpgsql';
usuario VARCHAR NOT NULL, DATA TIMESTAMP NOT NULL, id INTEGER NOT NULL, Crie uma funo que retorne os nome de toda a tabela
coluna text NOT NULL, valor_antigo text NOT NULL, clientes concatenados em um s campo
valor_novo text NOT NULL ); CREATE OR REPLACE FUNCTION processa_emp_audit() RETURNS CREATE OR REPLACE FUNCTION clientes_nomes()
TRIGGER AS $emp_audit$ BEGIN -- -- No per- RETURNS text AS $$ DECLARE x text; r record;
mitir atualizar a chave primria -- IF (NEW.codigo BEGIN x:=''Inicio''; FOR r IN SELECT * FROM
<> OLD.codigo) THEN RAISE EXCEPTION 'No clientes ORDER BY id loop x:= x||'' : ''||r.nome; END
permitido atualizar o campo codigo'; END IF; -- loop; RETURN x||'' : m''; END; $$ LANGUAGE
-- Inserir linhas na tabela emp_audit para reetir as 'plpgsql';
alteraes -- realizada na tabela emp. -- IF (NEW.nome
<> OLD.nome) THEN INSERT INTO emp_audit SELECT CURRENT_USER, CURRENT_TIMESTAMP,
NEW.id, 'nome', OLD.nome, NEW.nome; END
IF; IF (NEW.salario <> OLD.salario) THEN INSERT INTO emp_audit SELECT CURRENT_USER,
CURRENT_TIMESTAMP, NEW.codigo, 'salario',
OLD.salario, NEW.salario; END IF; RETURN NULL;
-- o resultado ignorado uma vez que este um gatilho
AFTER END; $emp_audit$ LANGUAGE plpgsql;
CREATE TRIGGER emp_audit AFTER UPDATE
ON empregados FOR EACH ROW EXECUTE PROCEDURE processa_emp_audit(); INSERT INTO
empregados (nome, salario) VALUES ('Joo',1000);
INSERT INTO empregados (nome, salario) VALUES
('Jos',1500); INSERT INTO empregados (nome,
salario) VALUES ('Maria',2500); UPDATE empregados SET salario = 2500 WHERE id = 2; UPDATE
empregados SET nome = 'Maria Ceclia' WHERE id
Captulo 24
PostgreSQL Prtico/DCL
24.1 7 - DCL (Data Control Language) - Administrao
7.1 - Administrao de usurios, grupos e privilgios
51
Captulo 25
PostgreSQL Prtico/DCL/Administrao
de usurios, grupos e privilgios
25.1 7.1 - Usurios, grupos e privilgios
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
53
dade;
A tabela pg_user uma tabela de sistema (_pg) que Os privilgios especiais do dono da tabela (ou seja, os
guarda todos os usurios do PostgreSQL.
direitos de DROP, GRANT, REVOKE, etc.) so sempre inerentes condio de ser o dono, no podendo ser
Tambm podemos utilizar:
concedidos ou revogados. Porm, o dono do objeto pode
\du ou \dg
decidir revogar seus prprios privilgios comuns como,
por exemplo, tornar a tabela somente para leitura para o
Criando Um Grupo de usurios
prprio, assim como para os outros.
CREATE GROUP nomedogrupo;
Normalmente, s o dono do objeto (ou um superusurio)
Adicionar/Remover Usurios de um Grupo
pode conceder ou revogar privilgios para um objeto.
ALTER GROUP nomegrupo ADD USER user1, -- Criao dos grupos
user2,user3 ;
CREATE GROUP adm;
ALTER GROUP nomegrupo DROP USER user1, user2
CREATE USER paulo ENCRYPTED PASSWORD
;
'paulo' CREATEDB CREATEUSER;
Excluindo Grupo
-- Criao dos Usurios do Grupo adm
DROP GROUP nomegrupo;
CREATE USER andre ENCRYPTED PASSWORD 'anObs.: isso remove somente o grupo, no remove os usu- dre' CREATEDB IN GROUP adm;
rios.
CREATE USER michela ENCRYPTED PASSWORD
Listando todos os grupos:
'michela' CREATEDB IN GROUP adm;
SELECT groname FROM pg_group;
O usurio de sistema (super usurio) deve ser um usurio
Privilgios
Dando Privilgios A Um Usurio
GRANT UPDATE ON nometabela TO nomeusuario;
Dando Privilgios A Um Grupo Inteiro
GRANT SELECT ON nometabela TO nomegrupo;
Removendo Todos os Privilgios de Todos os Users
REVOKE ALL ON nometabela FROM PUBLIC
Privilgios
criado exclusivamente para o PostgreSQL. Nunca devemos torn-lo dono de nenhum executvel.
Os nomes de usurios so globais para todo o agrupamento de bancos de dados, ou seja, podemos utilizar um
usurio com qualquer dos bancos.
Os privilgios DROP, GRANT, REVOKE, etc pertencem ao dono do objeto no podendo ser concedidos ou
revogados. O mximo que um dono pode fazer abdicar de seus privilgios e com isso ningum mais teria os
mesmos e o objeto seria somente leitura para todos.
O superusurio tem direito a fazer o que bem entender Exemplo: para permitir a um usurio apenas os privilgios de INSERT, UPDATE e SELECT e no permitir o
em qualquer banco de dados do SGBD.
de DELETE em uma tabela, use:
O usurio que cria um objeto (banco, tabela, view, etc)
REVOKE ALL ON tabela FROM usuario;
o dono do objeto.
Para que outro usurio tenha acesso ao mesmo deve re- GRANT SELECT,UPDATE,INSERT ON tabela TO
usuario;
ceber privilgios.
Existem vrios privilgios diferentes: SELECT, IN- Mais detalhes:
SERT, UPDATE, DELETE, RULE, REFERENCES, http://pgdocptbr.sourceforge.net/pg80/user-manag.html
TRIGGER, CREATE, TEMPORARY, EXECUTE e
http://pgdocptbr.sourceforge.net/pg80/sql-revoke.html
USAGE.
Os privilgios aplicveis a um determinado tipo de objeto http://pgdocptbr.sourceforge.net/pg80/sql-grant.html
variam de acordo com o tipo do objeto (tabela, funo,
etc.).
O comando para conceder privilgios o GRANT. O de
remover o REVOKE.
Captulo 26
PostgreSQL Prtico/Transaes
26.1 8 Transaes
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.
26.1. 8 TRANSAES
ALTER TABLE tabela DROP COLUMN antigocampo;
COMMIT;
Transaes que no se Concretizam
BEGIN; -- Iniciar uma transao UPDATE contas SET
saldo = 50.85 WHERE codigo= 5; SELECT nome,saldo
FRON contas WHERE codigo = 5; ROLLBACK;
-- Cancelando todos os comandos da transao SELECT nome,saldo FRON contas WHERE codigo = 5;
BEGIN; -- Iniciar uma transao CREATE TABLE
teste (id INTEGER, nome text); INSERT INTO teste
VALUES (1, 'Teste1'); INSERT INTO teste VALUES
(2, 'Teste2'); DELETE FROM teste; COMMIT; -gravar resultados SELECT * FROM TESTE; -- BEGIN;
CREATE TABLE teste (id INTEGER, nome text);
INSERT INTO teste VALUES (3, 'Teste3'); INSERT
INTO teste VALUES (4, 'Teste4'); DELETE FROM
teste; ROLLBACK; SELECT * FROM TESTE;
Detalhes sobre conitos de bloqueios:
http://www.postgresql.org/docs/current/static/
explicit-locking.html
Isolamento de Transaes
O nvel de isolamento padro do PostgreSQL o Read
Committed (leitura efetivada). Uma consulta SELECT
realizada com este nvel perceber os registros existente
no incio da consulta. Este o nvel mais exvel.
Existe tambm o nvel serializable, mais rigoroso. Os
nveis Read uncommitted e Repeatable read so suportados, mas assumem a forma de um dos dois anteriores.
Setando o Nvel de Isolamento de uma transao:
banco=# \h SET TRANSACTION
Comando: SET TRANSACTION Descrio: dene as
caractersticas da transao atual Sintaxe:
SET TRANSACTION modo_transao [, ...] SET
SESSION CHARACTERISTICS AS TRANSACTION
modo_transao [, ...]
onde modo_transao um dos:
ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ
UNCOMMITTED } READ WRITE | READ ONLY
Exemplo:
BEGIN; SET TRANSACTION ISOLATION LEVEL
SERIALIZABLE; Aqui AS consultas da transao; ...
COMMIT;
Controle de Simultaneidade no Captulo 12 do manual
ocial.
55
Captulo 27
PostgreSQL Prtico/Administrao
27.1 9 - Administrao
1. Backup e Restore
2. Importar e Exportar
3. Converter
4. Otimizao e Desempenho
56
Captulo 28
PostgreSQL
Prtico/Administrao/Backup e Restore
28.1 9.1 - Backup e Restore
para o pg_restore)
Backup local de apenas uma tabela de um banco:
Administrao
kendid) AS s;
ou
Tendo um banco com cadastro de CEPs e apenas uma tabela cep_tabela, mostrar o uso do disco por esta tabela.
57
58
Ferramentas Contrib
O utilitrio VACUUM recupera espao em disco ocupado pelos registros excludos e atualizados, atualiza os pgbench testa desempenho do SGBD.
dados para as estatsticas usadas pelo planejador de con- dbsize mostra o tamanho de tabelas e bancos
sultas e tambm protege contra perda de dados quando
oid2name retorna OIDs, leinode e nomes de tabelas
atingir um bilho de transaes.
SELECT relname, rellenode, relpages FROM pg_class D:\ARQUIV~1\POSTGR~1\8.1\bin>oid2name -U postWHERE relname LIKE 'cep_%' ORDER BY relname; gres -P ********
All databases:
relname | rellenode | relpages
Oid Database Name Tablespace 33375 bdcluster ncluster
16948 cep_brasil pg_default 25146 cep_full pg_default
cep_pk | 25140 | 2441 cep_tabela | 16949 | 27540
33360 controle_estoque pg_default 16879 municipios
pg_default 33340 pgbench pg_default 10793 postgres
O daemon do auto-vacuum
Iniciando na verso 8.1 um processo opcional do ser- pg_default 10792 template0 pg_default 33377 template1
pg_default 16898 testes pg_default
vidor, chamado de autovacuum daemon, cujo uso
para automatizar a execuo dos comandos VACUUM No README desta contrib existe uma boa sugesto para
e ANALYZE.
encontrar o tamanho aproximados dos dados de cada obRoda periodicamente e checa o uso em baixo nvel do jeto interno do PostgreSQL com:
+-------------+----------
coletor de estatsticas.
REM PGUSER
REM PGPASSWORD
REM nome pasta de backup
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
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;
59
Captulo 29
PostgreSQL
Prtico/Administrao/Importar e
Exportar
29.1 9.2 - Importar e Exportar
No Windows
Exportando:
CREATE TEMP TABLE paises AS SELECT * FROM Exportar um Banco Access para uso no PostgreSQL
ou outros bancos
teste WHERE nome LIKE '%tina%';
\COPY paises TO '/usr/teste.copy';
Com Delimitadores
Captulo 30
PostgreSQL
Prtico/Administrao/Converter
30.1 9.3 - Converter
Uma boa forma de converter bancos MySQL para bancos PostgreSQL no Windows instalando o driver ODBC
para o MySQL e para o PostgreSQL.
Ento cria-se a comunicao com os dois bancos e
exporta-se para o PostgreSQL.
Existem ferramentas comerciais com muitos recursos,
como o caso do EMS Data Export e Import for
PostgreSQL: http://www.sqlmanager.net/en/products/
postgresql/dataexport
Veja: export to MS Excel, MS Word / RTF, MS Access,
HTML, TXT, CSV, PDF, XML and SQL.
Outra opo exportar para CSV do MySQL e importar
pelo PostgreSQL.
61
Captulo 31
PostgreSQL
Prtico/Administrao/Otimizao e
Desempenho
31.1 Otimizao e Desempenho
O comando ANALYZE coleta estatsticas sobre o contedo das tabelas do banco de dados e armazena os resultados na tabela do sistema pg_statistic. Posteriormente,
o planejador de comandos utiliza estas estatsticas para
ajudar a determinar o plano de execuo mais eciente
para os comandos. Caso no atualizemos estas estatsticas com freqncia podemos comprometer o desempenho do banco de dados por uma escolha errada do plano
de comandos.
Normalmente operaes DELETE ou UPDATE no removem os registros automaticamente. Somente aps a
execuo do VACUUM isso acontece.
31.6 Recomendao
Analyze:
http://pgdocptbr.sourceforge.net/pg80/ Para a maioria das instalaes executar o comando VAsql-analyze.html
CUUM ANALYZE para todo o banco de dadosuma vez
ao dia em horrio de pouca utilizao. Tambm podemos
utilizar o comando: vacuumdb -fazq.
31.4 VACUUM
Quando foi excluda a maioria dos registros de uma tabela sugere-se a execuo do comando VACUUM FULL.
O comando Vacuum tanto recupera espao em disco, Este comando gera um forte bloqueio nas tabelas em que
quanto otimiza o desempenho do banco e previne con- executado.
62
63
Em tabelas cujo contedo excludo periodicamente, Utilizar links simblicos para mover tabelas, ndices, ...
como tabelas temporrias, indicado o uso do comando para outro HD.
TRUNCATE ao invs de DELETE.
Ativar o chip DMA do HD
Exemplo de uso do vacuum. Acesse o banco e execute:
Testar: hdparm -Tr /dev/hda (status)
VACUUM VERBOSE ANALYZE nometabela;
64
31.11 Alerta
Modicando-se a consulta para restringir mais ainda a Caso um banco j esteja com mais de 1,5 bilhes de transaes, ao executar o comando VACUUM para o banco
condio
inteiro receber um alerta sobre a necessidade de execuEXPLAIN SELECT * FROM tenk1 WHERE unique1 <
o do VACUUM.
50;
Adio de outra condio clusula WHERE:
EXPLAIN SELECT * FROM tenk1 WHERE unique1 <
50 AND stringu1 = 'xxx';
A seguir feita a juno de duas tabelas, utilizando as
colunas sendo discutidas:
EXPLAIN SELECT * FROM tenk1 t1, tenk2 t2
WHERE t1.unique1 < 50 AND t1.unique2 = t2.unique2;
Uma forma de ver outros planos forar o planejador a
no considerar a estratgia que sairia vencedora, habilitando e desabilitando sinalizadores de cada tipo de plano
(Esta uma ferramenta deselegante, mas til.
SET enable_nestloop = o;
EXPLAIN SELECT * FROM tenk1 t1, tenk2 t2
WHERE t1.unique1 < 50 AND t1.unique2 = t2.unique2;
possvel vericar a preciso dos custos estimados pelo planejador utilizando o comando EXPLAIN
ANALYZE. Na verdade este comando executa a consulta, e depois mostra o tempo real acumulado dentro de
cada n do plano junto com os custos estimados que o comando EXPLAIN simples mostraria. Por exemplo, poderia ser obtido um resultado como este:
EXPLAIN ANALYZE SELECT * FROM tenk1 t1,
tenk2 t2 WHERE t1.unique1 < 50 AND t1.unique2 =
t2.unique2;
Captulo 32
PostgreSQL Prtico/Replicao
32.1 10 - Replicao
values(roger)
'
port=5432',
select *
'update clientes
from dblink
where id = 18
'dbname=pgteste
'
hostaddr=200.174.40.63
);
user=paulo
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
port=5432',
select
dblink_exec(
where id = 18
'dbname=pgteste
'
hostaddr=200.174.40.63
);
user=paulo
password=paulo
port=5432',
'insert into clientes(nome)
65
66
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
Captulo 33
PostgreSQL Prtico/Conguraes
33.1 11 - Conguraes
1. Congurar acessos (pg_hba.conf)
2. Conguraes Diversas (postgresql.conf)
67
Captulo 34
PostgreSQL
Prtico/Conguraes/Congurar acessos
34.1 11.1 - pg_hba.conf
Este mtodo de conexo para uso somente atravs sockets de domnio UNIX
Ao instalar o PostgreSQL 8.1.4 via fontes ele cria (e Sem um registro tipo local essa conexo negada
alerta) o arquivo pg_hba.conf com autenticao do tipo
trust (sem senha mas somente para conexo local).
1. host DATABASE USER CIDR-ADDRESS
METHOD [OPTION]
Para autenticar exigindo um dos tipos com senha, devemos antes, ainda no trust, alterar os usurios adicionando
Conexo via TCP/IP. Este tipo de conexo s possvel
senha:
quando o valor do parmetro listen_address (IP) adeALTER ROLE nomeuser WITH PASSWORD 'senhaquado no postgresql.conf. Por default somente localhost
dopg';
permitido. So permitidas conexes com ou sem SSL.
Somente ento devemos alterar o pg_hba.conf para pedir
senha e restartar o PostgreSQL.
1. hostssl DATABASE USER CIDR-ADDRESS
METHOD [OPTION]
As conguraes principais so feitas nos arquivos
pg_hba.conf e postgresql.conf. Se instalado atravs dos
fontes cam no subdiretrio data de instalao do Post- Semelhante ao host, sendo que neste usa-se criptograa
greSQL, normalmente em /usr/local/pgsql. Se instalado SSL.
via binrios da distribuio vai variar com a distribuio.
No Slackware esto no diretrio /usr/share/postgresql.
1. hostnossl DATABASE USER CIDR-ADDRESS
METHOD [OPTION]
O pg_hba.conf controla que mquinas tero acesso ao
PostgreSQL e a autenticao dessas mquinas clientes
(sem autenticao ou atravs de outras formas, trust, Apenas para conexes que no usam SSL.
md5, crypt, etc).
1. DATABASE can be all, sameuser, samerole,
O pg_hba.conf muito rico e podemos controlar o acesso
a database name, or
pelo IP, pela mscara, pelo banco, pelo usurio, pelo mtodo (trust, md5, password, etc).
- um nome de banco ou
69
- um nome de usurio
172.20.143.89 255.255.255.255
Estes campos somente se aplica aos registros host, hostssl J este acima aceitar todas as conexes locais incondicie hostnossl.
onalmente (sem senha)
METHOD pode ser trust, reject, md5, crypt, A segunda linha ser ignorada.
password,
Veja vrios exemplos do pg_hba.conf e mais detlahes no
captulo 20 do manual ocial do PostgreSQL em
1. krb5, ident, ou pam
Observe que conexes locais no usam o campo CIDRtrust - permite conexo a qualquer um incondicional- ADDRESS.
mente (sem senha)
Exemplos no pg_hba.conf:
reject - rejeita conexo incondicionalmente para o Conexo local via socket
user/host especicado
local all all md5
crypt - recomendada somente para verses inferiores a
Conexo local via TCP/IP
7.2. Atualmente recomenda-se md5
krb5 - somente disponvel para conexes via TCP/IP
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
70
1. TYPE DATABASE USER IP-ADDRESS IPObtm o nome de usurio do sistema operacional do cliMASK METHOD
ente (para conexes TCP/IP fazendo contato com o servidor de identicao no cliente, para conexes locais obtendo a partir do sistema operacional) e verica se o usu- host all all 200.217.23.234 255.255.255.255 reject host
rio possui permisso para se conectar como o usurio de all all 0.0.0.0 0.0.0.0 md5
banco de dados solicitado consultando o mapa especi- Mais detalhes sobre o pg_hba.conf em:
cado aps a palavra chave ident.
http://pgdocptbr.sourceforge.net/pg80/
Exemplo para Ubuntu (facilmente adaptvel para outras client-authentication.html
distros e SOs).
Se instalado pelo repositrio:
- sudo gedit /etc/postgresql/8.1/main/postgresql.conf
Altere:
1. listen_addresses = 'localhost'
para:
listen_addresses = '*'
Aqui tambm existem outras importantes conguraes,
como datestyle = 'sql, dmy' # Datas no estilo brasileiro
dd/mm/aaaa
client_encoding = latin1 # suporte nossa acentuao
- sudo gedit /etc/postgresql/8.1/main/pg_hba.conf
1. TIPO BANCO USURIO CIDR-ADDRESS MTODO
1. local para domnios Unix somente com conexes
via socket
1. no requer IP
local all all md5
1. Conexes locais via IPv4:
host all all 127.0.0.1/32 md5
1. Conexes locais via IPv6:
host all all ::1/128 md5
1. Conexes para todos os IPs de uma subrede
(10.0.0.0)
1. TYPE DATABASE USER IP-ADDRESS IPMASK METHOD
host all all 10.43.0.0 255.0.0.0 md5
Opo para permitir acesso atravs de toda a internet:
Captulo 35
PostgreSQL
Prtico/Conguraes/Conguraes
Diversas
35.1 11.2 - postgresql.conf
O postgresql.conf permite congurar as demais funcionalidades do PostgreSQL
Liberando acesso via rede TCP/IP na verso 7.4.x:
tcp_socket = true (default = false)
No 8.0.x: listen_address = '10.0.0.16'
Alguns conguraes do postgresql.conf: Regra geral: os
valores que vm comentados com # so os valores default.
Se formos alterar algum idealmente devemos fazer uma
cpia da linha e descomentar, para sempre saber o valor
default.
71
72
Captulo 36
PostgreSQL Prtico/Metadados
36.1 12 - Metadados (Catlogo)
Este exemplo mostra uma consulta que lista os nomes dos esquemas, tabelas, colunas e chaves das chaves estrangeiras, e os nomes dos esquemas, tabelas e colunas referenciadas. Exemplo tirado da lista de discusso
Tabelas, donos, comentrios, registros e tablespaces pgsql-sql
de um schema
CREATE TEMPORARY TABLE t1 (id SERIAL
SELECT
c.relname
as
tabela, PRIMARY KEY, nome TEXT); CREATE TEMpg_catalog.pg_get_userbyid(c.relowner)
AS
dono, PORARY TABLE t2 (id INT REFERENCES
pg_catalog.obj_description(c.oid,
'pg_class)
AS t1, nome TEXT); SELECT n.nspname AS escomentario, reltuples::integer as registros, (SE- quema, cl.relname AS tabela, a.attname AS coluna,
LECT spcname FROM pg_catalog.pg_tablespace ct.conname AS chave, nf.nspname AS esquema_ref,
pt WHERE pt.oid=c.reltablespace) AS tables- clf.relname AS tabela_ref, af.attname AS coluna_ref,
pace FROM pg_catalog.pg_class c LEFT JOIN pg_get_constraintdef(ct.oid) AS criar_sql FROM
pg_catalog.pg_namespace n ON n.oid = c.relnamespace pg_catalog.pg_attribute a JOIN pg_catalog.pg_class
WHERE c.relkind = 'r' AND nspname='public' ORDER cl ON (a.attrelid = cl.oid AND cl.relkind = 'r')
JOIN pg_catalog.pg_namespace n ON (n.oid =
BY c.relname
73
74
75
GROUP BY tablename;
LEFT JOIN pg_catalog.pg_user u ON u.usesysid = -- r = ordinary table, i = index, S = sequence, v = view, c
c.relowner
= composite type, -- s = special, t = TOAST table
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = Tamanho em bytes de um banco:
c.relnamespace
select pg_database_size('banco');
WHERE c.relkind IN ('r',)
Tamanho em bytes de uma tabela:
AND n.nspname NOT IN ('pg_catalog', 'pg_toast')
pg_total_relation_size('tabela')
AND pg_catalog.pg_table_is_visible(c.oid)
Tamanho em bytes de tabela ou ndice:
ORDER BY 1,2;
pg_relation_size('tabelaouindice')
Listar Tabelas
Lista donos e bancos:
select c.relname FROM pg_catalog.pg_class c
SELECT rolname as dono, datname as banco
LEFT JOIN pg_catalog.pg_namespace n ON n.oid =
FROM pg_roles, pg_database
c.relnamespace
WHERE c.relkind IN ('r',) AND n.nspname NOT IN WHERE pg_roles.oid = datdba
('pg_catalog', 'pg_toast')
AND pg_catalog.pg_table_is_visible(c.oid);
Nomes de bancos:
SELECT tablename FROM pg_tables WHERE table- select datname from pg_database where datname not in
name NOT LIKE 'pg%' AND tablename NOT LIKE ('template0','template1') order by 1
'sql\_%'
Nomes e colunas:
Listar todas as tabelas, ndices, tamanho em KB e
select tablename,'T' from pg_tables where tablename not
OIDs:
like 'pg\_%' and tablename not in ('sql_features,
VACUUM; --Executar antes este comando
'sql_implementation_info',
'sql_languages,
'sql_packages, 'sql_sizing', 'sql_sizing_proles)
SELECT c1.relname AS tabela, c2.relname AS indice,
c2.relpages * 8 AS tamanho_kb, c2.rellenode AS ar- union
quivo
select viewname,'V' from pg_views where viewname not
like 'pg\_%'
FROM pg_class c1, pg_class c2, pg_index i
WHERE c1.oid = i.indrelid AND i.indexrelid = c2.oid
UNION
SELECT nspname,
FROM pg_class
76
dex size,
SELECT
77
criar_sql
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'
78
Captulo 37
PostgreSQL Prtico/Conectividade
37.1 13 - Conectividade
AtivConex.ActiveConnection = Conex
End Sub
Vou mostrar a conectividade do PostgreSQL com o PHP, Exemplo Bsico de Java Acessando PostgreSQL Via
com o Java e com o Visual BASIC.
JDBC
Tambm mostrarei a conectividade atravs do ODBC Crie no PostgreSQL um pequeno banco de dados chacom o Access.
mado agenda com uma nica tabela chamada amigos.
Conectando com o PHP
80
Captulo 38
PostgreSQL Prtico/Ferramentas
38.1 14 - Ferramentas
1. psql
2. phpPgAdmin
3. PgAdmin
4. EMS PostgreSQL
5. Azzurry Clay (modelagem com o Eclipse)
6. dbVisualizer
7. OpenOce Base
81
Captulo 39
PostgreSQL Prtico/Ferramentas/psql
39.1 14.1 - psql
Obs.: Em caso de erro teclar Ctrl+C para encerrar. Lembrando que isso no Windows sai do psql.
comando help
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
Estando no Windows
82
83
Captulo 40
PostgreSQL
Prtico/Ferramentas/phpPgAdmin
40.1 14.2 - phpPgAdmin
Baixar de - http://phppgadmin.sourceforge.net/
- Copiar para o diretrio web
- Editar o arquivo conf/cong.inc.php e alterar para dois
servidores (um local e outro remoto):
... // Display name for the server on the login screen
$conf['servers][0]['desc'] = 'Local';
$conf['servers][0]['host'] = '127.0.0.1';
$conf['servers][0]['defaultdb'] = 'nomebancodefault';
// Example for a second server (PostgreSQL Remoto)
$conf['servers][1]['desc'] = 'Remoto';
$conf['servers][1]['host'] = '10.99.00.11';
$conf['servers][1]['port'] = 5432;
$conf['servers][1]['defaultdb'] = 'nomebancodefault';
...
$conf['extra_login_security'] = false;
84
Captulo 41
PostgreSQL
Prtico/Ferramentas/PgAdmin
41.1 14.3 PgAdmin
PgAdmin
Site para download, caso sua distribuio no traga ou no
tenha como instalar (apt, synaptic ou outro gerenciador de
pacotes).
http://www.pgadmin.org/download/
uma ferramenta grca desenvolvida pela equipe de desenvolvimento do PostgreSQL.
Muitos recursos. Traz um help sobre si e sobre a documentao do PostgreSQL. Tecle F1 para exibir.
Ao executar consultas na ferramenta SQL, tecle F7 para
visualizar gracamente a consulta na aba Explain.
85
Captulo 42
PostgreSQL Prtico/Ferramentas/EMS
PostgreSQL
42.1 14.4 - EMS PostgreSQL Manager
CRIAR TABELAS
- Execute um duplo clique no novo banco
- Observe a estrutura criada para o novo banco:
O EMS um timo gerenciador de diversos tipos de ban- - Clique sobre Tables com o boto direito e New Table
(ou tecle Ctrl+N)
cos, inclusive do PostgreSQL.
Download http://www.sqlmanager.net/en/products/ - Acima digitamos o nome da tabela onde existe table1
postgresql/manager (para Windows existe uma verso - Ento clicamos na aba Fields.
free, a lite)
- Mais um duplo clique, agora em Column Name, para
Aqui vou abordar as atividades principais e bsicas de uso que aparea o Wizard de Campos
do EMS:
- Veja que o nome do campo codigo. Que ele do
- Abrir em banco
tipo BIGINT e tambm chave primria.
- Criar em novo banco
- Criar tabelas
- Veja agora como aparece nosso campo (com uma pequena chave direita):
- Criar campos
- Clique em Next
- Clicamos em Next.
87
(FOREIGN KEY)
Captulo 43
PostgreSQL Prtico/Ferramentas/Azzurry
Clay
43.1 14.5 - Azzurry Clay (modelagem)
Ferramenta de Modelagem Azzurry Clay:
http://www.azzurri.jp/en/software/clay/index.jsp
Visualizador de Objetos e gerador de Diagramas de Entidade Relacionamento (DER), alm de fazer engenharia
reversa nos bancos existentes.
Um timo tutorial online:
http://www.azzurri.jp/en/software/clay/quick_start_
guide.jsp?print=on
Uma boa relao de ferramentas para o PostgreSQL pode
ser encontrada no site do PostgreSQL Brasil:
https://wiki.postgresql.org.br/wiki/Ferramentas
Outra boa relao no site Data Modeling Tools:
http://www.databaseanswers.com/modelling_tools.htm
88
Captulo 44
PostgreSQL
Prtico/Ferramentas/dbVisualizer
44.1 14.6 DbVisualizer
tima ferramenta para visualizar bancos e montar o diagrama entidades-relacionamento.
http://www.dbvis.com/products/dbvis/download.html
89
Captulo 45
PostgreSQL
Prtico/Ferramentas/OpenOce Base
45.1 14.7 Openoce2 Base
Usando o OpenOce para abrir, editar bancos de dados
PostgreSQL, como tambm criar consultas, formulrios
e relatrios.
Uma das formas de conectar o OpenOce ao PostgreSQL usando um driver JDBC do PostgreSQL.
- Antes devemos ter instalado o OpenOce com suporte
a Java
- Baixe daqui:
http://jdbc.postgresql.org/download.html#jars
Para o PostgreSQL 8.1 podemos pegar o JDBC3 http://jdbc.postgresql.org/download/postgresql-8.
1-405.jdbc3.jar
- Abrir o OpenOce, pode ser at o Writer Ferramentas Opes Java Class Path Adicionar Arquivo
(indicar o arquivo postgresql-8.0-313.jdbc2.jar baixado)
e OK.
- Abrir o OOBase
- Conectar a um banco de dados existente
- Selecionar JDBC - Prximo
- URL da fonte de dados:
jdbc:postgresql://127.0.0.1:5432/bdteste
Classe do driver JDBC:
org.postgresql.Driver
Nome do usurio - postgres
password required (marque, caso use senha)
Concluir
Digitar um nome para o banco do OOBase
Pronto. Agora todas as tabelas do banco bdteste esto
disponveis no banco criado no OOBase.
Tambm podemos agora criar consulta com assistentes,
criar formulrios e relatrios com facilidade.
90
Captulo 46
PostgreSQL Prtico/Apndices
46.1 15 - Apndices
1. Planejamento e Projeto de Bancos de Dados
2. Implementao de Banco de Dados com o PostgreSQL
3. Integridade Referencial - PostgreSQL
4. Dicas Prticas de uso do SQL
5. Dicas sobre Desempenho e Otimizaes do PostgreSQL
91
Captulo 47
PostgreSQL
Prtico/Apndices/Planejamento e Projeto
de Bancos de Dados
47.1 15.1 Planejamento e Projeto
de Bancos de Dados
CPF
93
Integridade Referencial
Ela garante a integridade dos dados nas tabelas relacionadas. Um bom exemplo quando o banco impede que
se cadastre um pedido para um cliente inexistente, ou impede que se remova um cliente que tem pedidos em seu
nome.
Tambm se pode criar o banco de forma que quando atualizamos o CPF de um cliente ele seja atualizado em todos
os seus pedidos.
Relacionamento Um para Um
Normalizao de Tabelas
Um para vrios
Aquele onde os campos que fazem o relacionamento so Normalizar bancos tem o objetivo de tornar o banco mais
chaves primrias. Cada registro de uma tabela se relaci- eciente.
ona com apenas um registro da outra tabela. Este relaciUma regra muito importante ao criar tabelas atentar
onamento no muito comum.
para que cada tabela contenha informaes sobre um
Exemplo: CorrentistaBanco - Conjuge
nico assunto, de um nico tipo.
Relacionamento Um para Vrios ou Vrios para Um
1a Forma Normal
Aquele onde uma tabela tem um campo chave primria Os campos no devem conter grupos de campos que se
que se relaciona com outra tabela atravs de um campo repetem nos registros.
chave estrangeira. o tipo de relacionamento mais utiliExemplo:
zado.
Alunos: matricula, nome, data_nasc, serie, pai, mae
Exemplos:
Categorias - Itens
Fornecedores - Produtos
2 Forma Normal
NotaFiscal - Produtos
Clientes - Pedidos
Produtos - Itens
Captulo 48
PostgreSQL
Prtico/Apndices/Implementao de
Banco de Dados com o PostgreSQL
48.1 15.2 Implementao de
Banco de Dados com o PostgreSQL - Modelo Fsico
DbVisualizer: http://www.dbvis.com/products/dbvis/
Em forma de Plug-ins para Eclipse
QuantumDB: (http://quantum.sourceforge.net/)
Azzurri/Clay: (http://www.azzurri.jp/en/software/clay/
Ativar suporte a Pl/PgSQL requer dois passos:
download.jsp)
- instalar a biblioteca Pl/PgSQL, que do tipo contrib
SQLExplorer:
(http://sourceforge.net/projects/
- denir a linguagem (como sugerido abaixo)
eclipsesql)
Uma grande e boa relao de softwares de projeto, modelagem e gerenciamento para o PostgreSQL, free e comercial pode ser encontrada em no site ocial so PostgreSQL
Brasil:
https://wiki.postgresql.org.br/wiki/Ferramentas.
- Ativando como superusurio na console (fora dos banSuporte Acentuao na Criao de Bancos no Post- cos)
greSQL
su - postgres
A codicao default do PG 7.X a SQL_ASCII
A do PG 8.X a UNICODE
Ou simplesmente:
Ambas tem suporte a acentuao, mas geram problemas $ createlang plpgsql nomebanco
no backup/importao.
JDBC
Codicao
Alguns programas em Java o utilizam, como o plugin
Para um suporte estvel acentuao em portugus do QuantumDB.
Brasil uma boa opo criar o banco passando a codi95
Com isso estamos tirando o privilgio de todos os usuVeja que para selecionar o arquivo .jar correto, precisamos cruzar a verso do PostgreSQL esquerda com a rios acessarem o esquema public.
verso do JDBC desejado.
Acesso aos Esquemas
Exemplo: Para uso como cliente em sua mquina pelo Quando se cria um banco no PostgreSQL, por default,
Quantum DB (no Eclipse) e com PostgreSQL 8.1 baixar ele cria um esquema pblico (public) no mesmo e neste
o arquivo: 8.1-405 JDBC 3
esquema que so criados todos os objetos quando no especicamos o esquema. A este esquema public todos os
Esquemas
usurios do banco tm livre acesso, mas aos demais existe
Denir os esquemas do banco.
a necessidade de se dar permisso para que os mesmos
Quando o cliente precisa de muitas tabelas, organizadas acessem.
em vrias reas a sada imediata a criao de vrios bancos de dados. Mas quando da implementao do aplicativo que ir utilizar estes bancos os desenvolvedores se
depararo com a diculdade de comunicao e acesso entre os bancos, j que com uma nica conexo tero acesso
a todos os objetos do banco. muito til para estes casos
criar um nico banco e neste criar vrios esquemas, organizados por reas: pessoal, administracao, contabilidade,
engenharia, etc.
Mas e quando uma destas reas tem outras sub-reas,
como por exemplo a engenharia, que tem reservatrios,
obras, custos e cada um destes tem diversas tabelas. O
esquema engenharia car muito desorganizado. Em termos de organizao o ideal seria criar um banco para cada
rea, engenharia, contabilidade, administrao, etc. E
para engenharia, por exemplo, criar esquemas para cada
subarea, custos, obras, etc. Mas no o ideal em termos
de comunicao e acesso entre todos os bancos.
Criar Esquema
Tabelas
O PostgreSQL permite adicionar privilgios por objeto
do banco: tabela, esquema, banco, etc. Em termos de segurana importante, em geral, que os privilgios sejam
adicionados ao usurio por tabela, cada tabela tendo um
dono e cada dono tendo seus especcos privilgios.
Dica de Desempenho: Na criao das tabelas alertar para
a criao de ndices para os campos envolvidos na clusula WHERE. Isso tornar essas consultas mais rpidas.
Views
Juntamente com as funes armazenadas (stored procedures) as views so boas alternativas para tornar o cdigo
mais simples e o aplicativo mais ecientes, j que parte
do processamento feito pelo cdigo agora j est pronto
e debugado no banco, o que torna o cdigo mais rpido
e eciente. O uso de views e de funes armazenadas
em bancos semelhante ao uso de funes e classes no
cdigo.
Num gerenciador do PG entra-se no banco e nesse cria-se Dica: para uso de views, sintaxe de funes internas e
o esquema.
uso de clusulas SQL no PostgreSQL, tutoriais de EMS
e vrios outros sobre PostgreSQL, alm de PHP, JaOu
vaScript, etc, conra o site abaixo: http://ribafs..net ou
CREATE SCHEMA nomeesquema;
http://ribafs.tk
Acessando Objetos de Esquemas
Criao do Banco Tutorial sobre PGAdmin para
Para acessar um esquema devemos passar seu caminho: criar o banco funcionarios.
nomeesquema.nometabela
Ou
nomebanco. nomeesquema.nometabela
Criando Tabela em Esquema
CREATE TABLE nomeesquema.nometabela (
...
)
Criando Esquema e tornando um Usurio dono
97
Captulo 49
PostgreSQL
Prtico/Apndices/Integridade Referencial
- PostgreSQL
49.1 15.3 - Integridade Referencial
- Postgresql
codigo nome_cliente
1 PostgreSQL inc.
2 RedHat inc.
Traduo livre do documentao CBT Integrity Refe- pedidos (relaciona-se Clientes pelo campo cod_cliente)
rential":
cod_pedido cod_cliente descricao
http://techdocs.postgresql.org/college/002_
Caso tentemos cadastrar um pedido com cod_cliente 2
referentialintegrity/.
ele ser aceito.
Integridade Referencial (relacionamento) onde uma inMas caso tentemos cadastrar um pedido com cod_cliente
formao em uma tabela se refere informaes em outra
3 ele ser recusado pelo banco.
tabela e o banco de dados refora a integridade.
Criando uma Chave Primria
Tabela1 ------------> Tabela2
Deve ser criada quando da criao da tabela, para garantir
Onde Utilizado?
valores exclusivos no campo.
Onde pelo menos em uma tabela precisa se referir para
CREATE TABLE clientes(cod_cliente BIGINT,
informaes em outra tabela e ambas precisam ter seus
nome_cliente VARCHAR(60) PRIMARY KEY
dados sincronizados.
(cod_cliente));
Exemplo: uma tabela com uma lista de clientes e outra
Criando uma Chave Estrangeira (Foreign Keys)
tabela com uma lista dos pedidos efetuados por eles.
o campo de uma tabela que se refere ao campo Primary
Com integridade referencial devidamente implantada
Key de outra.
nestas tabelas, o banco ir garantir que voc nunca ir
cadastrar um pedido na tabela pedidos de um cliente que O campo pedidos.cod_cliente refere-se ao campo clientes.codigo, ento pedidos.cod_cliente uma chave esno exista na tabela clientes.
trangeira, que o campo que liga esta tabela a uma outra.
O banco pode ser instrudo para automaticamente atualiCREATE TABLE pedidos(
zar ou excluir entradas nas tabelas quando necessrio.
Primary Key (Chave Primria) - o campo de uma tabela
criado para que as outras tabelas relacionadas se reram
a ela por este campo. Impede mais de um registro com
valores iguais. a combinao interna de UNIQUE e
NOT NULL.
cod_pedido BIGINT,
cod_cliente BIGINT REFERENCES clientes,
descricao VARCHAR(60)
);
99
Cuidado com excluso em cascata. Somente utilize com esta clusula no recebe nenhum parmetro.
certeza do que faz.
Exemplo: ERRO em DELETE FROM clientes WHERE
Dica: Caso desejemos fazer o relacionamento com um codigo = 2. No funcionar caso o cod_cliente em pedicampo que no seja a chave primria, devemos passar este dos contenha um valor mais antigo que codigo em cliencampo entre parnteses aps o nome da tabela e o mesmo tes.
deve obrigatoriamente ser UNIQUE.
CASCADE - Quando um registro com a chave primria
...
Captulo 50
PostgreSQL Prtico/Apndices/Dicas
Prticas de uso do SQL
50.1 15.4 - Dicas Prticas de uso do
SQL
Alguns
da
lista
de
PHP
(phpfortaleza@yahoogrupos.com.br - groups.yahoo.com).
Lembre que como uma contrib normalmente no vem Temos um campo (insumo) com valores = 1, 2, 3, ...
ligada e temos que ligar especicamente ao banco onde 87
queremos utilizar.
Queremos atualizar para 0001, 0002, 0003, ... 0087
Ligando, de dentro do banco usar o comando \i:
UPDATE equipamentos SET insumo = '000' || insumo
Acesse o diretrio lo das contribs do PostgreSQL:
WHERE LENGTH(insumo) = 1;
/usr/local/src/postgresql-8.1.3/contrib/lo
UPDATE equipamentos SET insumo = '00' || insumo
WHERE LENGTH(insumo) = 2;
Ento execute o comando make install.
Acesse o banco e:
\i /usr/local/src/postgresql-8.1.3/contrib/lo/lo.sql
(grupo,insumo,descricao,unidade)
grupo,insumo,descricao, cast(unidade
AS unidade from engenharia.apagar
AS
select
INT2)
100
101
Atravs do PHP
$conn
=
pg_connect(host=10.40.100.186
name=apoena user=_postgresql);
db-
for($x=10;$x<=87;$x++){
AS
DATE)
@numbers = (1 .. 9);
@single_chars = (a .. e);
print OUTPUT codigo INT, nome VARCHAR(10), nu- Outros usos para SHOW:
mero INT, letra CHAR(1)";
SHOW server_version;
print OUTPUT ");\n";
};
1. print OUTPUT "\n";
1. print OUTPUT "\nCREATE INDEX index- SELECT isbn, title, publication FROM editions NATUteste_codigo_index ON index_teste(codigo);\n";
RAL JOIN books AS b (book_id)
102
kernel.shmmax = 309329920
iniciar o Linux:
apenas
os
ags:
/etc/sysctl.conf
Retorna: 1244,31,1948,1949,1950,1951,1952,1953,1954,2005,2006,2011
103
SELECT '\\Barra';
Equivale a:
SELECT 'Concatenao';
Quando resolvendo expresses matemticas usar parnteses para tornar mais claras as precedncias.
Criando uma segunda tabela que conter somente os re- Variveis no psql
gistros exclusivos e ainda guarda uma cpia da tabela ori- \pset null '(nulo)' -- traduzindo null por nulo
ginal:
SELECT NULL;
CREATE TABLE cep_tabela2 AS SELECT cep, tipo,
logradouro, bairro, municipio, uf FROM cep_tabela \set variavel 14 -- Dando valor 14 varivel
GROUP BY cep, tipo, logradouro, bairro, municipio, uf SELECT :variavel;
ORDER BY cep;
COPIAR TABELA COM REGISTROS
Caso no importe qual das duplicatas ir permanecer:
CREATE TABLE tabeladestino AS SELECT * FROM
CREATE TABLE tab_temp AS SELECT DISTINCT * tabelaorigem;
FROM tabela;
Aps o que teremos que recriar as constraints.
DROP tabela;
phpPgGIS
ALTER TABLE tab_temp RENAME TO tabela;
http://www.geolivre.org.br/modules/news/
(Dica de Osvaldo Rosario Kussama na lista de PostEm mais um grande lanamento, a OpenGEO coloca
greSQL Brasil)
disposio da comunidade uma ferramenta extremaDelimitadores
mente ltil para gerncia de dados geogrcos no PostA maioria dos tipos de dados tem seus valores delimitados greSQL. O phpPgGIS mais um produto da OpenGEO
que contempla uma demanda na rea de Geotecnologias
por apstrofos (), a exemplo de:
e visa atender usurios do mundo inteiro.
caracteres
Desenvolvido com base no phpPgAdmin, o phpPgGIS
data/hora
utiliza o MapServer para visualizar o contedo espacial
dos campos do PostGIS com muita simplicidade (um climonetrio
que). Seqncias de cdigos complexos (campo de geoboleanos
metria) agora podem ser vistos num mapa.
binrios
O OpenGEO tem atuado no mercado brasileiro de Geogeomtricos
tecnologias com solues inovadoras com base em software livre e j ganhou referncia internacional com alarrays
guns importantes projetos como o Open 3D GIS e o GeA exceo para os demais tipos numricos: date oLivre Linux.
18/12/2005 numeric 12345.45
Este sistema vai integrar a soluo de Hosting que a emCaracteres Especiais
presa dever lanar nas prximas semanas.
Para poder escrever uma barra no valor de uma constante, Algumas Denies
usa-se duas barras:
104
Cursor
um ponteiro para uma linha (registro).
Replicao
a distribuio de dados corporativos para vrios locais
ou liais de uma empresa, oferecendo conabilidade, tolerncia a falhas, melhor desempenho e capacidade de
gerenciamento.
Criptograa Seu objetivo tornar os dados comuns em
bits de aparncia completamente aleatria.
MAISCULAS E MINSCULAS NO POSTGRESQL
Ao digitar nomes de tabelas e campos em Maisculas
eles sero convertidos automaticamente para minsculas,
a no ser que sejam digitados entre aspas duplas:
SELECT * FROM CLIENTES";
Recomendao: evitar o uso de maisculas e de acentos
em nomes de bancos, tabelas e campos.
POSTGRESQL NO CONECTA?
Do site do Rodrigo Hjort (http://agajorte.blogspot.com/
2009/03/meu-postgresql-nao-conecta.html)
- Pingar no IP
- Vericar o pg_hba.conf - host, banco, usurio IP e senha
- Caso aparea Is the server running on host..
- Testar com telnet IP porta (Ctrl+C para sair)
- No postgresql.conf - listen_addresses = 'IP'
- Salvar e restartar o SGBD.
Contador de Resultados
Indicado para consultas e relatrios (no grava)
CREATE TEMP SEQUENCE seq;
SELECT nexval('seq'), * FROM esquema.tabela;
(Salvador S. Scardua na lista PostgreSQL Brasil)
LIMITES DO POSTGRESQL
Tamanho de um Banco de Dados - ilimitado
Tamanho de uma tabela - 32 TB
Quantidade de registros por tabela - ilimitados
Quantidade de campos por tabela - 250 a 1600 (depende
do tipo)
Quantidade de ndices por tabela - ilimitados
Captulo 51
PostgreSQL Prtico/Apndices/Dicas
sobre Desempenho e Otimizaes do
PostgreSQL
51.1 15.5 Dicas sobre Desempenho e Otimizaes do PostgreSQL
sempenho de tabelas com grandes quantidades de registros e especialmente com muitos acessos, a incluso de
ndices estratgicos. Alm da chave primria importante inserir ndices em campos que compem a clusula WHERE, que fazem parte de clusulas ORDER BY,
GROUP BY entre outras. Em consultas com WHERE
de vrios campos usando OR, no adianta inserir ndice,
pois no ser utilizado pelo PostgreSQL, somente usando
AND.
Na prtica as informaes utilizadas com mais freqncia so colocadas prximas CPU. Quem determina que
informaes devem car nos registradores so os compiladores. Cache da CPU guarda ar informaes utilizadas
Existem duas principais formas de melhorar o desem- recentemente. O Sistema Operacional controla o que est
penho de SGBDs: uma melhorando o hardware, com armazenado na RAM e o que mandar para o disco rgido.
CPUs, RAM, Discos mais novos, rpidos e conveis. Cache e Registradores da CPU no podem ser otimizados
A outra otimizando as consultas realizadas nos bancos diretamente pelo administrador do SGBD. Efetivamente
(usando VACUUM, VACUUM ANALYZE, EXPLAIN, otimizao em bancos de dados envolvem aumento da
criando CLUSTERS, entre outros).
quantidade de informaes teis na RAM, prevenindo
Uma das medidas bsicas adotada para melhorar o de- acesso a disco sempre que possvel.
Existem dois tipos de congurao de memria no PostgreSQL, a compartilhada e a individual. A compartilhada tem um tamanho xo, ela alocada sempre que o
PostgreSQL inicializa e ento compartilhada por todos
os clientes. J a memria individual tem um tamanho
A administrao do PostgreSQL tambm muito impor- varivel e alocada separadamente para cada conexo
tante para tornar o SGBD mais eciente e rpido. Desde feita ao SGBD.
a instalao e congurao temos cuidados que ajudam a
Memria Cache Compartilhada do PostgreSQL
otimizar o PostgreSQL.
O PostgreSQL no altera as informaes diretamente no
Adaptao do Artigo sobre otimizao do PostgreSQL
disco. Ao invs disso ele solicita que os dados sejam lidos
do Diogo Biazus e do original do Bruce Momjian
da memria cache compartilhada do PostgreSQL. O cli(http://www.ca.postgresql.org/docs/momjian/hw_
ente PostgreSQL ento l e escreve os blocos e nalmente
performance).
escreve no disco.
Hardware
Clientes que precisam acessar tabelas primeiro procuram
No computador as informaes so manipuladas pelos re- pelos blocos necessrios no cache. Caso estejam a ento
gistradores da CPU, pelo cache da CPU, pela memria
105
Por exemplo queremos x MB para memria comparti- - Mover a pasta /usr/local/pgsql/data/pg_xlog para o
lhada ( x / 8 ) * 1024 = Resultado a ser congurado em /mnt/hdb
shared_buer
- Criar um link simblico para o diretrio original:
Se x = 768 MB
ln -s /mnt/hdb/pg_xlog /usr/local/pgsql/data/pg_xlog
(768 / 8) * 1024
tabelas:
107
uso da memria.
ALTER TABLE nometabela DROP CONSTRAINT no- De Shridhar Daithankar e John Berkus
meconstraint;
Shared Buers
CREATE INDEX nome_idx ON nometabela (nome- Denem um bloco de memria que o PostgreSQL usar
campo) TABLESPACE nometablespace;
para lidar com requisies que esto aguardando ateno
no buer do kernel e na CPU.
ALTER TABLE nometabela ADD CONSTRAINT
nome_pk PRIMARY KEY (nomecampo);
Deve ser manipulada com cuidado, pois simplesmente
ALTER INDEX nome_idx SET TABLESPACE nome- ampliada pode prejudicar a performance. Esta a rea
que o PostgreSQL usa atualmente para trabalhar. Ela
tablespace;
deve ser suciente para controlar a carga do servidor
Ainda podemos separar astabelas mais utilizadas para do SGBD, do contrrio o PostgreSQL ir iniciar empuro hdb, utilizando o comando tablespace no PostgreSQL rando dados para arquivos e isto ir prejudicar a perfor8.1.3 podemos fazer isso:
mance geral. Esta a principal congurao em termos
- Criar diretrio /mnt/hdb/hotcluster e tornar postgres seu de performance.
dono
Seu valor deve ser congurado tendo em vista o tamanho
CREATE TABLESPACE hotcluster OWNER postgres do conjunto de bancos que se supes que no mximo o
servidor ir carregar e da memria RAM (ter em mente
LOCATION '/mnt/hdb/hotcluster';
que a memria RAM utilizada pelos demais aplicativos
Criando um banco no novo cluster:
do servidor no estaro disponveis).
CREATE DATABASE hotbanco TABLESPACE = hot- Recomendaes:
cluster;
- Iniciar com 4MB (512) Workstation
Exportar as tabelas para este banco.
- Mdio tamanho do conjunto de bancos de dados e 256
Uso de Mais de Um Processador
a 512MB disponvel de RAM: 16-32MB (2948 a 4096)
Atualmente o PostgreSQL est otimizado para uso de v- - Grande conjunto de bancos de dados e muita memria
rios processadores, reforando que cada conexo geren- RAM disponvel (1 a 4GB): 64 256MB (8192 a 32768)
ciada por um processo diferente.
Obs.: At para um conjunto de bancos de dados (dataset)
Sistemas de Arquivos
que exceda 20GB, uma congurao de 128MB deve ser
Para sistemas BSD usa-se o tradicional UFS, que ro- muito, caso voc tenha apenas 1GB de RAM e um agresbusto, rpido e tem a vantagem em relao ao Post- sivo sistema de cache em Sistema Linux.
greSQL, de possuir os blocos de disco com um tamanho Sort Memory (Memria para Ordenao)
padro de 8KB.
Limite mximo de memria que uma conexo pode usar
Para quem utiliza Linux as sugestes vo para EXT3 e para executar sort (ordenao). Caso suas consultas usem
ReiserFS.
as clusulas ORDER BY ou GROUP BY que ordenem
grandes conjuntos de dados, incrementar este parmetro
Checkpoints
dever ajudar.
O wal_les o parmetro do postgresq.lconf que determina o nmero de arquivos usados pelo PostgreSQL para Uma Recomendao:
armazenar os logs de transao. Estes arquivos focam em Ajustar o parmetro por conexo como e quando precisar:
pg_xlog, na pasta de dados.
pouca para consultas mais simples e muita para consultas
Para que apaream as datas e horas nos arquivos de logs complexas e para dumps de dados.
usa-se no postgresql.conf:
Eective Cache Size (Tamanho do Cache Efetivo)
log_timestamp = true
Permite ao PostgreSQL fazer melhor uso da RAM dispoPara reduzir a freqncia dos checkpoints devemos au- nvel no servidor.
mentar o parmetro do postgresql.conf:
Exemplo:
checkpoint_segments = 3 (valor default)
Caso exista 1,5GB de RAM na mquina, shared buers
O PostgreSQL no precisa de muito ajuste. Boa parte dos deve ser ajustado para 32MB e eective cache size para
parmetros automaticamente ajustada para uma perfor- 800MB.
mance tima. O cache size e sort size so dois parmetros Fsync and the WAL les (Fsync e arquivos de WAL)
que o administrador pode controlar para ter um melhor
max_fsm_pages
print OUTPUT COPY index_teste (codigo, nome, nuPostgreSQL grava espao livre em cada uma de suas p- mero, letra) FROM stdin;\n";
ginas de dados.
while ($count <= $totalrecords){
Caso tenha um banco que usa muitos updates e deletes, $randstring = join("", @chars [map{rand @chars} ( 1 .. 8
que ir gerar registros mortos, devido ao sistema MVCC ) ]); $randnum = join("", @numbers [map{rand @numdo PostgreSQL, ento expanda o FSM para cobrir todos bers} ( 1 .. 8 ) ]); $randletter = join("", @single_chars
estes registros deads (mortos) e nunca mais precisar ro- [map{rand @single_chars} (1)]); print OUTPUT
dar vacuum full a no ser em feriados.
#print OUTPUT INSERT INTO index_teste VALUES($count,'$randstring',$randnum,'$randletter');\n";
O mnimo FSM max_fsm_relations * 16.
$count."\t.$randstring."\t.$randnum."\t.$randletter."\n";
max_fsm_relations
$count++;
Diz quantas tabelas devem ser localizadas no mapa de es- };
pao livre.
wal_buers
Esta congurao decide a quantidade de buers WAL
(Write Ahead Log) que pode ter.
Para chegar a uma quantidade tima experimente e decida.
Um bom incio est em torno de 32 a 64 correspondendo
a 256-516 KB de memria.
Ativar o subprocesso do auto Vacuum
Captulo 52
PostgreSQL Prtico/Exerccios
52.1 16 Exerccios
);
3)
Exemplo Prtico
Vamos criar um banco (clientes_ex), contendo uma tabela (cliente) e um usurio (operador) que ter apenas alguns privilgios de acesso tabela cliente (INSERT, SELECT, UPDATE) e ser obrigado a utilizar senha. Veja
que no ter privilgio DELETE. Ento adicionar alguns
registros e executar consultas dos quatro tipos: INSERT,
SELECT, UPDATE e DELETE (este apenas para vericar se realmente ele no tem este privilgio).
1)
RESET CLIENT_ENCODING;
4)
ALTER DATABASE clientes_ex SET DATESTYLE = Fazer o login como usurio operador para executar as
SQL, DMY;
consultas abaixo:
-- No caso este banco apenas car com esta congurao INSERT INTO cliente (codigo, nome, data_nasc, bonus,
de data
observacao) VALUES (1, 'Joo Pedro', '01/01/1967',
-- Para alterao denitiva para todos os bancos alterar o 18.35, 'Apenas um texto de teste');
script postgresql.conf.
INSERT INTO cliente (codigo, nome, data_nasc, bonus, observacao) VALUES (2, 'Pedro Paulo Rosado',
Exibindo o DateStyle Atual
'04/11/1973', 25.35, );
SHOW DATESTYLE;
INSERT INTO cliente (codigo, nome, data_nasc, bonus,
2)
observacao) VALUES (3, 'Jos Roberto', '25/06/1938',
12.65, NULL);
CREATE TABLE cliente (
codigo INT PRIMARY KEY,
nome VARCHAR(40) NOT NULL,
data_nasc DATE NOT NULL,
bonus NUMERIC(12,2),
observacao TEXT
109
110
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,
Captulo 53
PostgreSQL Prtico/Referncias
53.1 17 - Referncias
Mais
um
bom
artigo
do
F- - Cadastro e Descadastro em Uma das Vrias Listas
bio
Telles
http://savepoint.blog.br/ http://www.postgresql.org/community/lists/subscribe
coisas-do-postgresql-que-fazem-falta-no-oracle/
Busca nos Arquivos das Listas do PostgreSQL
Comparison of dierent SQL implementations - http:
http://archives.postgresql.org/index.php?adv=1
//troels.arvin.dk/db/rdbms/
- Lista da Comunidade Brasileira
Site Ocial
http://pgfoundry.org/mailman/listinfo/brasil-usuarios/
Site ocial http://www.postgresql.org
Lista de Discusso no Yahoo
Site da comunidade brasileira http://www.postgresql.
http://br.groups.yahoo.com/group/postgresql-br/ Para se
org.br
cadastrar acesse o site acima e faa o cadastro.
Documentao Ocial
PostgreSQL Users Groups Site http://pugs.postgresql.
Online - http://www.postgresql.org/docs/8.1/interactive/
org/
index.html (Com busca)
IRC
PDF - http://www.postgresql.org/files/documentation/
http://www.postgresql.org/community/irc Existe um capdf/8.1/postgresql-8.1-A4.pdf
nal brasileiro
Brasil - Online - http://pgdocptbr.sourceforge.net/pg80/
Sites do PostgreSQL em vrios pases
index.html
Brasil - PDF - http://ufpr.dl.sourceforge.net/ http://www.postgresql.org/community/international
sourceforge/pgdocptbr/pgdocptbr800-pdf-1.1.zip
Empresas que utilizam PostgreSQL
Brasil - PDF Tutorial - http://www.pythonbrasil.com.br/ http://www.postgresql.org/about/casestudies/
moin.cgi/NabucodonosorCoutinho?action=AttachFile&
Featured Users (Usurios Caracterizados)
do=get&target=tutorial_pg.pdf.tar.gz
PostgreSQL Technical Documentation - http://techdocs. Esto aqui algumas das centenas das companhias que
construram produtos, solues, web sites e ferramentas
postgresql.org/
usando o PostgreSQL
Livros (E-books grtis)
112
53.1. 17 - REFERNCIAS
113
http://www.postgresql.org/about/users
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
- PG Conguration - http://postgresql.boeldt.net/
postgres-linux-configuration.asp
Cursos
- 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/
115
Texto
116
53.2.2
117
Imagens
53.2.3
Licena