Contedo
1
Introduo
1.1
1 - Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Instalao
2.1
2 - Instalao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
No Linux
3.1
3.2
Instalao no Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
No Windows
4.1
2 Instalao no Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
DDL
5.1
9
3 - DDL (Data Denition Language) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
16
18
DML
22
9.1
22
10 Consultas
23
10.1 DML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
23
10.2 Consultas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
23
26
11 Consultas Join
11.1 4.2 - Junes de Tabelas ou Consultas
27
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
27
28
29
29
29
ii
CONTEDO
12 Sub Consultas
31
31
33
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14 Strings
33
34
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15 Matemticas
34
36
36
37
16 Agrupamento
38
39
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19 Converso de Tipos
41
42
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
42
44
44
45
45
47
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
23 Triggers
47
49
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
24 DCL
49
51
. . . . . . . . . . . . . . . . . . . . . . . . .
27 Administrao
39
41
26.1 8 Transaes
38
51
52
52
54
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
54
56
CONTEDO
iii
27.1 9 - Administrao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
28 Backup e Restore
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 Replicao
65
32.1 10 - Replicao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
65
66
33 Conguraes
33.1 11 - Conguraes
67
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
34 Congurar acessos
68
68
71
71
73
67
73
79
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
38 Ferramentas
38.1 14 - Ferramentas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
79
81
81
iv
CONTEDO
39 psql
82
84
82
84
85
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
42 EMS PostgreSQL
86
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
43 Azzurry Clay
86
88
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
44 dbVisualizer
88
89
85
89
90
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
46 Apndices
91
46.1 15 - Apndices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
47 Planejamento e Projeto de Bancos de Dados
47.1 15.1 Planejamento e Projeto de Bancos de Dados
91
92
. . . . . . . . . . . . . . . . . . . . . . . . .
90
92
95
95
98
98
100
105
109
112
CONTEDO
Captulo 1
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
CAPTULO 1. INTRODUO
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
Instalao
2.1 2 - Instalao
1. No Linux
2. No Windows
Captulo 3
No Linux
O PostgreSQL roda em uma conta de usurio, chamada
de postgres. Esta conta no a mesma dos utilizadores
das bases de dados: os usurios da base de dados devem
ser criados pelo prprio PostgreSQL.
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):
Depois execute:
Vrias distribuies j contam com binrios para instalao do PostgreSQL (Ubuntu, Debian, Slackware, source /etc/prole
RedHat, Fedora, etc).
Agora o postgres est no path.
Em uma instalao padro do Ubuntu veja o que precisa Ps Instalao (sh, bash, ksh e zsh):
para instalar os fontes:
LD_LIBRARY_PATH=/usr/local/pgsql/lib
Antes de instalar:
LD_LIBRARY_PATH
export
CAPTULO 3. NO LINUX
Aps a instalao est criado o agrupamento principal Ento instale a nova verso, crie o diretrio de dados e
(cluster main) de bancos de dados do PostgreSQL.
einicie o novo servidor.
Caso no se tenha conana nos usurios locais reco- /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
mendvel utilizar a opo -W, --pwprompt ou pwle do /usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/data
initdb, que atribuir uma senha ao superusurio.
Finalmente, restore seus dados usando o novo servidor
No arquivo pg_hba.conf utilizar autenticao tipo md5, com:
password ou cript, antes de iniciar o servidor pela pri/usr/local/pgsql/bin/psql -d postgres -f bancos.sql
meira vez.
Quando o programa que inicia o servidor (postmaster)
est em execuo, criado um PID e armazenado dentro
do arquivo postmaster.pid, dentro do subdiretrio data.
Ele impede que mais de um processo postmaster seja executado usando o mesmo cluster e diretrio de dados.
Baixar PostgreSQL via Anonymous CVS:
Baixar CVS de - http://www.nongnu.org/cvs/
Instalar e Logar com qualquer senha:
Sugesto de Padro
Nomes de bancos no plural
Exemplo:
banco clientes
tabela - cliente
Criar Novo Cluster
/usr/local/pgsql e seus dados no sub diretrio data. Caso Caso sinta necessidade pode criar outros clusters, especialmente indicado para grupos de tabelas com muito
contrrio faa os devidos ajustes.
acesso.
1 Ateno para que seus bancos no estejam recebendo
atualizao durante o backup. Se preciso proba acesso O comando para criar um novo cluster na verso atual
(8.1.3) do PostgreSQL :
no pg_hba.conf.
2 Efetuando backup:
pg_dumpall > bancos.sql .Para preservar os OIDs use a
opo -o no pg_dumpall.
3 Pare o servidor
pg_ctl stop ou outro comando
Caso queira instalar a nova verso no mesmo diretrio da
anterior
mv /usr/local/pgsql /usr/local/pgsql.old
Captulo 4
No Windows
4.1 2 Instalao no Windows
Instalao no Windows XP
- Caso precise acessar sua mquina de outra remota marLembrar que: Precisa instalar em sistema de arquivos que Endereos
NTFS e no instala no XP Start Edition (onde falta su- - Em Locale selecione Portugus Brasil
porte a redes).
- Em Codicao selecione LATIN1
- Fazer download do site ocial (www.postgresql.org)
- Entre com uma senha e repita. Altere o usurio se for o
(hoje postgresql-8.2.zip)
caso e Prximo.
- Executar o arquivo postgresql-8.1.msi
- Na tela Habilitar Linguagens Procedurais deixe mar- Selecionar idioma e Start. Depois em Prximo.
cada PL/pgsql (caso pretenda utilizar) e Prximo
- Na tela Informaes de Instalao existem muitas in- - Na tela Habilitar Mdulos Contrib marque os desejaformaes importantes:
dos e Prximo
- Sugere a leitura da FAQ
- Na tela Habilitar PostGIS em templae1 marque so- Fala das licenas dos diversos softwares a serem insta- mente se precisar que todos os bancos tragam o PostGIS
e Prximo e Prximo novamente.
lados
- As verses 95, 98 e Me do Windows no so suportadas - Aps instalar, na tela Instalao concluda
recomenda-se que voc se cadastrar na lista pgsqlpelo PostgreSQL
announce, que envia informaes semanais sobre novas
- Usar obrigatoriamente em sistema de arquivos NTFS
verses e correes de erros. Basta clicar no boto, fazer
- Instalar como servio (mesmo que deixe como manual) o cadastro e Concluir.
- O PostgreSQL no executa com usurio que tenha privilgios de administrador
- Os drivers jdbc esto no subdiretrio \jdbc, que deve
ser adicionada ao CLASSPATH
- Na Tela Opes de Instalao marque:
- Suporte para idioma nativo (importante para ter as mensagens em pt_BR)
- E outros que considere importantes e clique em Prximo
- Na tela Congurao do Servio":
- Poder optar por instalar como servio ou no. Como
servio mais prtico. Clique em Prximo (ele criar
uma senha)
- Obs.: Caso j tenha instalado o PostgreSQL antes nesta
mquina dever remover o usurio postgres antes de
continuar:
- Painel de controle - Ferramentas administrativas - Gerenciamento do computador - Usurios e grupos locais Usurios. Remova o postgres
8
Captulo 5
DDL
5.1 3 - DDL (Data Denition Language)
1. Criao e Excluso de Bancos, Esquemas, Tabelas,
Views, Constraints, etc
2. Alteraes nos objetos dos bancos
3. ndices, Tipos de Dados e Integridade Referencial
Captulo 6
Nomes de Identicadores
\l - - No psql
Utiliza-se por conveno as palavras chaves do SQL em psql -l (no prompt)
maisculas e os identicadores dos objetos que criamos
SELECT datname FROM pg_database;
em minsculas.
Identicadores digitados em maisculas sero gravados Quando se cria um novo banco de dados sem indicar o
modelo, o que de fato estamos fazendo clonar o banco
em minsculas, a no ser que venham entre aspas .
de dados template1.
Revises da Linguagem SQL
Criar um banco para outro usurio:
SQL 1989
CREATE DATABASE nomebanco OWNER nomeuser;
SQL 1992
createdb -O nomeusuario nomebanco
SQL 1999
Obs.: requer ser superusurio para poder criar banco para
SQL 2003
outro usurio.
Divises da SQL
Criar Tabela
DML Linguagem de Manipulao de Dados
])
Sintaxe:
Criar Banco
banco=# \h create database
10
11
[ WITH OIDS | WITHOUT OIDS ]
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.
);
);
produto_no integer, descricao text, preco numeric DE- CREATE TABLE exemplo (
FAULT 9.99
a integer,
);
12
b integer,
c integer,
UNIQUE (a, c)
);
Chave Estrangeira (Foreign Key)
Criadas com o objetivo de relacionar duas tabelas,
mantendo a integridade referencial entre ambas. Especica que o valor da coluna (ou grupo de colunas) deve
);
corresponder a algum valor existente em um registro
CREATE TABLE produtos (
da outra tabela. Normalmente queremos que na tabela
estrangeira existam somente registros que tenham um
cod_prod integer CONSTRAINT unq_cod_prod UNI- registro relacionado na tabela principal. Como tambm
QUE,
controla a remoo de registros na tabela principal que
nome text,
tenha registros relacionados na estrangeira.
preco numeric
Tabela principal
);
Evitando duplicao com nulos:
create table teste(
id serial not null,
parent integer null,
component integer not null
);
postgres=# create unique index naoduplic on teste using
btree (component) where (parent is null);
Chaves Primrias (Primary Key)
A chave primria de uma tabela formada internamente
pela combinao das constraints UNIQUE e NOT
NULL. Uma tabela pode ter no mximo uma chave
primria. A teoria de bancos de dados relacional dita que
toda tabela deve ter uma chave primria. O PostgreSQL
no obriga que uma tabela tenha chave primria, mas
recomendvel, a no ser que esteja criando uma tabela
para importar de outra que contenha registros duplicados
para tratamento futuro ou algo parecido ou apenas para
testes.
CREATE TABLE produtos (
cod_prod integer UNIQUE NOT NULL,
nome text,
preco numeric
);
CREATE TABLE produtos (
cod_prod integer PRIMARY KEY,
nome text,
preco numeric
);
Composta (formada por mais de um campo)
CREATE TABLE exemplo (
a integer,
b integer,
c integer,
PRIMARY KEY (a, c)
13
Para simular a constraint enum do MySQL, podemos DROP SCHEMA nomeesquema;
usar a constraint check.
Aqui, quando o esquema tem tabelas em seu interior, no
Dica do site PostgreSQL & PHP Tutorials.
possvel apagar dessa forma, temos que utilizar:
DROP SCHEMA nomeesquema CASCADE;
Que apaga o esquema e todas as suas tabelas, portanto
CREATE TABLE pessoa(
muito cuidado.
codigo int null primary key,
cor_favorita varchar(255) not null,
check (cor_favorita IN ('vermelha', 'verde', 'azul'))
);
INSERT INTO pessoa (codigo, cor_favorita) values (1,
'vermelha'); -- OK
INSERT INTO pessoa (codigo, cor_favorita) values (1,
'amarela'); -- Erro, amarelo no consta
Herana
Podemos criar uma tabela que herda todos os campos de
outra tabela existente.
CREATE TABLE cidades (
nome text,
populacao oat,
altitude int -- (em ps)
);
CREATE TABLE capitais (
estado char(2)
) INHERITS (cidades);
capitais assim passa a ter tambm todos os campos da
tabela cidades.
Segundo uma entrevista (vide DBFree Magazine No. 2)
com a equipe de desenvolvimento do PostgreSQL, evite
utilizar herana de tabelas.
Esquemas (Schema)
\dn visualizar esquemas
Um banco de dados pode conter vrios esquemas e dentro de cada um desses podemos criar vrias tabelas. Ao
invs de criar vrios bancos de dados, criamos um e criamos esquemas dentro desse. Isso permite uma maior
exibilidade, pois uma nica conexo ao banco permite
acessar todos os esquemas e suas tabelas. Portanto devemos planejar bem para saber quantos bancos precisaremos, quantos esquemas em cada banco e quantas tabelas
em cada esquema.
Cada banco ao ser criado traz um esquema public, que
onde cam todas as tabelas, caso no seja criado outro
esquema. Este esquema public no padro ANSI. Caso
se pretenda ao portvel devemos excluir este esquema public e criar outros. Por default todos os usurios criados
tem privilgio CREATE e USAGE para o esquema public.
Criando Um Esquema
CREATE SCHEMA nomeesquema;
Excluindo Um Esquema
SELECT current_schema();
SELECT current_schemas(true);
SELECT current_schemas(false);
Vises (views)
\dp visualizar views e outros objetos
Que so VIEWS?
So uma maneira simples de executar e exibir dados selecionados de consultas complexas em bancos. Em que
elas so teis? Elas economizam grande quantidade de
digitao e esforo e apresentam somente os dados que
desejamos.
Criando Uma View
CREATE VIEW recent_shipments
AS
SELECT
count(*)
AS
num_shipped,
max(ship_date), title FROM shipments JOIN editions
USING (isbn) NATURAL JOIN books AS b (book_id)
GROUP BY b.title ORDER BY num_shipped DESC;
Usando Uma View
SELECT * FROM recent_shipments;
SELECT * FROM recent_shipments
ORDER BY max DESC LIMIT 3;
Destruindo Uma View
DROP VIEW nomeview;
14
SELECT cidade, temp_min, temp_max, prcp, data, localizacao FROM clima, cidades WHERE cidade = nome;
);
clientid int CONSTRAINT client_contact_check REFEAs vises podem ser utilizadas em praticamente todos os
RENCES client(clientid),
lugares onde uma tabela real pode ser utilizada. Construir
name VARCHAR(255),
vises baseadas em vises no raro.
phone VARCHAR(255),
RULES
fax VARCHAR(255),
emailaddress VARCHAR(255)
);
CREATE VIEW client_contact_list AS
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;
15
lean). A expresso condicional no pode fazer referncia testes=# DROP DATABASE template1;
a nenhuma tabela, exceto NEW e OLD, e no pode con- testes=# CREATE DATABASE template1 TEMPLATE
ter funes de agregao.
template0 ENCODING 'latin1';
INSTEAD
testes=# \c template1
INSTEAD indica que os comandos devem ser executados template1=# VACUUM FULL FREEZE;
em vez dos (instead of) comandos originais.
template1=# VACUUM FULL;
ALSO
template1=# UPDATE pg_database SET datistemALSO indica que os comandos devem ser executados adiplate=true WHERE datname='template1';
cionalmente aos comandos originais. Se no for especiAgora temos um template1 original e limpo.
cado nem ALSO nem INSTEAD, ALSO o padro.
comando
O comando ou comandos que compem a ao da regra.
Os comandos vlidos so SELECT, INSERT, UPDATE,
DELETE e NOTIFY.
Dentro da condio e do comando, os nomes especiais de
tabela NEW e OLD podem ser usados para fazer referncia aos valores na tabela referenciada. O NEW vlido
nas regras ON INSERT e ON UPDATE, para fazer referncia nova linha sendo inserida ou atualizada. O OLD
vlido nas regras ON UPDATE e ON DELETE, para
fazer referncia linha existente sendo atualizada ou excluda.
Obs.: necessrio possuir o privilgio RULE na tabela
para poder denir uma regra para a mesma.
Exemplos:
CREATE RULE me_notique AS ON UPDATE TO datas DO ALSO NOTIFY datas;
CREATE RULE r1 AS ON INSERT TO TBL1 DO
(INSERT INTO TBL2 VALUES (new.i); NOTIFY
TBL2);
CREATE RULE "_RETURN AS ON SELECT TO minha_viso DO INSTEAD
SELECT * FROM minha_tabela; -- Ao invs de selecionar da viso seleciona da tabela.
Banco de dados modelo intocado
Existe um modelo de banco de dados que sempre se preserva original, que o template0. O template template1
pode incorporar objetos e acaba algumas vezes cando
invivel seu uso como modelo. Quando isso acontece podemos substitui-lo com uma cpia do template0.
Criando banco de dados baseado em outro modelo
CREATE DATABSASE nomebanco TEMPLATE template0;
createdb -T template0 nomebanco
Recriando o template1
\c testes
postgres=# UPDATE pg_database SET datistemplate=false WHERE datname='template1';
Captulo 7
ALTER TABLE produtos ADD COLUMN descricao Setar/Remover Valor Default de Campo
text;
ALTER TABLE tabela ALTER COLUMN campo SET
Remover Campo
DEFAULT valor;
ALTER TABLE tabela DROP COLUMN campo;
ALTER TABLE produtos DROP COLUMN descricao;
ALTER TABLE produtos DROP COLUMN descricao ALTER TABLE produtos ALTER COLUMN preco
SET DEFAULT 7.77;
CASCADE; -- Cuidado com CASCADE
ALTER TABLE tabela ALTER COLUMN campo
Adicionar Constraint
DROP DEFAULT;
ALTER TABLE tabela ADD CONSTRAINT nome;
ALTER TABLE produtos ALTER COLUMN preco
ALTER TABLE produtos ADD COLUMN descricao DROP DEFAULT;
text CHECK (descricao <> );
Adicionar/Remover NOT NULL
ALTER TABLE produtos ADD CHECK (nome <> );
ALTER TABLE produtos ALTER COLUMN cod_prod
ALTER TABLE produtos ADD CONSTRAINT uni- SET NOT NULL;
que_cod_prod UNIQUE (cod_prod);
ALTER TABLE produtos ALTER COLUMN cod_prod
ALTER TABLE produtos ADD FOREIGN KEY DROP NOT NULL;
(cod_produtos) REFERENCES grupo_produtos;
Renomear Tabela
ALTER TABLE produtos ADD CONSTRAINT vendas_fk FOREIGN KEY (cod_produtos) REFERENCES ALTER TABLE tabela RENAME TO nomenovo;
ALTER TABLE produtos RENAME TO equipamentos;
produtos (codigo);
Remover Constraint
ALTER TABLE produtos ADD CONSTRAINT produALTER TABLE produtos DROP CONSTRAINT pro- tos_pk PRIMARY KEY (codigo);
dutos_pk;
ALTER TABLE vendas ADD CONSTRAINT vendas_fk FOREIGN KEY (codigo) REFERENCES produALTERAR VALOR DEFAULT DE CAMPO:
tos(codigo_produto);
Mudar Tipo de Dados de Campo (S >=8.0):
ALTER TABLE vendas ADD CONSTRAINT venALTER TABLE tabela ALTER COLUMN campo das_fk FOREIGN KEY (codigo) REFERENCES produTYPE tipo;
tos; -- Neste caso usa a chave primria da tabela produtos
ALTER TABLE produtos ALTER COLUMN preco Remover Constraint (Restrio) ALTER TABLE produTYPE numeric(10,2);
16
17
tos DROP CONSTRAINT produtos_pk;
ALTER TABLE vendas DROP CONSTRAINT vendas_fk;
Captulo 8
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.
Hash ->indicados para consultas com comparaes de
18
19
igualdade simples. desencorajado seu uso. Em seu lu- ndice Funcional
gar recomenda-se o B-tree. GiST ->
CREATE INDEX nomeindice ON tabela (lower (nomeCriando ndices de tipos diferentes:
campo));
CREATE INDEX nome ON tabela USING tipo timo artigo no iMasters
(campo);
http://www.imasters.com.br/artigo.php?cn=1897&cc=
tipo: BTREE, RTREE, HASH, GIST
23
Obs.: Somente os tipos B-tree e GiST suportam ndices
com vrias colunas. ndices com mais de um campo somente ser utilizado se as clusulas com os campos indexados forem ligados por AND. Um ndice com mais de 3
campos dicilmente ser utilizado.
ndice Parcial
http://www.imasters.com.br/artigo.php?cn=1922&cc=
23
http://www.imasters.com.br/artigo.php?cn=1959&cc=
23
Vide manual ocial, captulo 11 para detalhes.
Boleanos
Criado apenas sobre um subconjunto dos registros de
uma tabela, denido numa expresso durante a criao Representaes:
do ndice parcial. um recurso para melhorar o desem- 't', 'true', 'y', 'yes e '1'
penho dos ndices, j que atualiza somente parte dos reFALSE
gistros.
Obs.: na maioria dos casos a vantagem de um ndice par- Representaes:
cial sobre um ndice integral no muita.
Exemplos:
Apenas um dos dois estados. O terceiro estado, desconhecido, representado pelo NULL.
Retorno:
- FOREIGN KEY
a|b
- ORDER BY
---+---------
- WHERE
- ON
- GROUP BY
- HAVING
Exemplos prtico da vantagem do ndice
Obs.: Para campos tipo data que permitam NULL, devemos prever isso na consulta SQL e passar NULL sem
delimitadores e valores no NULL com delimitadores.
bit, bit varying, boolean, char, character varying, characALTER TABLE cep_tabela ADD CONSTRAINT ter, varchar, date, double precision, integer, interval, numeric, decimal, real, smallint, time (com ou sem zona
cep_pk PRIMARY KEY (cep);
horria), timezone (com ou sem zona horria).
A mesma consulta anterior agora gasta apenas 10 ms.
O tipo NUMERIC pode realizar clculos exatos. RecoIsso num AMD Duron 1300, 128MB de RAM).
20
21
SELECT
name
FROM
sal_emp
pay_by_quarter[1] <> pay_by_quarter[2];
WHERE
Captulo 9
DML
9.1 4 - DML (Data Manipulation
Language)
1. Consultas (select, insert, update e delete)
2. Consultas Join
3. Sub Consultas
22
Captulo 10
Consultas
10.1 DML
10.2 Consultas
- simples e claras
24
psql
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
Consultas Join
11.1 4.2 - Junes de Tabelas ou
Consultas
As junes SQL so utilizadas quando precisamos sele- Exemplo (voltar todos somente de pessoal):
cionar dados de duas ou mais tabelas.
SELECT p.siape, p.nome, l.lotacao FROM pessoal p
Existem as junes com estilo non-ANSI ou theta (juno LEFT JOIN lotacoes l ON p.siape = l.siape ORDER BY
com WHERE).
p.siape;
E as junes ANSI join (com JOIN). As junes ANSI Veja que pessoal ca esquerda em FROM pessoal p
podem ser de dois tipos, as INNER JOINS e as OUTER LEFT JOIN lotacoes l.
JOINS. A padro a INNER JOIN. INNER JOIN pode
RIGHT OUTER JOIN
ser escrito com apenas JOIN.
Inverso do LEFT, este retorna todos os registros somente
Exemplo ANSI:
da tabela da direita (right). Primeiro, realizada uma
SELECT p.siape, p.senha, l.lotacao FROM pessoal p juno interna. Depois, para cada linha de T2 que no
CROSS JOIN lotacoes l;
satisfaz a condio de juno com nenhuma linha de T1,
adicionada uma linha juntada com valores nulos nas coTipos de Junes
lunas de T1. o oposto da juno esquerda: a tabela reINNER JOIN - Onde todos os registros que satisfazem sultante possui, incondicionalmente, uma linha para cada
condio sero retornados.
linha de T2.
Exemplo:
Exemplo (retornar somente os registros de lotacoes):
SELECT p.siape, p.nome, l.lotacao FROM pessoal p IN- SELECT p.siape, p.nome, l.lotacao FROM pessoal p
NER JOIN lotacoes l ON p.siape = l.siape ORDER BY RIGHT JOIN lotacoes l ON p.siape = l.siape ORDER
p.siape;
BY p.nome;
Exemplo no estilo theta:
FULL OUTER JOIN
SELECT p.siape, p.nome, l.lotacao FROM pessoal p, lo- Primeiro, realizada uma juno interna. Depois, para
tacoes l WHERE p.siape = l.siape ORDER BY p.siape; cada linha de T1 que no satisfaz a condio de juno
OUTER JOIN que se divide em LEFT OUTER JOIN e com nenhuma linha de T2, adicionada uma linha juntada com valores nulos nas colunas de T2. Tambm, para
RIGHT OUTER JOIN
cada linha de T2 que no satisfaz a condio de juno
LEFT OUTER JOIN ou simplesmente LEFT JOIN - Socom nenhuma linha de T1, adicionada uma linha junmente os registros da tabela da esquerda (left) sero retada com valores nulos nas colunas de T1.
tornados, tendo ou no registros relacionados na tabela
E tambm as:
da direita.
Primeiro, realizada uma juno interna. Depois, para
cada linha de T1 que no satisfaz a condio de juno
com nenhuma linha de T2, adicionada uma linha juntada com valores nulos nas colunas de T2. Portanto, a tabela juntada possui, incondicionalmente, no mnimo uma
linha para cada linha de T1.
LIMIT (limite) juntamente com OFFSET (deslocaA tabela esquerda do operador de juno exibir cada mento) permite dizer quantas linhas desejamos retornar
um dos seus registros, enquanto que a da direita exibir da consulta. Podemos retornar desde apenas uma at to27
28
das.
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
Sub Consultas
12.1 4.3 Sub consultas
ANY/SOME
Subconsulta escalar um comando SELECT comum, entre parnteses, que retorna exatamente um registro, com CASE WHEN
um campo.
EXEMPLO1
select nome, (select max(preco) from produtos where create table amigos( codigo serial primary key, nome
codigo=1) as maior preo from produtos; SELECT char(45), idade int );
* FROM tabela1 WHERE tabela1.col1 = (SELECT
col2 FROM tabela2 WHERE col2 = valor); SELECT insert into amigos (nome, idade) values ('Joo Brito', 25);
name FROM customer WHERE customer_id NOT IN insert into amigos (nome, idade) values ('Roberto', 35);
( SELECT customer_id FROM salesorder ); SELECT insert into amigos (nome, idade) values ('Antnio', 15);
'test' AS test, id FROM (SELECT * FROM books) AS insert into amigos (nome, idade) values ('Francisco Queiexample_sub_query; SELECT rstname, state, CASE roz', 23); insert into amigos (nome, idade) values ('BerWHEN state = 'PA' THEN 'close' WHEN state = 'NJ' nardo dos Santos, 21); insert into amigos (nome, idade)
OR state = 'MD' THEN 'far' ELSE 'very far' END AS values ('Francisca Pinto', 22); insert into amigos (nome,
idade) values ('Natanael', 55);
distance FROM friend;
select nome, idade, case when idade >= 21 then 'Adulto'
else 'Menor' end as status from amigos order by nome;
Expresses de Sub Consultas
-- CASE WHEN cria uma coluna apenas para exibio
EXISTS
CREATE TEMPORARY TABLE alimentos (id SERIAL PRIMARY KEY, nome TEXT); INSERT INTO
alimentos VALUES (DEFAULT, 'ma'); INSERT
select nome, estado, case when estado = 'PB' then 'FeINTO alimentos VALUES (DEFAULT, 'espinafre');
chado' when estado = 'CE' or estado = 'SP' then 'FunciSELECT nome, CASE WHEN EXISTS (SELECT nome onando' when estado = 'MA' then 'Funcionando a todo
FROM frutas WHERE nome=a.nome) THEN 'sim' vapor' else 'Menor' end as status from amigos order by
ELSE 'no' END AS fruta FROM alimentos a;
nome;
IN
Mostrar cada nota junto com a menor nota, a maior nota,
SELECT nome, CASE WHEN nome IN (SELECT nome e a mdia de todas as notas.
FROM frutas) THEN 'sim' ELSE 'no' END AS fruta SELECT nota, (SELECT MIN(nota) FROM notas) AS
FROM alimentos;
menor, (SELECT MAX(nota) FROM notas) AS maior,
(ROUND(SELECT AVG(nota) FROM notas)) AS meNOT IN
31
32
dia FROM notas;
Captulo 13
Funes Internas
13.1 5 - Funes Internas
1. Strings
2. Matemticas
3. Agrupamento (Agregao)
4. Data e Hora
5. Formatao de Tipos de Dados
6. Converso de Tipos (CAST)
33
Captulo 14
Strings
14.1 5.1 Funes de Strings
Braso
SELECT TRANSLATE('Brasileiro', 'eiro', 'eira');
SELECT LOWER('UNIFOR');
Converter para maisculas
SELECT UPPER('universidade');
Posio de caractere
SELECT POSITION ('@' IN 'ribafs@gmail.com'); -SELECT SPLIT_PART( 'PostgreSQL', 'gre', 1); - Retorna 7
Retorna Post
Ou SELECT STRPOS('Ribamar' ,'mar'); - - Retorna 5
<------gre----->
Substring
Iniciais Maisculas
SUBSTRING(string [FROM inteiro] [FOR inteiro])
INITCAP(text) - INITCAP ('ol mundo') - - Ol Mundo
SELECT SUBSTRING ('Ribamar FS' FROM 9 FOR
Remover Espaos em Branco
10); - - Retorna FS
TRIM ([leading | trailing | both] [characters] from string)SUBSTRING(string FROM padro);
remove caracteres da direita e da esquerda. trim (both 'b'
SELECT SUBSTRING ('PostgreSQL' FROM '.......'); - - from 'babacatebbbb'); - - abacate
Retorna Postgre
RTRIM (string text, chars text) - Remove os caracteres
SELECT SUBSTRING ('PostgreSQL' FROM '...$'); - - chars da direita (default espao)
Retorna SQL
rtrim('removarrrr', 'r') - - remova
Primeiros ....... e ltimos ...$
LTRIM - (string text, chars text) - Remove os caracteres
Ou
chars da esquerda
SUBSTR ( 'string', inicio, quantidade);
ltrim('abssssremova', 'abs) - - remova
SELECT SUBSTR ('Ribamar', 4, 3); - - Retorna mar
http://pgdocptbr.sourceforge.net/pg80/functions-string.
html
35
Captulo 15
Matemticas
15.1 5.2 Funes Matemticas
Operadores Matemticos
RADIANS(valor) - converte valor de graus para radianos NULL com NULL -- Unknown
RANDOM() - valor aleatrio entre 0 e 1
CONVERSO DE/PARA NULL
ROUND(numeric) - arredonda para o inteiro mais pr- NULLIF() e COALESCE()
ximo
NULLIF(valor1, valor2)
ROUND(v, d) - arredonda v com d casas decimais
NULLIF Retorna NULL se, e somente se, valor1 e vaSIGN(numeric) - retorna o sinal da entrada, como 1 ou lor2 forem iguais, caso contrrio retorna valor1.
+1
Algo como:
SQRT(X) - Raiz quadrada de X
if (valor1 == valor2){
TRUNC (numeric) - trunca para o nenhuma casa decimal
then NULL
TRUNC (v numeric, s int) - trunca para s casas decimais
else valor1;
Operadores Lgicos:
Retorna valor1 somente quando valor1 == valor2.
AND, OR e NOT. TRUE, FALSE e NULL
COALESCE retorna o primeiro de seus argumentos
Operadores de Comparao:
que no for NULL. S retorna NULL quando todos os
seus argumentos forem NULL.
<, >, <=, >=, =, <> ou !=
a BETWEEN x AND y
expresso IS NULL
37
Captulo 16
Agrupamento
16.1 5.3 Funes de Agrupamento (Agregao)
SELECT MAX(campo) AS Valor Mximo FROM taAs funes de agrupamento so usadas para contar o n- bela;
mero de registros de uma tabela.
Caso tenha problema com esta consulta use:
avg(expresso)
count(*)
count(expresso)
max(expresso)
min(expresso)
stddev(expresso)
sum(expresso)
variance(expresso)
Onde expresso, pode ser ALL expresso ou DISTINCT expresso.
count(distinct expresso)
As funes de Agrupamento (agregao) no podem ser
utilizadas na clusula WHERE. Devem ser utilizadas entre o SELECT e o FROM. Num SELECT que usa uma
funo agregada, as demais colunas devem fazer parte da
clusula GROUP BY. Somente podem aparecer aps o
SELECT ou na clusula HAVING. De uso proibido nas
demais clusulas.
Obs.: Ao contar os registros de uma tabela com a funo COUNT(campo) e esse campo for nulo em alguns
registros, estes registros no sero computados, por isso
cuidado com os nulos tambm nas funes de agregao.
A clusula HAVING normalmente vem precedida de uma
clusula GROUP BY e obrigatoriamente contm funes
de agregao.
ALERTA: Retornam somente os registros onde o campo
pesquisado seja diferente de NULL.
NaN - Not a Number (No um nmero)
UPDATE tabela SET campo1 = 'NaN';
SELECT MIN(campo) AS Valor Mnimo FROM tabela;
38
Captulo 17
Data e Hora
17.1 5.4 Funes de Data/Hora
timestamp '2001-09-28 01:00' + interval '23 hours -> ti- SELECT date_part('day', TIMESTAMP '2001-02-16
20:38:40');
mestamp '2001-09-29 00:00'
date '2001-09-28' + interval '1 hour' -> timestamp '2001- Resultado: 16 (day uma string, diferente de extract)
09-28 01:00'
Obtendo o dia da data atual:
date '01/01/2006' date '31/01/2006'
time '01:00' + interval '3 hourstime -> '04:00'
SELECT
DATE_PART('DAY',
RENT_TIMESTAMP) AS dia;
SELECT
DATE_PART('MONTH',
RENT_TIMESTAMP) AS mes;
CUR-
CUR-
SELECT
DATE_PART('YEAR',
CURage(timestamp, timestamp)interval Subtrai os argumen- RENT_TIMESTAMP) AS ano;
tos
Funo date_trunc (retorna timestamp)
age('2001-04-10', timestamp '1957-06-13') -> 43 years 9
SELECT date_trunc('year', TIMESTAMP '2001-02-16
mons 27 days
20:38:40');
Funo extract (retorna double) Extrai parte da data:
Retorna 2001-02-16 00:00:00
ano, ms, dia, hora, minuto, segundo.
select extract(year from age('2001-04-10', timestamp Convertendo (CAST)
'1957-06-13'))
select to_date('1983-07-18', 'YYYY-MM-DD')
select extract(month from age('2001-04-10', timestamp select to_date('19830718', 'YYYYMMDD')
'1957-06-13'))
Funo timeofday (retorna texto)
select extract(day from age('2001-04-10', timestamp
select timeofday() -> Fri Feb 24 10:07:32.000126 2006
'1957-06-13'))
BRT
Data e Hora atuais (retornam data ou hora)
Interval
SELECT CURRENT_DATE;
interval [ (p) ]
SELECT CURRENT_TIME;
to_char(interval '15h 2m 12s, 'HH24:MI:SS')
SELECT CURRENT_TIME(0);
date '2001-09-28' + interval '1 hour'
SELECT CURRENT_TIMESTAMP;
interval '1 day' + interval '1 hour'
SELECT CURRENT_TIMESTAMP(0);
interval '1 day' - interval '1 hour'
Somar dias e horas a uma data:
900 * interval '1 second'
SELECT CAST('06/04/2006' AS DATE) + INTERVAL
Interval trabalha com as unidades: second, minute, hour,
'27 DAYS' AS Data;
day, week, month, year, decade, century, millenium ou
Funo now (retorna timestamp with zone)
39
40
'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
41
Captulo 19
Converso de Tipos
19.1 5.6 - Converso Explcita de
Tipos (CAST)
SELECT HAS_TABLE_PRIVILEGE('usuario','tabela','privilegio');
SELECT HAS_TABLE_PRIVILEGE('postgres,'nulos,'insert');
- - Retorna: t
network(inet) 192.168.1.0/24
SELECT CURRENT_SETTING('DATESTYLE');
Funo macaddr
42
network('192.168.1.5/24')
43
Captulo 20
44
Captulo 21
SQL
21.1 6 - Funes no PostgreSQL
O syscat.sql traz consultas sobre o catlogo de sistema, o que se chama de metadados (metadata).
Funo que retorna um tipo composto. Funo que retorna uma nica linha da tabela empregados:
45
46
CREATE FUNCTION novo_empregado() RETURNS
empregados AS $$ SELECT text 'Nenhum' AS nome,
1000.0 AS salario, 25 AS idade, point '(2,2)' AS baia; $$
LANGUAGE SQL;
Ou
CREATE
OR
REPLACE
FUNCTION
novo_empregado() RETURNS empregados AS $$
SELECT ROW('Nenhum', 1000.0, 25, '(2,2)')::empregados; $$ LANGUAGE SQL;
Chamar assim:
SELECT novo_empregado();
ou
SELECT * FROM novo_empregado();
Funes SQL como fontes de tabelas
CREATE TEMP TABLE teste (testeid int, testesubid
int, testename text); INSERT INTO teste VALUES
(1, 1, 'Joo'); INSERT INTO teste VALUES (1, 2,
'Jos'); INSERT INTO teste VALUES (2, 1, 'Maria');
CREATE FUNCTION getteste(int) RETURNS teste
AS $$ SELECT * FROM teste WHERE testeid = $1;
$$ LANGUAGE SQL; SELECT *, upper(testename)
FROM getteste(1) AS t1;
Tabelas Temporrias - criar tabelas temporrias (TEMP),
faz com que o servidor se encarregue de remov-la (o que
faz logo que a conexo seja encerrada).
CREATE TEMP TABLE nometabela (campo tipo);
Funes SQL retornando conjunto
CREATE FUNCTION getteste(int) RETURNS SETOF
teste AS $$ SELECT * FROM teste WHERE testeid
= $1; $$ LANGUAGE SQL; SELECT * FROM getteste(1) AS t1;
Funes SQL polimrcas
As funes SQL podem ser declaradas como recebendo e
retornando os tipos polimrcos anyelement e anyarray.
CREATE FUNCTION constroi_matriz(anyelement,
anyelement) RETURNS anyarray AS $$ SELECT
ARRAY[$1, $2]; $$ LANGUAGE SQL; SELECT constroi_matriz(1, 2) AS intarray, constroi_matriz('a'::text, 'b') AS textarray; CREATE
FUNCTION
eh_maior(anyelement,
anyelement)
RETURNS boolean AS $$ SELECT $1 > $2; $$
LANGUAGE SQL; SELECT eh_maior(1, 2);
Mais detalhes no captulo 31 do manual.
Captulo 22
PlpgSQL
22.1 6.2 - Funes em Pl/pgSQL
Exemplo para somar 3 Valores
As funes em linguagens procedurais no PostgreSQL,
como a Pl/pgSQL so correspondentes ao que se chama
comumente de Stored Procedures. Por default o PostgreSQL s traz suporte s funes na linguagem SQL.
Para dar suporte funes em outras linguagens temos
que efetuar procedimentos como a seguir.
47
OR
REPLACE
FUNCTION
co-
48
digo_empregado (codigo INTEGER) RETURNS
SETOF INTEGER AS $$ DECLARE registro RECORD; retval INTEGER; BEGIN FOR registro IN
SELECT * FROM empregados WHERE salario >= $1
LOOP RETURN NEXT registro.departamento_cod;
END LOOP; RETURN; END; $$ language 'plpgsql';
select * from codigo_empregado (0); select count (*), g
from codigo_empregado (5000) g group by g;
Captulo 23
Triggers
23.1 6.3 - Triggers (Gatilhos)
Captulo 32 do manual ocial: http://pgdocptbr. CREATE TABLE empregados( codigo int4 NOT
NULL, nome varchar, salario int4, departamento_cod
sourceforge.net/pg80/sql-createtrigger.html
int4, ultima_data timestamp, ultimo_usuario varAt a verso atual no existe como criar funes de gati- char(50), CONSTRAINT empregados_pkey PRIlho na linguagem SQL.
MARY KEY (codigo) ) CREATE FUNCTION
Uma funo de gatilho pode ser criada para executar an- empregados_gatilho() RETURNS trigger AS $empretes (BEFORE) ou aps (AFTER) as consultas INSERT, gados_gatilho$ BEGIN -- Vericar se foi fornecido o
UPDATE OU DELETE, uma vez para cada registro (li- nome e o salrio do empregado IF NEW.nome IS NULL
nha) modicado ou por instruo SQL. Logo que ocorre THEN RAISE EXCEPTION 'O nome do empregado
um desses eventos do gatilho a funo do gatilho dispa- no pode ser nulo'; END IF; IF NEW.salario IS NULL
THEN RAISE EXCEPTION '% no pode ter um
rada automaticamente para tratar o evento.
salrio nulo', NEW.nome; END IF; -- -- Quem paga
A funo de gatilho deve ser declarada como uma funo
para trabalhar? -- IF NEW.salario < 0 THEN RAISE
que no recebe argumentos e que retorna o tipo TRIGEXCEPTION '% no pode ter um salrio negativo',
GER. Aps criar a funo de gatilho, estabelecemos o
NEW.nome; END IF; -- -- -- Registrar quem alterou a
gatilho pelo comando CREATE TRIGGER. Uma funo
folha de pagamento e quando -- NEW.ultima_data :=
de gatilho pode ser utilizada por vrios gatilhos.
'now'; NEW.ultimo_usuario := current_user; RETURN
As funes de gatilho chamadas por gatilhos-por- NEW; END; $empregados_gatilho$ LANGUAGE
instruo devem sempre retornar NULL.
plpgsql; CREATE TRIGGER empregados_gatilho
As funes de gatilho chamadas por gatilhos-por-linha BEFORE INSERT OR UPDATE ON empregapodem retornar uma linha da tabela (um valor do tipo dos FOR EACH ROW EXECUTE PROCEDURE
HeapTuple) para o executor da chamada, se assim o de- empregados_gatilho(); INSERT INTO empregados
(codigo,nome, salario) VALUES (5,'Joo',1000);
cidirem.
INSERT INTO empregados (codigo,nome, salario)
Sintaxe:
VALUES (6,'Jos',1500); INSERT INTO empregados
CREATE TRIGGER nome { BEFORE | AFTER } (codigo,nome, salario) VALUES (7,'Maria',2500);
{ evento [ OR ... ] } ON tabela [ FOR [ EACH ] { SELECT * FROM empregados; INSERT INTO empreROW | STATEMENT } ] EXECUTE PROCEDURE gados (codigo,nome, salario) VALUES (5,NULL,1000);
NEW Para INSERT e UPDATE OLD Para DEnome_da_funo ( argumentos )
LETE CREATE TABLE empregados ( nome varchar
NOT NULL, salario integer ); CREATE TABLE emO gatilho ca associado tabela especicada e executa a
pregados_audit( operacao char(1) NOT NULL, usuario
funo especicada nome_da_funo quando determinavarchar NOT NULL, data timestamp NOT NULL,
dos eventos ocorrerem.
nome varchar NOT NULL, salario integer ); CREATE
O gatilho pode ser especicado para disparar antes de OR REPLACE FUNCTION processa_emp_audit() REtentar realizar a operao na linha (antes das restries TURNS TRIGGER AS $emp_audit$ BEGIN -- -- Cria
serem vericadas e o comando INSERT, UPDATE ou uma linha na tabela emp_audit para reetir a operao
DELETE ser tentado), ou aps a operao estar completa -- realizada na tabela emp. Utiliza a varivel especial
(aps as restries serem vericadas e o INSERT, UP- TG_OP -- para descobrir a operao sendo realizada.
DATE ou DELETE ter completado).
-- IF (TG_OP = 'DELETE') THEN INSERT INTO
evento Um entre INSERT, UPDATE ou DELETE; es- emp_audit SELECT 'E', user, now(), OLD.*; RETURN
pecica o evento que dispara o gatilho. Vrios eventos OLD; ELSIF (TG_OP = 'UPDATE') THEN INSERT
49
50
INTO emp_audit SELECT 'A', user, now(), NEW.*;
RETURN NEW; ELSIF (TG_OP = 'INSERT') THEN
INSERT INTO emp_audit SELECT 'I', user, now(),
NEW.*; RETURN NEW; END IF; RETURN NULL;
-- o resultado ignorado uma vez que este um gatilho
AFTER END; $emp_audit$ language plpgsql; CREATE
TRIGGER emp_audit AFTER INSERT OR UPDATE
OR DELETE ON empregados FOR EACH ROW
EXECUTE PROCEDURE processa_emp_audit();
INSERT INTO empregados (nome, salario) VALUES
('Joo',1000); INSERT INTO empregados (nome, salario) VALUES ('Jos',1500); INSERT INTO empregados
(nome, salario) VALUES ('Maria',250); UPDATE
empregados SET salario = 2500 WHERE nome =
'Maria'; DELETE FROM empregados WHERE nome
= 'Joo'; SELECT * FROM empregados; SELECT *
FROM empregados_audit;
Outro exemplo:
CREATE TABLE empregados ( codigo serial PRIMARY KEY, nome varchar NOT NULL, salario integer
); CREATE TABLE empregados_audit( usuario varchar
NOT NULL, data timestamp NOT NULL, id integer
NOT NULL, coluna text NOT NULL, valor_antigo text
NOT NULL, valor_novo text NOT NULL ); CREATE
OR REPLACE FUNCTION processa_emp_audit()
RETURNS TRIGGER AS $emp_audit$ BEGIN
-- -- No permitir atualizar a chave primria -- IF
(NEW.codigo <> OLD.codigo) THEN RAISE EXCEPTION 'No permitido atualizar o campo codigo';
END IF; -- -- Inserir linhas na tabela emp_audit para
reetir as alteraes -- realizada na tabela emp. -- IF
(NEW.nome <> OLD.nome) THEN INSERT INTO
emp_audit SELECT current_user, current_timestamp,
NEW.id, 'nome', OLD.nome, NEW.nome; END IF; IF
(NEW.salario <> OLD.salario) THEN INSERT INTO
emp_audit SELECT current_user, current_timestamp,
NEW.codigo, 'salario', OLD.salario, NEW.salario; END
IF; RETURN NULL; -- o resultado ignorado uma
vez que este um gatilho AFTER END; $emp_audit$
language plpgsql; CREATE TRIGGER emp_audit
AFTER UPDATE ON empregados FOR EACH ROW
EXECUTE PROCEDURE processa_emp_audit();
INSERT INTO empregados (nome, salario) VALUES
('Joo',1000); INSERT INTO empregados (nome, salario) VALUES ('Jos',1500); INSERT INTO empregados
(nome, salario) VALUES ('Maria',2500); UPDATE empregados SET salario = 2500 WHERE id = 2; UPDATE
empregados SET nome = 'Maria Ceclia' WHERE id
= 3; UPDATE empregados SET codigo=100 WHERE
codigo=1; ERRO: No permitido atualizar o campo
codigo SELECT * FROM empregados; SELECT *
FROM empregados_audit;
Crie a mesma funo que insira o nome da empresa e o
nome do cliente retornando o id de ambos
Captulo 24
DCL
24.1 7 - DCL (Data Control Language) - Administrao
7.1 - Administrao de usurios, grupos e privilgios
51
Captulo 25
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
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
Administrao
27.1 9 - Administrao
1. Backup e Restore
2. Importar e Exportar
3. Converter
4. Otimizao e Desempenho
56
Captulo 28
Backup e Restore
28.1 9.1 - Backup e Restore
Administrao
pg_stat_get_backend_activity(s.backendid)
rent_query
AS
cur-
Tendo um banco com cadastro de CEPs e apenas uma tabela cep_tabela, mostrar o uso do disco por esta tabela.
Precisamos ltrar as tabelas de sistema, veja:
VACUUM ANALYZE;
(o cat envia um stream do arquivo para o gunzip que passa O utilitrio VACUUM recupera espao em disco ocupara o pg_restore)
pado pelos registros excludos e atualizados, atualiza os
dados para as estatsticas usadas pelo planejador de conBackup local de apenas uma tabela de um banco:
57
58
sultas e tambm protege contra perda de dados quando dbsize mostra o tamanho de tabelas e bancos
atingir um bilho de transaes.
oid2name retorna OIDs, leinode e nomes de tabelas
SELECT relname, rellenode, relpages FROM pg_class
D:\ARQUIV~1\POSTGR~1\8.1\bin>oid2name -U postWHERE relname LIKE 'cep_%' ORDER BY relname; gres -P ********
relname | rellenode | relpages
All databases:
+-------------+----------
autovacuum = on
Por default ser executado a casa 60 segundos. Para alte- rem Adaptao de Ribamar FS do original de Ivlison
Souza para a lista PostgreSQL Brasil
rar descomente e mude a linha:
@echo o
1. autovacuum_naptime = 60
REM 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;
Veja que no resultado tambm aparece a tabela de ndices, rem (Deletando o backup existente)
e com uso signicativo.
del banco*.sql
Ferramentas Contrib
echo Aguarde, realizando o backup do Banco de Dados
pgbench testa desempenho do SGBD.
59
Captulo 29
Importar e Exportar
29.1 9.2 - Importar e Exportar
Efetuando backup:
Para importar scripts gerados via pg_dump de dentro do Importar o arquivo texto CSV para uma tabela com
estrutura semelhante do arquivo csv:
psql devemos utilizar o comando
su - postgres
\i /path/script.sql
\i ./script.sql -- Tambm para o windows com o arquivo psql nomebanco
no diretrio atual
\copy nometabela from /home/nomearquivo.csv
Para importar arquivos texto com delimitadores, tipo No Windows
TXT, CSV ou binrios utilizamos os comandos do banco
\copy nometabela from ./arquivo.csv -- o arquivo estando
(psql), como usurio do banco:
no path do usurio
Importando:
Exportar um Banco Access para uso no PostgreSQL
\COPY tabela FROM script.csv
ou outros bancos
\COPY paises FROM 'paises.csv';
Selecionar a tabela e Exportar
Exportando:
CREATE TEMP TABLE paises AS SELECT * FROM Em avanado: Delimitador de campos Tabulao
teste WHERE nome LIKE '%tina%';
Qualicador de texto remover (deixar em branco)
\COPY paises TO '/usr/teste.copy';
Com Delimitadores
\COPY tabela FROM '/arquivo.csv' DELIMITERS '|';
\COPY tabela TO '/arquivo.txt' DELIMITERS '|';
Obs.: O arquivo teste.copy deve ter permisso de escrita
para o user do banco.
Importar uma planilha do Excel ou do Calc do OpenOce para uma tabela:
Gerando um arquivo CSV no OpenOce Calc
- Abrir calc e selecionar e copiar a rea a importar
- Abrir uma nova planilha
- Clicar com o boto direito sobre a primeira clula e Colar Especial
60
Captulo 30
Converter
30.1 9.3 - Converter
Uma boa forma de converter bancos MySQL para bancos PostgreSQL no Windows instalando o driver ODBC
para o MySQL e para o PostgreSQL.
Ento cria-se a comunicao com os dois bancos e
exporta-se para o PostgreSQL.
Existem ferramentas comerciais com muitos recursos,
como o caso do EMS Data Export e Import for
PostgreSQL: http://www.sqlmanager.net/en/products/
postgresql/dataexport
Veja: export to MS Excel, MS Word / RTF, MS Access,
HTML, TXT, CSV, PDF, XML and SQL.
Outra opo exportar para CSV do MySQL e importar
pelo PostgreSQL.
61
Captulo 31
Otimizao e Desempenho
31.1 Otimizao e Desempenho
31.6 Recomendao
Captulo 21 do manual:
http://pgdocptbr.sourceforge.net/pg80/maintenance.
html
Para a maioria das instalaes executar o comando VACUUM ANALYZE para todo o banco de dadosuma vez
ao dia em horrio de pouca utilizao. Tambm podemos
utilizar o comando: vacuumdb -fazq.
Vacuum:
http://pgdocptbr.sourceforge.net/pg80/sql-vacuum.html
31.4 VACUUM
O comando Vacuum tanto recupera espao em disco,
quanto otimiza o desempenho do banco e previne contra perda de dados muito antigos devido ao recomeo do
ID das transaes, portanto deve ser utilizado constantemente, como tambm atualiza as estatsticas dos dados
utilizados pelo planejador de comandos. Lembrando que
na verso 8.1 j vem embutido no executvel, podendo
62
63
50;
No postgresql.conf existem conguraes para sha- Adio de outra condio clusula WHERE:
64
EXPLAIN SELECT * FROM tenk1 WHERE unique1 <
50 AND stringu1 = 'xxx';
A seguir feita a juno de duas tabelas, utilizando as
colunas sendo discutidas:
EXPLAIN SELECT * FROM tenk1 t1, tenk2 t2
WHERE t1.unique1 < 50 AND t1.unique2 = t2.unique2;
Uma forma de ver outros planos forar o planejador a
no considerar a estratgia que sairia vencedora, habilitando e desabilitando sinalizadores de cada tipo de plano
(Esta uma ferramenta deselegante, mas til.
SET enable_nestloop = o;
EXPLAIN SELECT * FROM tenk1 t1, tenk2 t2
WHERE t1.unique1 < 50 AND t1.unique2 = t2.unique2;
possvel vericar a preciso dos custos estimados pelo planejador utilizando o comando EXPLAIN
ANALYZE. Na verdade este comando executa a consulta, e depois mostra o tempo real acumulado dentro de
cada n do plano junto com os custos estimados que o comando EXPLAIN simples mostraria. Por exemplo, poderia ser obtido um resultado como este:
EXPLAIN ANALYZE SELECT * FROM tenk1 t1,
tenk2 t2 WHERE t1.unique1 < 50 AND t1.unique2 =
t2.unique2;
31.11 Alerta
Caso um banco j esteja com mais de 1,5 bilhes de transaes, ao executar o comando VACUUM para o banco
inteiro receber um alerta sobre a necessidade de execuo do VACUUM.
Captulo 32
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
Conguraes
33.1 11 - Conguraes
1. Congurar acessos (pg_hba.conf)
2. Conguraes Diversas (postgresql.conf)
67
Captulo 34
Congurar acessos
34.1 11.1 - pg_hba.conf
CIDR-ADDRESS
Para autenticar exigindo um dos tipos com senha, deve- Conexo via TCP/IP. Este tipo de conexo s possvel
mos antes, ainda no trust, alterar os usurios adicionando quando o valor do parmetro listen_address (IP) adequado no postgresql.conf. Por default somente localhost
senha:
permitido. So permitidas conexes com ou sem SSL.
ALTER ROLE nomeuser WITH PASSWORD 'senhadopg';
1. hostssl DATABASE USER CIDR-ADDRESS
Somente ento devemos alterar o pg_hba.conf para pedir
METHOD [OPTION]
senha e restartar o PostgreSQL.
As conguraes principais so feitas nos arquivos Semelhante ao host, sendo que neste usa-se criptograa
pg_hba.conf e postgresql.conf. Se instalado atravs dos SSL.
fontes cam no subdiretrio data de instalao do PostgreSQL, normalmente em /usr/local/pgsql. Se instalado
1. hostnossl DATABASE USER CIDR-ADDRESS
via binrios da distribuio vai variar com a distribuio.
METHOD [OPTION]
No Slackware esto no diretrio /usr/share/postgresql.
O pg_hba.conf controla que mquinas tero acesso ao Apenas para conexes que no usam SSL.
PostgreSQL e a autenticao dessas mquinas clientes
(sem autenticao ou atravs de outras formas, trust,
1. DATABASE can be all, sameuser, samerole,
md5, crypt, etc).
a database name, or
O pg_hba.conf muito rico e podemos controlar o acesso
pelo IP, pela mscara, pelo banco, pelo usurio, pelo m1. a comma-separated list thereof.
todo (trust, md5, password, etc).
Resumo sobre o pg_hba.conf
- um nome de usurio
Este mtodo de conexo para uso somente atravs soc- - um nome de grupo prexado por "+"
kets de domnio UNIX
- uma lista separados por vrgula
68
69
1. TYPE DATABASE USER CIDR-ADDRESS
METHOD
O campo CIDR-ADDRESS somente se aplica aos regis- A ordem dos registros signicativa.
tros host, hostssl e hostnossl.
Caso um registro que venha primeiro entre em conito
IP-address e IP-mask
com outro que vem em seguida, o primeiro ser execuEstes campos podem ser utilizados como alternativa no- tado e o segundo, no.
tao CIDR-ADDRESS. ao invs
de especicar o comprimento da mscara, a atual mscara
especicada em uma coluna separada.
Exemplo:
Exemplos:
1. TYPE DATABASE USER CIDR-ADDRESS
METHOD
172.20.143.89 255.255.255.255
Estes campos somente se aplica aos registros host, hostssl local all all md5
e hostnossl.
J este acima aceitar todas as conexes locais incondiciMETHOD pode ser trust, reject, md5, crypt, onalmente (sem senha)
password,
A segunda linha ser ignorada.
1. krb5, ident, ou pam
Observe que conexes locais no usam o campo CIDRtrust - permite conexo a qualquer um incondicional- ADDRESS.
mente (sem senha)
Exemplos no pg_hba.conf:
reject - rejeita conexo incondicionalmente para o Conexo local via socket
user/host especicado
local all all md5
crypt - recomendada somente para verses inferiores a
Conexo local via TCP/IP
7.2. Atualmente recomenda-se md5
host all all 127.0.0.1/32 md5
krb5 - somente disponvel para conexes via TCP/IP
ident - Obtm o nome do usurio do sistema operacio- Conexo local via TCP/IP com mscara separada
nal. Para conexes TCP/IP contacta o servidor ident no host all all 127.0.0.1 255.255.255.255 md5
cliente. Para conexes locais, recebendo este do sistema
Conexo para uma rede (ident sameuser) via TCP/IP
operacional.
pam - usando o servio PAM (Pluggable Authentication host banco usuario 192.168.93.0/24 ident sameuser
Modules) do sistema operacional
70
Obtm o nome de usurio do sistema operacional do cli1. TYPE DATABASE USER IP-ADDRESS IPente (para conexes TCP/IP fazendo contato com o serMASK METHOD
vidor de identicao no cliente, para conexes locais obtendo a partir do sistema operacional) e verica se o usu- host all all 200.217.23.234 255.255.255.255 reject host
rio possui permisso para se conectar como o usurio de all all 0.0.0.0 0.0.0.0 md5
banco de dados solicitado consultando o mapa especiMais detalhes sobre o pg_hba.conf em:
cado aps a palavra chave ident.
Exemplo para Ubuntu (facilmente adaptvel para outras http://pgdocptbr.sourceforge.net/pg80/
client-authentication.html
distros e SOs).
Se instalado pelo repositrio:
- sudo gedit /etc/postgresql/8.1/main/postgresql.conf
Altere:
1. listen_addresses = 'localhost'
para:
listen_addresses = '*'
Aqui tambm existem outras importantes conguraes,
como datestyle = 'sql, dmy' # Datas no estilo brasileiro
dd/mm/aaaa
client_encoding = latin1 # suporte nossa acentuao
- sudo gedit /etc/postgresql/8.1/main/pg_hba.conf
1. TIPO BANCO USURIO CIDR-ADDRESS MTODO
1. local para domnios Unix somente com conexes
via socket
1. no requer IP
local all all md5
1. Conexes locais via IPv4:
host all all 127.0.0.1/32 md5
1. Conexes locais via IPv6:
host all all ::1/128 md5
1. Conexes para todos os IPs de uma subrede
(10.0.0.0)
1. TYPE DATABASE USER IP-ADDRESS IPMASK METHOD
host all all 10.43.0.0 255.0.0.0 md5
Opo para permitir acesso atravs de toda a internet:
1. Aceitar toda a Internet, exceto 200.217.23.234
Captulo 35
Conguraes Diversas
35.1 11.2 - postgresql.conf
sameuser o usurio padro no ident.conf (signica o ALTER ROLE nomeuser SET datestyle TO SQL, DMY;
mesmo user do sistema operacional).
O caminho de entrada num banco do PostgreSQL: ->
# FILE LOCATIONS #hba_le = 'Cong- postgresql.conf -> ph_hba.conf -> ident.conf (caso este
Dir/pg_hba.conf' # host-based authentication le # exista e seja citado no pg_hba.conf)
CONNECTIONS AND AUTHENTICATION # - O encoding e outros recursos podem ser passados para
Connection Settings # # O parmetro listen_address cada banco, no momento de sua criao, como por exemdene que interfaces de rede do servidor, atravs plo:
de seus endereos IP, aceitam tentativas de conexo
via TCP/IP #listen_addresses = 'localhost' # Quais De fora do banco: createdb -E LATIN1 nomebanco.
endereos IP ou nomes onde sero feitas as escutas; De dentro do banco (psql): CREATE DATABASE no# lista de endereos/nomes separados por vrgula; # mebanco WITH ENCODING 'LATIN1';
se fr omitido, o default 'localhost' # '*' = todas
Para a relao completa dos encoding suportados veja tainterfaces de rede estaro habilitadas para escutar
bela 21-2. Para visualizar a codicao no psql digite
requisies #port = 5432 max_connections = 100 (duas
\encoding.
so reservadas para o superusurio) # note: increasing
max_connections costs ~400 bytes of shared memory Para mudar a codicao de um banco dinamicamente,
per #superuser_reserved_connections = 2 # - Security estando nele utilize: \encoding novoencoding
& Authentication - #authentication_timeout = 60 # Como tambm podemos utilizar o comando SET: SET
1-600, in seconds #ssl = o #password_encryption = on CLIENT_ENCODING 'LATIN1'; Consultando o enco# RESOURCE USAGE (except WAL) # - Memory - ding existente SHOW CLIENT_ENCODING;
shared_buers = 1000 # min 16 or max_connections*2,
8KB each #temp_buers = 1000 # min 100, 8KB each PARA DESFAZER AS ALTERAES E VOL#max_prepared_transactions = 5 # can be 0 or more # TAR CODIFICAO PADRO: RESET CLInote: increasing max_prepared_transactions costs ~600 ENT_ENCODING;
bytes of shared memory # per transaction slot, plus lock Mais detalhes:
http://www.postgresql.org/docs/8.1/
space (see max_locks_per_transaction). #work_mem = interactive/runtime-config.html#CONFIG-SETTING
1024 # min 64, size in KB #maintenance_work_mem
= 16384 # min 1024, size in KB #max_stack_depth Para saber os locales existentes execute de dentro do psql:
= 2048 # min 100, size in KB # - Free Space Map - \l -- Exibe bancos, donos e locales (Codicao)
#max_fsm_pages = 20000 # min max_fsm_relations*16,
71
72
Em cada conexo com o PostgreSQL, somente se pode
acessar um nico banco. No postgresql.conf podemos
denir o encoding atravs da varivel client_encoding.
Captulo 36
Metadados
36.1 12 - Metadados (Catlogo)
Metadados so dados sobre dados.
Uma consulta normal retorna informaes existentes em
tabelas, j uma consulta sobre os metadados retorna informaes sobre os bancos, os objetos dos bancos, os
campos de tabelas, seus tipos de dados, seus atributos,
suas constraints, etc.
Retornar Todas as Tabelas do banco e esquema atual
SELECT schemaname AS esquema, tablename AS tabela, tableowner AS dono FROM pg_catalog.pg_tables
WHERE schemaname NOT IN ('pg_catalog', 'information_schema', 'pg_toast') ORDER BY schemaname, tablename
74
Para visualizar como as consultas so feitas internamente via psql usamos o comando assim:
psql -U user banco -E
Vamos usar o banco municipios, criado com os municpios do Brasil. A tabela opt_cidades.
Mostrar Esquemas e respectivas tabelas do Banco Veja Um Exemplo Que Retorna a Chave Primria da Taatual:
bela opt_cidades
SELECT n.nspname as esquema, c.relname as tabela
FROM pg_namespace n, pg_class c WHERE n.oid =
c.relnamespace and c.relkind = 'r' -- no indices and
n.nspname not like 'pg\\_%' -- no catalogs and n.nspname
!= 'information_schema' -- no information_schema ORDER BY nspname, relname
doskey
dbinfo=SELECT
dat-
75
FROM
Tabelas e Soma
SELECT tablename, SUM( size_kb )
FROM
c2.relpages * 8 AS size_kb
c.relname as Tabela,
FROM pg_class
FROM pg_catalog.pg_class c
select pg_database_size('banco');
AND pg_catalog.pg_table_is_visible(c.oid)
pg_total_relation_size('tabela')
ORDER BY 1,2;
Listar Tabelas
pg_relation_size('tabelaouindice')
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
FROM pg_catalog.pg_attrdef d WHERE d.adrelid
= a.attrelid AND d.adnum = a.attnum AND
a.atthasdef) as Default, a.attnotnull, a.attnum FROM
pg_catalog.pg_attribute a WHERE a.attnum > 0 AND
NOT a.attisdropped ) attrs ON (attrs.attrelid = rel.oid )
WHERE relname LIKE '% || vTabela || %' ORDER
BY attrs.attnum; FOR r IN EXECUTE eSql LOOP
RETURN NEXT r; END LOOP; IF NOT FOUND
THEN RAISE EXCEPTION Tabela % no encontrada,
vTabela; END IF; RETURN; END ' LANGUAGE
'plpgsql';
Para utilizar esta funo, utilize o seguinte comando:
SELECT * FROM Dados_Tabela('tabela');
Retorno:
esquema | tabela | campo | tipo | valor | autoincremento
Exemplos contidos no arquivo:
/usr/local/src/postgresql-8.1.3/src/tutorial/syscat.sql
SELECT rolname as Donos, datname as Bancos
FROM pg_roles, pg_database WHERE pg_roles.oid =
datdba ORDER BY rolname, datname;
Retorno: Donos e Bancos
SELECT n.nspname as esquema, c.relname as tabela FROM pg_class c, pg_namespace n WHERE
c.relnamespace=n.oid and c.relkind = 'r' -- not indices,
views, etc and n.nspname not like 'pg\\_%' -- not catalogs
and n.nspname != 'information_schema' -- not information_schema ORDER BY nspname, relname;
Retorno: Esquemas e Tabelas
SELECT n.nspname as esquema, c.relname as tabela, a.attname as campo, format_type(t.oid, null) as
tipo_de_dado FROM pg_namespace n, pg_class c,
pg_attribute a, pg_type t WHERE n.oid = c.relnamespace
and c.relkind = 'r' -- no indices and n.nspname not
like 'pg\\_%' -- no catalogs and n.nspname != 'information_schema' -- no information_schema and a.attnum >
0 -- no system atts and not a.attisdropped -- no dropped
columns and a.attrelid = c.oid and a.atttypid = t.oid ORDER BY nspname, relname, attname;
Retorno: esquemas, tabelas, campos, tipos de dados
SELECT n.nspname, o.oprname AS binary_op,
format_type(left_type.oid, null) AS left_opr, format_type(right_type.oid, null) AS right_opr, format_type(result.oid, null) AS return_type FROM
pg_namespace n, pg_operator o, pg_type left_type,
pg_type right_type,
pg_type result WHERE
o.oprnamespace = n.oid and o.oprkind = 'b' -- binary and o.oprleft = left_type.oid and o.oprright =
right_type.oid and o.oprresult = result.oid ORDER BY
nspname, left_opr, right_opr;
Retorno: operadores binrios
Baypassar os de sistema:
Captulo 37
Conectividade
37.1 13 - Conectividade
AtivConex.ActiveConnection = Conex
End Sub
Vou mostrar a conectividade do PostgreSQL com o PHP, Exemplo Bsico de Java Acessando PostgreSQL Via
JDBC
com o Java e com o Visual BASIC.
Tambm mostrarei a conectividade atravs do ODBC Crie no PostgreSQL um pequeno banco de dados chamado agenda com uma nica tabela chamada amigos.
com o Access.
Esta tabela contendo os campos nome e email apenas.
Cadastre um ou mais registros para melhor visualizao
Com o PHP existe uma conexo nativa. Veja um exemdos resultados.
plo:
import java.sql.*;
$conexao = pg_connect(host=127.0.0.1 dbname=testes
public class SQLStatement {
user=postgres password=******* port=5432);
Conectando com o PHP
if (!$conexao){
echo Falha na conexo com o banco. Veja detalhes tcnicos: " . pg_last_error($conexao); }
Conexo com Java
A conexo do PostgreSQL com Java utilizada por diversos clientes de gerenciamento ou modelagem do PostgreSQL. Neste caso utiliza-se o driver JDBC do PostgreSQL. Vide pasta \jdbc da instalao.
Baixar de acordo com sua verso do PostgreSQL, o driver
JDBC para o PostgreSQL daqui:
http://jdbc.postgresql.org/download.html#jdbcselection
Aqui para o PostgreSQL verso 8.1.3 baixei o arquivo
8.1-405 JDBC 3.
VB Acessando PostgreSQL via ODBC
O PGODBC deve ser instalado no micro cliente e
encontra-se em:
http://www.postgresql.org/ftp/odbc/versions/msi
80
Instala-se o psqlODBC e congura-se a conexo com o
banco desejado.
If so then use something like
CurrentProject.Connection.Execute StrSql2
If not linked tables then use something like
Dim cnn as new ADODB.Connection cnn.Open
DSN=my_dbs_dsn_name 'or a full PostgreSQL
connection string to save a trip to the
registry
cnn.Execute StrSql2
Outro exemplo:
Criar um DSN ODBC pgresearch via ADO e use:
Dim gcnResearch As ADODB.Connection
Dim rsUId As ADODB.Recordset
' open the database
Set gcnResearch =3D New ADODB.Connection
With gcnResearch
.ConnectionString =3D dsn=3Dpgresearch
.Properties(User ID) =3D txtUsername
.Properties(Password) =3D txtPassword
.Open
End With
Acessando com o Visual C#.net, ver link:
http://www.linhadecodigo.com.br/artigos.asp?id_ac=
355
Captulo 38
Ferramentas
38.1 14 - Ferramentas
1. psql
2. phpPgAdmin
3. PgAdmin
4. EMS PostgreSQL
5. Azzurry Clay (modelagem com o Eclipse)
6. dbVisualizer
7. OpenOce Base
81
Captulo 39
psql
39.1 14.1 - psql
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
phpPgAdmin
40.1 14.2 - phpPgAdmin
Baixar de - http://phppgadmin.sourceforge.net/
- Copiar para o diretrio web
- Editar o arquivo conf/cong.inc.php e alterar para dois
servidores (um local e outro remoto):
... // Display name for the server on the login screen
$conf['servers][0]['desc'] = 'Local';
$conf['servers][0]['host'] = '127.0.0.1';
$conf['servers][0]['defaultdb'] = 'nomebancodefault';
// Example for a second server (PostgreSQL Remoto)
$conf['servers][1]['desc'] = 'Remoto';
$conf['servers][1]['host'] = '10.99.00.11';
$conf['servers][1]['port'] = 5432;
$conf['servers][1]['defaultdb'] = 'nomebancodefault';
...
$conf['extra_login_security'] = false;
84
Captulo 41
PgAdmin
41.1 14.3 PgAdmin
PgAdmin
Site para download, caso sua distribuio no traga ou no
tenha como instalar (apt, synaptic ou outro gerenciador de
pacotes).
http://www.pgadmin.org/download/
uma ferramenta grca desenvolvida pela equipe de desenvolvimento do PostgreSQL.
Muitos recursos. Traz um help sobre si e sobre a documentao do PostgreSQL. Tecle F1 para exibir.
Ao executar consultas na ferramenta SQL, tecle F7 para
visualizar gracamente a consulta na aba Explain.
85
Captulo 42
EMS PostgreSQL
42.1 14.4 - EMS PostgreSQL Manager
O EMS um timo gerenciador de diversos tipos de ban- - Acima digitamos o nome da tabela onde existe table1
cos, inclusive do PostgreSQL.
- Ento clicamos na aba Fields.
Download http://www.sqlmanager.net/en/products/ - Mais um duplo clique, agora em Column Name, para
postgresql/manager (para Windows existe uma verso que aparea o Wizard de Campos
free, a lite)
- Veja que o nome do campo codigo. Que ele do
Aqui vou abordar as atividades principais e bsicas de uso tipo BIGINT e tambm chave primria.
do EMS:
- Veja agora como aparece nosso campo (com uma pe- Abrir em banco
quena chave direita):
- Criar em novo banco
- Criar tabelas
- Criar campos
- Clicamos em Next.
- Clique em Next
- E clicamos em Finish
87
iro se relacionar atravs do campo cdigo em pedido e Uma boa utilidade para o gerenciador EMS a de teste
cod_pedido em pedido_itens, como abaixo:
de consultas SQL. - Abra o banco, abra o executor de
script, digite a consulta em SQL e execute para saber os
pedido (codigo, descricao, data, preco_unitario)
resultados. - Sempre que tiver alguma dvida sobre uma
pedido_itens (codigo, cod_pedido, quantidade)
consulta execute aqui para testar antes.
- Para que um campo de uma tabela se relacione com
outro, ele deve ser do mesmo tipo que o outro.
- Abra a tabela pedido_itens
- Estando na aba Fields, clique em Foreign Key na coluna
do meio com o boto direito e New Foreign Key. Veja o
dilogo
- Acima e direita selecione o campo que ir se relacionar
com a outra tabela (cod_pedido)
- Em Foreign Table selecione a tabela do relacionamento
(pedidos)
- Ento abaixo e direita selecione o campo que vai se
relacionar com este (codigo) e clique na seta para a direita. Ento clique em OK. Veja que em OnDelete action
e em On Update Action existem diversas opes.
- Ento clique em Commit. Agora vejamos como ca o
cdigo SQL da nossa tabela pedido_itens. Clique na aba
DDL e ver:
CREATE TABLE public."pedido_itens (
codigo BIGINT NOT NULL, cod_pedido BIGINT, quantidade INTEGER, CONSTRAINT
pedido_itens_pkey
PRIMARY
KEY(codigo),
CONSTRAINT
pedido_itens_fk
FOREIGN
KEY
(cod_pedido)
REFERENCES
public."pedidos"(codigo) ON DELETE NO ACTION
ON UPDATE NO ACTION NOT DEFERRABLE
) WITH OIDS;
EXPORTANDO UM BANCO COMO SCRIPT
Uma forma muito comum de se exportar um banco na
forma de script, especialmente para abrir num outro servidor do mesmo tipo:
- Clique no menu Tools Extract Metadata - Selecione o
banco que deseja exportar e clique em Next - Na combo
File name selecione o diretrio e nome de arquivo para
onde deseja exportar e clique em Salvar. Ento clique em
Next. - Escolha se quer exportar somente dados, somente
estrutura ou ambos e clique em Next. - Apenas clique em
Finish e ao terminar em Close.
IMPORTANDO UM BANCO DE UM SCRIPT
Esta a operao inversa da anterior mas com algumas
diferenas. Se formos importar tudo, devemos ter aqui
apenas um banco vazio. - Abrir o banco no EMS - Clicar
em Tools SQL Script - Ao centro clique em Open script
e indique onde est o script a ser importado. - Se tudo
for importado a contendo clique no boto Refresh Tables
direita do boto Create para visualizar a importao.
EXECUTANDO CONSULTAS SQL NO EMS
Captulo 43
Azzurry Clay
43.1 14.5 - Azzurry Clay (modelagem)
Ferramenta de Modelagem Azzurry Clay:
http://www.azzurri.jp/en/software/clay/index.jsp
Visualizador de Objetos e gerador de Diagramas de Entidade Relacionamento (DER), alm de fazer engenharia
reversa nos bancos existentes.
Um timo tutorial online:
http://www.azzurri.jp/en/software/clay/quick_start_
guide.jsp?print=on
Uma boa relao de ferramentas para o PostgreSQL pode
ser encontrada no site do PostgreSQL Brasil:
https://wiki.postgresql.org.br/wiki/Ferramentas
Outra boa relao no site Data Modeling Tools:
http://www.databaseanswers.com/modelling_tools.htm
88
Captulo 44
dbVisualizer
44.1 14.6 DbVisualizer
tima ferramenta para visualizar bancos e montar o diagrama entidades-relacionamento.
http://www.dbvis.com/products/dbvis/download.html
89
Captulo 45
OpenOce Base
45.1 14.7 Openoce2 Base
Usando o OpenOce para abrir, editar bancos de dados
PostgreSQL, como tambm criar consultas, formulrios
e relatrios.
Uma das formas de conectar o OpenOce ao PostgreSQL usando um driver JDBC do PostgreSQL.
- Antes devemos ter instalado o OpenOce com suporte
a Java
- Baixe daqui:
http://jdbc.postgresql.org/download.html#jars
Para o PostgreSQL 8.1 podemos pegar o JDBC3 http://jdbc.postgresql.org/download/postgresql-8.
1-405.jdbc3.jar
- Abrir o OpenOce, pode ser at o Writer Ferramentas Opes Java Class Path Adicionar Arquivo
(indicar o arquivo postgresql-8.0-313.jdbc2.jar baixado)
e OK.
- Abrir o OOBase
- Conectar a um banco de dados existente
- Selecionar JDBC - Prximo
- URL da fonte de dados:
jdbc:postgresql://127.0.0.1:5432/bdteste
Classe do driver JDBC:
org.postgresql.Driver
Nome do usurio - postgres
password required (marque, caso use senha)
Concluir
Digitar um nome para o banco do OOBase
Pronto. Agora todas as tabelas do banco bdteste esto
disponveis no banco criado no OOBase.
Tambm podemos agora criar consulta com assistentes,
criar formulrios e relatrios com facilidade.
90
Captulo 46
Apndices
46.1 15 - Apndices
1. Planejamento e Projeto de Bancos de Dados
2. Implementao de Banco de Dados com o PostgreSQL
3. Integridade Referencial - PostgreSQL
4. Dicas Prticas de uso do SQL
5. Dicas sobre Desempenho e Otimizaes do PostgreSQL
91
Captulo 47
A correta determinao das tabelas, bem como dos campos algo primordial no sucesso do projeto do banco de
dados.
Chave Primria - obriga que todos os registros tero o
campo correspondente chave primria exclusivo (nicos - unique). Num cadastro de clientes, todos os clientes cadastrados tero um campo CPF exclisivo. Caso
se tente inserir dois clientes com o mesmo CPF o banco
no permitir e emitir uma mensagem de erro acusando
tentativa de violao da chave primria.
Exemplo de software de administrao de SGBD para o Exemplos de Campos indicados para chave primria:
PostgreSQL - PGAdmin Informaes de bancos de dados
CPF
relacionais so armazenadas em tabelas ou entidades no
CNPJ
Modelo Entidade Relacionamento (MER).
Dicas sobre Campos
Matrcula de aluno
mria.
A chave primria o campo ou campos que identicam Relacionamentos - Um banco de dados formado por
vrias tabelas. Idealmente essas tabelas devem ser relacide forma exclusiva cada registro.
onadas entre si para facilitar a troca de informaes e ga No permitido valores nulos na chave nem duplicados
rantir a integridade. Para relacionar tabelas usamos cha Caso a tabela no tenha um campo que a identique, ves existentes nas mesmas.
pode-se usar um campo que numere os registros seqenTipos de Relacionamentos
cialmente
92
93
Tambm se pode criar o banco de forma que quando atualizamos o CPF de um cliente ele seja atualizado em todos
os seus pedidos.
Normalizao de Tabelas
Categorias - Itens
2 Forma Normal
Fornecedores - Produtos
Clientes - Pedidos
NotaFiscal - Produtos
Veja que cada um da esquerda se relaciona com vrios do Devemos observar se todos os campos que no fazem
parte da chave dependem de todos os campos que fazem
da direita.
parte da chave.
Importante:
Caso algum campo dependa somente de parte da chave,
O nmero de campos do relacionamento no precisa ser ento devemos colocar este campo em outra tabela.
o mesmo
Exemplo:
O tipo de dados dos campos do relacionamento deve ser
TabelaAlunos
igual, assim como o tamanho dos campos e formatos
Chave (matricula, codigo_curso)
Chave primria - Chave estrangeira (um - vrios)
Relacionamento Vrios para Vrios
avaliacao descricao_curso
Este tipo de relacionamento no d para ser implementado no modelo relacional, portanto sempre que nos deparamos com um deles devemos dividir em dois relacionamentos um para vrios (criando uma terceira tabela,
que armazenar o lado vrios dos relacionamentos).
Exemplo:
Pedidos - Produtos
TabelaAlunos
Soluo:
Cada pedido pode conter vrios produtos, assim como Chave (matricula, codigo_curso)
cada produto pode estar em vrios pedidos. A sada
avaliacao
criar uma tabela que contenha os itens do pedido.
TabelaCursos
Pedidos - Pedidos_Itens - Produtos
codigo_curso
Pedidos 1 - N Pedidos_Itens N - 1 Produtos
Integridade Referencial
Ela garante a integridade dos dados nas tabelas relacionadas. Um bom exemplo quando o banco impede que
se cadastre um pedido para um cliente inexistente, ou impede que se remova um cliente que tem pedidos em seu
nome.
descricao_curso
3 Forma Normal
Quando um campo no dependente diretamente da
chave primria ou de parte dela, mas de outro campo da
tabela que no pertence chave primria. Quando isso
ocorre esta tabela no est na terceira forma normal e a
94
Captulo 48
Criao do Banco
JDBC
Ambas tem suporte a acentuao, mas geram problemas Alguns programas em Java o utilizam, como o plugin
no backup/importao.
QuantumDB.
Codicao
O JDBC para o PostgreSQL encontra-se em:
Para um suporte estvel acentuao em portugus do http://jdbc.postgresql.org/download.html#jars
Brasil uma boa opo criar o banco passando a codiVeja que para selecionar o arquivo .jar correto, precisacao (Encoding) LATIN1
mos cruzar a verso do PostgreSQL esquerda com a
ENCODING = 'LATIN1'
95
96
Exemplo: Para uso como cliente em sua mquina pelo Quando se cria um banco no PostgreSQL, por default,
Quantum DB (no Eclipse) e com PostgreSQL 8.1 baixar ele cria um esquema pblico (public) no mesmo e neste
o arquivo: 8.1-405 JDBC 3
esquema que so criados todos os objetos quando no especicamos o esquema. A este esquema public todos os
Esquemas
usurios do banco tm livre acesso, mas aos demais existe
Denir os esquemas do banco.
a necessidade de se dar permisso para que os mesmos
Quando o cliente precisa de muitas tabelas, organizadas acessem.
em vrias reas a sada imediata a criao de vrios ban- Tabelas
cos de dados. Mas quando da implementao do aplicativo que ir utilizar estes bancos os desenvolvedores se O PostgreSQL permite adicionar privilgios por objeto
depararo com a diculdade de comunicao e acesso en- do banco: tabela, esquema, banco, etc. Em termos de setre os bancos, j que com uma nica conexo tero acesso gurana importante, em geral, que os privilgios sejam
a todos os objetos do banco. muito til para estes casos adicionados ao usurio por tabela, cada tabela tendo um
dono e cada dono tendo seus especcos privilgios.
criar um nico banco e neste criar vrios esquemas, organizados por reas: pessoal, administracao, contabilidade, Dica de Desempenho: Na criao das tabelas alertar para
engenharia, etc.
a criao de ndices para os campos envolvidos na cluMas e quando uma destas reas tem outras sub-reas, sula WHERE. Isso tornar essas consultas mais rpidas.
como por exemplo a engenharia, que tem reservatrios,
obras, custos e cada um destes tem diversas tabelas. O
esquema engenharia car muito desorganizado. Em termos de organizao o ideal seria criar um banco para cada
rea, engenharia, contabilidade, administrao, etc. E
para engenharia, por exemplo, criar esquemas para cada
subarea, custos, obras, etc. Mas no o ideal em termos
de comunicao e acesso entre todos os bancos.
Criar Esquema
Views
Juntamente com as funes armazenadas (stored procedures) as views so boas alternativas para tornar o cdigo
mais simples e o aplicativo mais ecientes, j que parte
do processamento feito pelo cdigo agora j est pronto
e debugado no banco, o que torna o cdigo mais rpido
e eciente. O uso de views e de funes armazenadas
em bancos semelhante ao uso de funes e classes no
cdigo.
Num gerenciador do PG entra-se no banco e nesse cria-se Dica: para uso de views, sintaxe de funes internas e
o esquema.
uso de clusulas SQL no PostgreSQL, tutoriais de EMS
e vrios outros sobre PostgreSQL, alm de PHP, JaOu
vaScript, etc, conra o site abaixo: http://ribafs..net ou
CREATE SCHEMA nomeesquema;
http://ribafs.tk
Acessando Objetos de Esquemas
Criao do Banco Tutorial sobre PGAdmin para
Para acessar um esquema devemos passar seu caminho: criar o banco funcionarios.
nomeesquema.nometabela
Ou
nomebanco. nomeesquema.nometabela
Criando Tabela em Esquema
CREATE TABLE nomeesquema.nometabela (
...
)
Criando Esquema e tornando um Usurio dono
97
Captulo 49
Traduo livre do documentao CBT Integrity Refe- Mas caso tentemos cadastrar um pedido com cod_cliente
rential":
3 ele ser recusado pelo banco.
http://techdocs.postgresql.org/college/002_
Criando uma Chave Primria
referentialintegrity/.
Deve ser criada quando da criao da tabela, para garantir
Integridade Referencial (relacionamento) onde uma in- valores exclusivos no campo.
formao em uma tabela se refere informaes em outra
CREATE TABLE clientes(cod_cliente BIGINT,
tabela e o banco de dados refora a integridade.
nome_cliente VARCHAR(60) PRIMARY KEY
Tabela1 ------------> Tabela2
(cod_cliente));
Onde Utilizado?
Criando uma Chave Estrangeira (Foreign Keys)
Onde pelo menos em uma tabela precisa se referir para o campo de uma tabela que se refere ao campo Primary
informaes em outra tabela e ambas precisam ter seus Key de outra.
dados sincronizados.
O campo pedidos.cod_cliente refere-se ao campo clienExemplo: uma tabela com uma lista de clientes e outra tes.codigo, ento pedidos.cod_cliente uma chave estabela com uma lista dos pedidos efetuados por eles.
trangeira, que o campo que liga esta tabela a uma outra.
Com integridade referencial devidamente implantada CREATE TABLE pedidos(
nestas tabelas, o banco ir garantir que voc nunca ir
cadastrar um pedido na tabela pedidos de um cliente que cod_pedido BIGINT,
no exista na tabela clientes.
cod_cliente BIGINT REFERENCES clientes,
O banco pode ser instrudo para automaticamente atuali- descricao VARCHAR(60)
zar ou excluir entradas nas tabelas quando necessrio.
);
Primary Key (Chave Primria) - o campo de uma tabela
Outro exemplo:
criado para que as outras tabelas relacionadas se reram
a ela por este campo. Impede mais de um registro com FOREIGN KEY (campoa, campob)
valores iguais. a combinao interna de UNIQUE e REFERENCES tabela1 (campoa, campob)
NOT NULL.
ON UPDATE CASCADE
Qualquer campo em outra tabela do banco pode se referir
ao campo chave primria, desde que tenham o mesmo ON DELETE CASCADE);
tipo de dados e tamanho da chave primria.
Cuidado com excluso em cascata. Somente utilize com
certeza do que faz.
Exemplo:
clientes (codigo INTEGER, nome_cliente VAR- Dica: Caso desejemos fazer o relacionamento com um
campo que no seja a chave primria, devemos passar este
CHAR(60))
campo entre parnteses aps o nome da tabela e o mesmo
codigo nome_cliente
deve obrigatoriamente ser UNIQUE.
1 PostgreSQL inc.
...
2 RedHat inc.
98
REFERENCES
99
BLE: http://www.postgresql.org/docs/8.0/interactive/
sql-createtable.html
ALTER TABLE http://www.postgresql.org/docs/8.0/
interactive/sql-altertable.html
CASCADE (Em Cascata) - Quando o campo da chave Chave Primria Composta (dois campos)
primria atualizado, registros na tabela referenciada so
CREATE TABLE tabela (
atualizados.
Exemplo: Funciona: Ao tentar usar UPDATE clientes codigo INTEGER,
SET codigo = 5 WHERE codigo = 2. Ele vai tentar atu- data DATE,
alizar o cdigo para 5 e vai atualizar esta chave tambm
nome VARCHAR(40),
na tabela pedidos.
SET NULL (atribuir NULL) - Quando um registro na PRIMARY KEY (codigo, data)
chave primria atualizado, todos os campos dos regis- );
tros referenciados a este so setados para NULL.
Exemplo: UPDATE clientes SET codigo = 9 WHERE
codigo = 5; Na clientes o codigo vai para 5 e em pedidos,
todos os campos cod_cliente com valor 5 sero setados
para NULL.
SET DEFAULT (assumir o Default) - Quando um registro na chave primria atualizado, todos os campos
nos registros relacionados so setados para seu valor DEFAULT.
Exemplo: se o valor default do codigo de clientes 999,
ento
UPDATE clientes SET codigo = 10 WHERE codigo = 2.
Aps esta consulta o campo cdigo com valor 2 em clientes vai para 999 e tambm todos os campos cod_cliente
em pedidos.
ON DELETE parametros:
NO ACTION (RESTRICT) - Quando um campo de
chave primria est para ser deletado, a excluso ser
abortada caso o valor de um registro na tabela referenciada seja mais velho. Este parmetro o default quando
esta clusula no recebe nenhum parmetro.
Exemplo: ERRO em DELETE FROM clientes WHERE
codigo = 2. No funcionar caso o cod_cliente em pedidos contenha um valor mais antigo que codigo em clientes.
CASCADE - Quando um registro com a chave primria
excludo, todos os registros relacionados com aquela
Captulo 50
Lembre que como uma contrib normalmente no vem Queremos atualizar para 0001, 0002, 0003, ... 0087
ligada e temos que ligar especicamente ao banco onde
UPDATE equipamentos SET insumo = '000' || insumo
queremos utilizar.
WHERE LENGTH(insumo) = 1;
Ligando, de dentro do banco usar o comando \i:
UPDATE equipamentos SET insumo = '00' || insumo
Acesse o diretrio lo das contribs do PostgreSQL:
WHERE LENGTH(insumo) = 2;
/usr/local/src/postgresql-8.1.3/contrib/lo
\i /usr/local/src/postgresql-8.1.3/contrib/lo/lo.sql
Para usar veja o README.lo no diretrio lo e tambm a Tendo uma tabela com registros e outra para onde desejo
incluir registros daquela
documentao ocial do PostgreSQL:
INSERT INTO equipamentos2 SELECT grupo, insumo,
Portugus do Brasil - Captulo 28:
descricao, unidade from equipamentos2;
http://pgdocptbr.sourceforge.net/pg80/largeobjects.
insert into engenharia.precos (insumo_grupo,insumo) sehtml
lect grupo,insumo from engenharia;
Ingls - Captulo 29: http://www.postgresql.org/docs/8.
Com CAST
1/interactive/largeobjects.html
into
engenharia.insumos
Nomes de Campos com espao ou acento devem vir entre insert
(grupo,insumo,descricao,unidade)
select
aspas duplas.
grupo,insumo,descricao, CAST(unidade AS int2)
Comentrios
AS unidade from engenharia.apagar
Em SQL os comentrios mais utilizados so da seguinte insert
into
engenharia.insumos
forma:
(grupo,insumo,descricao,unidade)
select
grupo,insumo,descricao, cast(unidade
AS unidade from engenharia.apagar
AS
INT2)
Atravs do PHP
$conn
=
pg_connect(host=10.40.100.186
name=apoena user=_postgresql);
for($x=10;$x<=87;$x++){
db-
101
AS
DATE)
Script el Perl
1. !/usr/bin/perl
$count = 1;
$arquivosaida = populate.sql";
@chars = (A .. Z, a .. z, 0 .. 9);
@numbers = (1 .. 9);
@single_chars = (a .. e);
1. print OUTPUT "\nCREATE INDEX index- SELECT isbn, title, publication FROM editions NATUteste_codigo_index ON index_teste(codigo);\n";
RAL JOIN books AS b (book_id)
ORDER BY publication DESC LIMIT 5;
1. print OUTPUT CREATE INDEX indexteste_numero_index ON index_teste(numero);\n"; SELECT isbn, title, publication FROM editions NATURAL JOIN books AS b (book_id)
1. print OUTPUT VACUUM ANALYZE in- ORDER BY publication DESC LIMIT 5 OFFSET 2;
dex_teste;\n";
102
Comando para alterar as variveis do kernel sem refsync - checa integridade dos dados gravados no banco, iniciar o Linux:
vindos dos logs. Vem ligado por padro
sysctl -w kernel.shmmax=309329920
Gargalo de SGBDs:
sysctl -w kernel.shmall=309329920
sysctl -w kernel.shmmni=1
apenas
os
ags:
Uso:
3.
ALTER TABLE novo_nome RENAME TO create table imagens (codigo int8, descricao varchar(60),
imagem img);
sua_tabela;
Construtor de Matriz
Osvaldo (Na lista PostgreSQL-Brasil).
Calculando a Memria a ser usada pelo PostgreSQL Matriz unidimensional - array[2,4,6+2]
SELECT array[2,4,6+2]; -- Retorna 2,4,8
Shared Buers
Obs.: O ndice do valor da matriz construdo com ARRAY sempre comea com um.
array[array[2,4,6],array[1,3,5]] ou
A Shared Memory ser igual a shared buer + (de 10 a
array[[2,4,6],[1,3,5]]
20)%
Com subconsultas. Entre parnteses e no concletes.
Shared Memory = 256MB + 15%
256MB + 15% = 295 MB
295MB = 295 * 1024 * 1024 = 309329920
No Linux:
/etc/sysctl.conf
kernel.shmmax = 309329920
kernel.shmall = 309329920
kernel.shmmni = 1
Retorna: 1244,31,1948,1949,1950,1951,1952,1953,1954,2005,2006,2011
ENCONTRAR REGISTROS DUPLICADOS
SELECT DISTINCT cep FROM cep_tabela
WHERE cep IN (SELECT cep FROM cep_tabela AS
Tmp GROUP BY cep,tipo,logradouro, bairro, municipio,uf HAVING Count(*) >1 ) ORDER BY cep;
103
(Adaptao de consulta gerada pelo assistente Encontrar cape para escrever caracteres especiais:
duplicadas do Access).
SELECT 'Editora O\'Reyle';
Ou:
Concatenao de expresses no terminal:
select count(*) as quantos, cep from cep_tabela group by SELECT 'Concate'
cep having count(*) > 1;
'nao';
REMOVER DUPLICADOS
Equivale a:
Para tabelas criadas WITH OIDS:
SELECT 'Concatenao';
DELETE FROM cep_tabela2 WHERE oid NOT IN
Quando resolvendo expresses matemticas usar parn(SELECT min(oid) FROM cep_tabela2 GROUP BY teses para tornar mais claras as precedncias.
cep, tipo, logradouro, bairro, municipio, uf);
Convertendo para Nmeros
Do exemplo 8.10 do manual em portugus do Brasil.
SELECT TO_NUMBER('0' || '1,500.64',99999999.99);
Ou:
Total de 8 dgitos com 2 decimais.
Criando uma segunda tabela que conter somente os registros exclusivos e ainda guarda uma cpia da tabela ori- Variveis no psql
ginal:
\pset null '(nulo)' -- traduzindo null por nulo
CREATE TABLE cep_tabela2 AS SELECT cep, tipo, SELECT NULL;
logradouro, bairro, municipio, uf FROM cep_tabela
GROUP BY cep, tipo, logradouro, bairro, municipio, uf \set variavel 14 -- Dando valor 14 varivel
ORDER BY cep;
SELECT :variavel;
Caso no importe qual das duplicatas ir permanecer:
CREATE TABLE tab_temp AS SELECT DISTINCT * CREATE TABLE tabeladestino AS SELECT * FROM
FROM tabela;
tabelaorigem;
DROP tabela;
phpPgGIS
geomtricos
O OpenGEO tem atuado no mercado brasileiro de Geotecnologias com solues inovadoras com base em softarrays
ware livre e j ganhou referncia internacional com alA exceo para os demais tipos numricos: date guns importantes projetos como o Open 3D GIS e o Ge18/12/2005 numeric 12345.45
oLivre Linux.
Caracteres Especiais
Este sistema vai integrar a soluo de Hosting que a emPara poder escrever uma barra no valor de uma constante, presa dever lanar nas prximas semanas.
usa-se duas barras:
Algumas Denies
SELECT '\\Barra';
Cursor
Replicao
PostgreSQL tambm permite o uso de caracteres de es- a distribuio de dados corporativos para vrios locais
104
ou liais de uma empresa, oferecendo conabilidade, tolerncia a falhas, melhor desempenho e capacidade de
gerenciamento.
Criptograa Seu objetivo tornar os dados comuns em
bits de aparncia completamente aleatria.
MAISCULAS E MINSCULAS NO POSTGRESQL
Ao digitar nomes de tabelas e campos em Maisculas
eles sero convertidos automaticamente para minsculas,
a no ser que sejam digitados entre aspas duplas:
SELECT * FROM CLIENTES";
Recomendao: evitar o uso de maisculas e de acentos
em nomes de bancos, tabelas e campos.
POSTGRESQL NO CONECTA?
Do site do Rodrigo Hjort (http://agajorte.blogspot.com/
2009/03/meu-postgresql-nao-conecta.html)
- Pingar no IP
- Vericar o pg_hba.conf - host, banco, usurio IP e senha
- Caso aparea Is the server running on host..
- Testar com telnet IP porta (Ctrl+C para sair)
- No postgresql.conf - listen_addresses = 'IP'
- Salvar e restartar o SGBD.
Contador de Resultados
Indicado para consultas e relatrios (no grava)
CREATE TEMP SEQUENCE seq;
SELECT nexval('seq'), * FROM esquema.tabela;
(Salvador S. Scardua na lista PostgreSQL Brasil)
LIMITES DO POSTGRESQL
Tamanho de um Banco de Dados - ilimitado
Tamanho de uma tabela - 32 TB
Quantidade de registros por tabela - ilimitados
Quantidade de campos por tabela - 250 a 1600 (depende
do tipo)
Quantidade de ndices por tabela - ilimitados
Captulo 51
Existem duas principais formas de melhorar o desempenho de SGBDs: uma melhorando o hardware, com
CPUs, RAM, Discos mais novos, rpidos e conveis.
A outra otimizando as consultas realizadas nos bancos
(usando VACUUM, VACUUM ANALYZE, EXPLAIN,
criando CLUSTERS, entre outros).
Uma das medidas bsicas adotada para melhorar o desempenho de tabelas com grandes quantidades de registros e especialmente com muitos acessos, a incluso de
ndices estratgicos. Alm da chave primria importante inserir ndices em campos que compem a clusula WHERE, que fazem parte de clusulas ORDER BY,
GROUP BY entre outras. Em consultas com WHERE
de vrios campos usando OR, no adianta inserir ndice,
pois no ser utilizado pelo PostgreSQL, somente usando
AND.
Na criao do banco de dados e especialmente na criao
das consultas muito importante atentar para um bom
planejamento, normalizao, consultas otimizadas tendo
em vista o planejador de consultas do PostgreSQL atravs
do uso dos comandos EXPLAIN e ANALYZE.
106
vel (incluindo a memria j alocada para o shared buffers), tambm o nmero mdio de conexes e o uso da
memria virtual (swap).
Exemplo:
Considerando um servidor dedicado (rodando somente o
servidor PostgreSQL), com memria RAM de 1,5GB e
com at 10 conexes simultneas com o SGBD:
shared_buers = 80000 # 80.000 blocos de 8KB = 625
MB
sort_mem = 64000 # tamanho em KB = 62,5 MB, para
cada usurio com
# 10 usurios = 526 MB
vacuum_mem = 2000
Por exemplo: queremos x KB para memria individual
sort_men
( x * 1024 ) = resultado para memria individual
x = 16
(16 * 1024) = sort_mem = 16384
Seria bom mudar tambm memria para vaccum
vacuum_mem = 131072 (mesmo clculo do sort_mem)
Uso de Vrios Discos
Em sistemas com mais de um disco podemos melhorar a
performance do mesmo distribuindo algumas tarefas entre discos diferentes.
107
CREATE INDEX nome_idx ON nometabela (nome- Denem um bloco de memria que o PostgreSQL usar
campo) TABLESPACE nometablespace;
para lidar com requisies que esto aguardando ateno
ALTER TABLE nometabela ADD CONSTRAINT no buer do kernel e na CPU.
nome_pk PRIMARY KEY (nomecampo);
ALTER INDEX nome_idx SET TABLESPACE nometablespace;
Ainda podemos separar astabelas mais utilizadas para
o hdb, utilizando o comando tablespace no PostgreSQL
8.1.3 podemos fazer isso:
108
Congura a memria alocada para Vacuum. Deve acele- print OUTPUT CREATE TABLE index_teste (";
rar permitindo que PostgreSQL copie grandes quantida- print OUTPUT codigo INT, nome VARCHAR(10), nudes para a memria.
mero INT, letra CHAR(1)";
Entre 16-32MB uma boa quantidade para muitos siste- print OUTPUT ");\n";
mas.
print OUTPUT COPY index_teste (codigo, nome, numax_fsm_pages
mero, letra) FROM stdin;\n";
PostgreSQL grava espao livre em cada uma de suas p- while ($count <= $totalrecords){
ginas de dados.
$randstring = join("", @chars [map{rand @chars} ( 1 .. 8
Caso tenha um banco que usa muitos updates e deletes, ) ]); $randnum = join("", @numbers [map{rand @numque ir gerar registros mortos, devido ao sistema MVCC bers} ( 1 .. 8 ) ]); $randletter = join("", @single_chars
do PostgreSQL, ento expanda o FSM para cobrir todos [map{rand @single_chars} (1)]); print OUTPUT
estes registros deads (mortos) e nunca mais precisar ro- #print OUTPUT INSERT INTO index_teste VAdar vacuum full a no ser em feriados.
LUES($count,'$randstring',$randnum,'$randletter');\n";
$count."\t.$randstring."\t.$randnum."\t.$randletter."\n";
O mnimo FSM max_fsm_relations * 16.
$count++;
max_fsm_relations
};
Diz quantas tabelas devem ser localizadas no mapa de espao livre.
1. print OUTPUT "\n";
wal_buers
Esta congurao decide a quantidade de buers WAL
(Write Ahead Log) que pode ter.
Para chegar a uma quantidade tima experimente e decida.
Um bom incio est em torno de 32 a 64 correspondendo
a 256-516 KB de memria.
Ativar o subprocesso do auto Vacuum
Captulo 52
Exerccios
52.1 16 Exerccios
);
3)
Exemplo Prtico
Vamos criar um banco (clientes_ex), contendo uma tabela (cliente) e um usurio (operador) que ter apenas alguns privilgios de acesso tabela cliente (INSERT, SELECT, UPDATE) e ser obrigado a utilizar senha. Veja
que no ter privilgio DELETE. Ento adicionar alguns
registros e executar consultas dos quatro tipos: INSERT,
SELECT, UPDATE e DELETE (este apenas para vericar se realmente ele no tem este privilgio).
1)
RESET CLIENT_ENCODING;
4)
ALTER DATABASE clientes_ex SET DATESTYLE = Fazer o login como usurio operador para executar as
consultas abaixo:
SQL, DMY;
-- No caso este banco apenas car com esta congurao INSERT INTO cliente (codigo, nome, data_nasc, bonus,
observacao) VALUES (1, 'Joo Pedro', '01/01/1967',
de data
18.35, 'Apenas um texto de teste');
-- Para alterao denitiva para todos os bancos alterar o
INSERT INTO cliente (codigo, nome, data_nasc, boscript postgresql.conf.
nus, observacao) VALUES (2, 'Pedro Paulo Rosado',
Exibindo o DateStyle Atual
'04/11/1973', 25.35, );
SHOW DATESTYLE;
INSERT INTO cliente (codigo, nome, data_nasc, bonus,
2)
CREATE TABLE cliente (
codigo INT PRIMARY KEY,
nome VARCHAR(40) NOT NULL,
data_nasc DATE NOT NULL,
bonus NUMERIC(12,2),
observacao 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
Referncias
53.1 17 - Referncias
http://www-128.ibm.com/developerworks/db2/library/
techarticle/dm-0606khatri/
www.postgresql.org/docs/books/pghandbuch.html.de
http://www-128.ibm.com/developerworks/db2/library/
techarticle/dm-0603wasserman2/
http://archives.postgresql.org/index.php?adv=1
Site Ocial
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