Postgres – Instalação no Línux

Instalação

Para instalar o PostgreSQL no Ubuntu digite o comando:

Use sudo se não estiver com usuário root

sudo apt-get install postgresql-8.4

(O postgres é instalado com usuário “postgres” e senha em branco “”)

Mudando senha do postgres

sudo su postgres psql (startando o postgres)

$ psql postgres (modo edição)

No console do psql (alterando a senha)

ALTER USER postgres WITH PASSWORD 'NOVA SENHA';

Sair

Restart o serviço:

invoke-rc.d postgresql-8.4 restart

ou

root@gaya:/etc/init.d# sudo service postgresql-8.4 start

root@gaya:/etc/init.d# sudo service postgresql-8.4 stop

Sair:

\q

ou CTRL+D

Configurando o postgresql.conf (PARA ACESSO REMOTO!!!)

Se estiver com o root: vi /etc/postgresql/8.4/main/postgresql.conf

sudo vi /etc/postgresql/8.4/main/postgresql.conf

Localizar a linha:

listen_addresses = 'localhost'

e mudar para

listen_addresses = '*' (aceita tudo)

remova o carácter de comentário (#) da linha.

A opção listen_addresses permite definir qual host pode se conectar no servidor, exemplo: localhost somente para conexões locais, * para qualquer host ou um ip especifico como: 192.168.1.236
Configurando pg_hba.conf

sudo vi /etc/postgresql/8.4/main/pg_hba.conf

Adicionar no fim do arquivo a linha:

host all all 192.168.1.0/24 md5

ou para abrir para qualquer rede:
host all all 0.0.0.0/0 md5
ou
host all all 0.0.0.0/0 trust
Essa configuração especifica na ordem:
  • host: Define regras para protocolo TCP/IP, essa opção pode ser host, local ou hostssl
  • all: Define qual banco dados que essa regra se aplica, se definido all será para todos.
  • all: Define qual usuário tem permissão para usar essa regra, se definido all será para todos.
  • 192.168.1.0/24: Padrão CIDR, define qual faixa de ip’s podem se conectar no servidor através do padrão CIDR.
  • md5: Método de autenticação, md5 padrão, trust para aceitar, reject para negar e mais algumas outras opções.

Reiniciar o PostgreSQL

sudo /etc/init.d/postgresql-8.2 restart

root@gaya:/etc/init.d# sudo service postgresql-8.4 start

Usuários de banco de dados

usuário – CRIAR UM NOVO

Para pode criar um novo usuário é necessário estar logado com o usuário postgres.

sudo su postgres

Existem duas formas de criar e deletar um usuário, uma através de shell e outra através do cliente postgre.
Shell

createuser nei
createuser patrick

Cliente postgres


psql
CREATE USER nei;
CREATE USER patrick;

As duas opções criam nei e patrick como superusuários.

Exemplos

Definindo password

CREATE USER nei PASSWORD ‘nei’;

Definindo privilégios de superusuário, permissão para criar databases e roles

CREATE USER nei SUPERUSER INHERIT CREATEDB CREATEROLE;

http://pgdocptbr.sourceforge.net/pg80/sql-createuser.html

Deletar usuário
Shell

dropuser nei
dropuser patrick

Cliente postgres

psql
DROP USER nei;
DROP USER patrick;

Alterar usuário

ALTER USER nei PASSWORD '123';

http://pgdocptbr.sourceforge.net/pg80/sql-alteruser.html

BANCO – CRIAR UM NOVO

Criando usuario e banco de dados

sudo -u postgres createuser -D -A -P myuser

Para criar o banco de dados com suporte ao conjunto de caracteres ISO-8859-1:

sudo -u postgres createdb -O myuser mydb -E LATIN1

Excluindo base de dados

sudo -u postgres dropdb mydb

Instalando e configurando o PostgreSQL 8.3 no Ubuntu

Original em: http://jmmwrite.wordpress.com/2008/05/08/instalando-e-configurando-o-postgresql-83-no-ubuntu/

No meu ambiente de desenvolvimento, eu sempre utilizo dois bancos: o Postgres e o DB2. Basicamente devido ao fato de minha instalação de DB2 ser pesada pois tenho várias configurações de Data Warehouse e um banco muito carregado, o que torna o banco mais pesado para meu simples desktop. Então, para debugar meus softwares, vou com meu postgres levinho mesmo.

Minha idéia aqui é mostrar como instalar e configurar o PostgreSQL 8.3 no Ubuntu 8.04. As configurações são as mesmas para a instalação em Windows, a única diferença obvia é que você irá ter que ir ao site do postgres e baixar o Installer do Windows.

Vamos lá, iniciamos a instalação com o comando:

sudo apt-get install postgresql-8.3 postgresql-client-8.3

Recomendo também instalar o pgAdmin, que é uma ferramenta para administrar o postgres:

sudo apt-get install pgadmin3 pgadmin3-data


Algo que aconteceu comigo na migração para o Ubuntu 8.04, foi que tive que remover o Postgres 8.2 (apt-get purge postgresql-8.2) para conseguir iniciar o 8.3 corretamente. Se você concluir meus passos aqui e mesmo assim não conseguir conectar no Postgres, recebendo algum erro, provavelmente terá que dar o purge. (talvez com mais tempo de pesquisa eu poderia descobrir qual era o problema… se alguem passar por isso me diga please).

O próximo passo é setar uma senha para o usuário postgres com os seguintes comandos:

sudo su postgres -c psql postgres
ALTER USER postgres WITH PASSWORD ‘password’;
\q

O primeiro comando chama o utilitário psql com o usuário postgres e conecta no postgres especificamente no database postgres.
O segundo comando altera a senha do usuário postgres.
O terceiro comando finaliza o psql.
Note que a palavra password deve ser substituida pela password que você desejar.

Feito a instalação e mudança de senha do usuário postgres, você estará apto a desenvolver um trabalho no seu computador conectando normalmente ao postgres, porém, se a idéia é disponibilizar o acesso ao banco para receber conexões de outras máquinas, você vai ter que alterar dois arquivos para isso. Para isso, vá para o diretório /etc/postgres/8.3/main

Edite o arquivo postgresql.conf

Na linha listen_addresses, troque o localhost por *, ficando a linha assim:

listen_addresses = ‘*’

Dessa forma seu postgres vai “escutar” não só conexoes provenientes da sua própria máquina.

A próxima configuração no mesmo arquivo é habilitar a encriptação de passwords, para fazer isso descomente a linha abaixo simplesmente removendo o # da frente dela:

password_encryption = on

Finalmente a próxima configuração é no arquivo pg_hba.conf. Neste arquivo você consegue restringir o acesso ao seu banco de dados por IP. Normalmente queremos liberar o acesso para todos os IPs em uma faixa, no meu exeplo, quero liberar para todas as máquinas da rede 10.5.2.*, então eu adiciono a seguinte linha no meu pg_hba.conf:

host    all    all    10.5.2.0    255.255.0.0    md5

Feito isso, basta reiniciar o postgres com o comando:

sudo /etc/init.d/postgresql-8.3 restart

Mais comandos:

Original em:

Os comandos do PostgreSQL são parecidos com os comandos do MySQL, só há algumas pequenas diferenças. Caso surja alguma dúvida ao ler este artigo: visite a documentação (ajuda) do PostgreSQL no site oficial.

Com o PostgreSQL já instalado em sua máquina, para acessá-lo digite o comando:

$ psql

Aparecerá a seguinte mensagem de ‘bem-vindo’:

Welcome to psql 7.4.2, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help on internal slash commands
       \g or terminate with semicolon to execute query
       \q to quit

Precisando de uma ajudazinha é só digitar: \h

Desta forma, aparecerá uma listagem dos comandos do PostgreSQL. Caso você queira ter mais detalhes sobre o comando ‘CREATE DATABASE’ digite:

\h CREATE DATABASE

OBS.: Não digite ‘\h CREATE DATABASE;’ (com ponto-e-vírgula ; no final) pois assim aparecerá uma mensagem de erro.

Criando, acessando e adicionando dados: banco de dados e tabela

Para criar um banco de dados, fazemos:

CREATE DATABASE nosso_banco_de_dados; // utiliza-se ponto-e-vírgula no final de cada comando SQL

Para acessar este banco de dados que acabamos de criar (único modo que sei fazer):

Saímos do PostgreSQL usando: \q

Retornamos ao PostgreSQL usando o comando:

psql nosso_banco_de_dados

Agora que estamos acessando nosso banco de dados, iremos criar uma simples tabela nele.

CREATE TABLE tabela_noticia (

titulo VARCHAR(90), — título da notícia

conteudo TEXT — texto da notícia

);

Alguns comentários:

‘CREATE TABLE’ é o comando utilizado para criar uma tabela.

‘tabela_noticia’ é o nome da tabela.

‘titulo’ é uma coluna da tabela_noticia e ‘VARCHAR(90)’ é o tipo de variável desta coluna (VARCHAR(X) = X caracteres).

‘conteudo’ outra coluna da tabela_noticia e ‘TEXT’ é o tipo da variável desta coluna.

Dois traços ‘–’ introduz um comentário, o PostgreSQL ignora o que vem depois deles.

Para saber mais sobre o comando ‘CREATE TABLE’ digite:

\h CREATE TABLE

Para inserir uma notícia com o título: ‘minha primeira noticia’ e com o conteúdo: ‘esta eh a minha primeira noticia’, devemos usar o seguinte comando:

INSERT INTO tabela_noticia (titulo, conteudo) VALUES (‘minha primeira noticia’, ‘esta eh a minha primeira noticia’);

Pronto, se tudo correu bem, sem nenhum erro, então temos um banco de dados, uma tabela e dados inseridos nesta tabela. Para vermos os dados salvos nesta tabela, ou seja, para lermos as notícias gravadas, digitamos o comando:

SELECT * FROM tabela_noticia;

Receberemos o texto de resposta:

titulo | conteudo

————————+———————————-

minha primeira noticia | esta eh a minha primeira noticia

(1 row)

Minha pequena ajuda acaba por aqui. Sim, só pra concluir, se não gostou desta tabela, para excluí-la faça:

DROP TABLE tabela_noticia;

e para apagar o BANCO DE DADOS (único modo que sei fazer):

Saia do PostgreSQL: \q

Volte ao PostgreSQL: psql

Depois digite:

DROP DATABASE nosso_banco_de_dados;

\q

Listar databases, schemas, colunas, conectar ao banco e listar colunas de uma tabela no Postgres

Este post vem informar como listar databases, schemas, tabelas, colunas de uma tabela do banco Postgree via terminal.
Primeiramente acesse o banco via terminal da seguinte maneira

root@server:~# su – postgres
postgres@server:~$ psql
Bem vindo ao psql 8.3.9, o terminal iterativo do PostgreSQL.

Digite: \copyright para mostrar termos de distribuição
\h para ajuda com comandos SQL
\? para ajuda com comandos do psql
\g ou terminar com ponto-e-vírgula para executar a consulta
\q para sair
postgres=#

Agora vamos listar as databases com o \L

postgres=# \l
Lista dos bancos de dados
Nome | Dono | Codificação
———————–+———-+————-
banco1 | nomedono | UTF8
banco2 | nomedono | UTF8

Conectar ao banco:
1)Sair do postgres com \q
2)psql -h [ip_host] [nome_banco] [dono]

postgres@server:~$ psql -h ???.com.br digitacao_???? usuario
Senha para usuário usuario:
Bem vindo ao psql 8.3.9, o terminal iterativo do PostgreSQL.

Digite: \copyright para mostrar termos de distribuição
\h para ajuda com comandos SQL
\? para ajuda com comandos do psql
\g ou terminar com ponto-e-vírgula para executar a consulta
\q para sair

conexão SSL (cifra: DHE-RSA-AES256-SHA, bits: 256)

digitacao_???=#

Ver Schemas do banco, tabelas e donos:
ainda conectado ao banco digite a query abaixo

QUERY
========
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

RESPOSTA
=========
esquema | tabela | dono
———-+—————–+——–
cadastro | cadastros | master
usuario | perfis | master
usuario | perfis_usuarios | master
usuario | usuarios | master
(4 registros)

E, para finalizar, como listar as colunas da tabela:
digitacao_???=# \d [schema].[tabela]

digitacao_???=# \d usuario.perfis
Tabela “usuario.perfis”
Coluna | Tipo | Modificadores
——–+————————+———————————————————-
id | integer | not null default nextval(‘usuario.seq_perfis’::regclass)
nome | character varying(100) | not null
Índices:
“perfis_pkey” PRIMARY KEY, btree (id)

digitacao_foxlux=# \d usuario.perfis
Tabela “usuario.perfis”
Coluna | Tipo | Modificadores
——–+————————+———————————————————-
id | integer | not null default nextval(‘usuario.seq_perfis’::regclass)
nome | character varying(100) | not null
Índices:
“perfis_pkey” PRIMARY KEY, btree (id)

PostgreSQL Prático/Metadados

12 – Metadados (Catálogo)

Metadados são dados sobre dados.

Uma consulta normal retorna informações existentes em tabelas, já uma consulta sobre os metadados retorna informações 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


Informações de Todos os Tablespaces

SELECT spcname, pg_catalog.pg_get_userbyid(spcowner) AS spcowner, spclocation
 FROM pg_catalog.pg_tablespace


Retornar banco, dono, codificação, comentários e tablespace

SELECT pdb.datname AS banco, 
 pu.usename AS dono, 
 pg_encoding_to_char(encoding) AS codificacao,
 (SELECT description FROM pg_description pd WHERE pdb.oid=pd.objoid) AS comentario,
 (SELECT spcname FROM pg_catalog.pg_tablespace pt WHERE pt.oid=pdb.dattablespace) AS tablespace
 FROM pg_database pdb, pg_user pu WHERE pdb.datdba = pu.usesysid ORDER BY pdb.datname


Tabelas, donos, comentários, registros e tablespaces de um schema

SELECT c.relname as tabela, 
 pg_catalog.pg_get_userbyid(c.relowner) AS dono, 
 pg_catalog.obj_description(c.oid, 'pg_class') AS comentario, reltuples::integer as registros,
 (SELECT spcname FROM pg_catalog.pg_tablespace pt WHERE pt.oid=c.reltablespace) AS tablespace
 FROM pg_catalog.pg_class c
 LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
 WHERE c.relkind = 'r' AND nspname='public'
 ORDER BY c.relname


Mostrar Sequences de um Esquema

SELECT c.relname AS seqname, u.usename AS seqowner, pg_catalog.obj_description(c.oid, 'pg_class') AS seqcomment,
 (SELECT spcname FROM pg_catalog.pg_tablespace pt WHERE pt.oid=c.reltablespace) AS tablespace
 FROM pg_catalog.pg_class c, pg_catalog.pg_user u, pg_catalog.pg_namespace n
 WHERE c.relowner=u.usesysid AND c.relnamespace=n.oid
 AND c.relkind = 'S' AND n.nspname='public' ORDER BY seqname


Mostrar Tablespaces

SELECT spcname, pg_catalog.pg_get_userbyid(spcowner) AS spcowner, spclocation
 FROM pg_catalog.pg_tablespace 


Mostrar detalhes de uma function

SELECT 
 pc.oid AS prooid,
 proname,
 lanname as prolanguage,
 pg_catalog.format_type(prorettype, NULL) as proresult,
 prosrc,
 probin,
 proretset,
 proisstrict,
 provolatile,
 prosecdef,
 pg_catalog.oidvectortypes(pc.proargtypes) AS proarguments,
 proargnames AS proargnames,
 pg_catalog.obj_description(pc.oid, 'pg_proc') AS procomment
FROM pg_catalog.pg_proc pc, pg_catalog.pg_language pl
WHERE pc.oid = 'oid_da_function'::oid
AND pc.prolang = pl.oid


Este exemplo mostra uma consulta que lista os nomes dos esquemas, tabelas, colunas e chaves das chaves estrangeiras, e os nomes dos esquemas, tabelas e colunas referenciadas. Exemplo tirado da lista de discussão pgsql-sql

CREATE TEMPORARY TABLE t1 (id SERIAL PRIMARY KEY, nome TEXT);
CREATE TEMPORARY TABLE t2 (id INT REFERENCES t1, nome TEXT);
SELECT
 n.nspname AS esquema,
 cl.relname AS tabela,
 a.attname AS coluna,
 ct.conname AS chave,
 nf.nspname AS esquema_ref,
 clf.relname AS tabela_ref,
 af.attname AS coluna_ref,
 pg_get_constraintdef(ct.oid) AS criar_sql
FROM pg_catalog.pg_attribute a
 JOIN pg_catalog.pg_class cl ON (a.attrelid = cl.oid AND cl.relkind = 'r')
 JOIN pg_catalog.pg_namespace n ON (n.oid = cl.relnamespace)
 JOIN pg_catalog.pg_constraint ct ON (a.attrelid = ct.conrelid AND
 ct.confrelid != 0 AND ct.conkey[1] = a.attnum)
 JOIN pg_catalog.pg_class clf ON (ct.confrelid = clf.oid AND clf.relkind = 'r')
 JOIN pg_catalog.pg_namespace nf ON (nf.oid = clf.relnamespace)
 JOIN pg_catalog.pg_attribute af ON (af.attrelid = ct.confrelid AND
 af.attnum = ct.confkey[1]);


Mostrar 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 att's
 and not a.attisdropped -- no dropped columns
 and a.attrelid = c.oid
 and a.atttypid = t.oid
 ORDER BY nspname, relname, attname;


Mostrar Esquemas e respectivas tabelas do Banco atual:

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


Contar Todos os Registros de todas as tabelas de todos os bancos:

<?php
$conexao=pg_connect("host=127.0.0.1 user=postgres password=postabir");
$sql="SELECT datname AS banco FROM pg_database ORDER BY datname";
$consulta=pg_query($conexao,$sql);
$banco = array();
$c=0;
while ($data = @pg_fetch_object($consulta,$c)) {
 $cons=$data->banco; 
 $banco[] .= $cons;
 $c++;
}
$sql2="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";
for ($x=0; $x < count($banco);$x++){
 if ($banco[$x] !="template0" && $banco[$x] != "template1" && $banco[$x] !="postgres"){
 $conexao2=pg_connect("host=127.0.0.1 dbname=$banco[$x] user=postgres password=postabir");
 $consulta2=pg_query( $conexao2, $sql2 ); 
 while ($data = pg_fetch_object($consulta2)) {
 $esquematab=$data->esquema.'.'.$data->tabela;
 $sql3="SELECT count(*) FROM $esquematab";
 $consulta3=pg_query($conexao2,$sql3);
 $res=@pg_fetch_array($consulta3);
 print 'Banco.Esquema.Tabela -> 
 '.$banco[$x].'.'.$data->esquema.'.'.$data->tabela.' - Registro(s) - '.$res[0].'
';
 $total += $res[0];
 }
 }
}
print "Total de Registro de todas as tabelas de todos os bancos ". $total; 
?> 


Dado o banco de dados, qual o seu diretório:

select datname, oid from pg_database;


Dado a tabela, qual o seu arquivo:

select relname, relfilenode from pg_class;


Mostrar chaves primárias das tabelas do esquema public

select indexrelname as indice, relname as tabela from pg_catalog.pg_statio_user_indexes as A 
INNER JOIN pg_catalog.pg_index as B ON A.indexrelid=B.indexrelid WHERE A.schemaname='public' AND B.indisprimary = true;


Para visualizar como as consultas são feitas internamente via psql usamos o comando assim:

psql -U user banco -E


Vamos usar o banco municipios, criado com os municípios do Brasil. A tabela opt_cidades.

Veja Um Exemplo Que Retorna a Chave Primária da Tabela opt_cidades

SELECT ic.relname AS index_name, bc.relname AS tab_name, ta.attname AS column_name, i.indisunique AS unique_key, i.indisprimary AS primary_key

FROM pg_class bc, pg_class ic, pg_index i, pg_attribute ta, pg_attribute ia WHERE bc.oid = i.indrelid AND ic.oid = i.indexrelid AND ia.attrelid = i.indexrelid AND ta.attrelid = bc.oid AND bc.relname = ‘opt_cidades’ AND ta.attrelid = i.indrelid AND ta.attnum = i.indkey[ia.attnum-1] ORDER BY index_name, tab_name, column_name;


Retornará:

index_name | tab_name | column_name | unique_key | primary_key

opt_cidades_pkey | opt_cidades | id | t | t


Retornando o Nome do Esquema

 SELECT n.nspname AS "Esquema"
 FROM pg_catalog.pg_namespace AS n,
 pg_catalog.pg_class AS c
 WHERE c.relnamespace = n.oid AND c.relname='opt_cidades';

Retorno: Esquema


Retornar nomes de bancos:


SELECT datname AS banco FROM pg_database WHERE datname != ‘template0′ and datname != ‘template1′ and datname != ‘postgres’ ORDER BY datname


Retornar nomes e OIDs dos bancos:

SELECT oid, datname FROM pg_database;


Dado a tabela, qual o seu arquivo: select relname, relfilenode from pg_class;


No Windows

Podemos passar parâmetros para as macros, por exemplo:


doskey /exename=psql.exe dbinfo=SELECT datname,pg_encoding_to_char(encoding) FROM pg_database WHERE datname=’$1′;


E então apenas passar o parâmetro na linha de comando:

postgres=# dbinfo postgres


Listar tabelas, e dono do esquema atual:

SELECT n.nspname as “Schema”,

c.relname as “Tabela”,

CASE c.relkind WHEN ‘r’ THEN ‘table’ WHEN ‘v’ THEN ‘view’ WHEN ‘i’ THEN

‘index’ WHEN ‘S’ THEN ‘sequence’ WHEN ‘s’ THEN ‘special’ END as “Tipo”,

u.usename as “Dono”

FROM pg_catalog.pg_class c

LEFT JOIN pg_catalog.pg_user u ON u.usesysid = c.relowner

LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace

WHERE c.relkind IN (‘r’,)

AND n.nspname NOT IN (‘pg_catalog’, ‘pg_toast’)

AND pg_catalog.pg_table_is_visible(c.oid)

ORDER BY 1,2;


Listar Tabelas

select c.relname FROM pg_catalog.pg_class c

LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace

WHERE c.relkind IN (‘r’,) AND n.nspname NOT IN (‘pg_catalog’, ‘pg_toast’)

AND pg_catalog.pg_table_is_visible(c.oid);


SELECT tablename FROM pg_tables WHERE tablename NOT LIKE ‘pg%’ AND tablename NOT LIKE ‘sql\_%’


Listar todas as tabelas, índices, tamanho em KB e OIDs:

VACUUM; –Executar antes este comando

SELECT c1.relname AS tabela, c2.relname AS indice,

c2.relpages * 8 AS tamanho_kb, c2.relfilenode AS arquivo

FROM pg_class c1, pg_class c2, pg_index i

WHERE c1.oid = i.indrelid AND i.indexrelid = c2.oid

UNION

SELECT relname, NULL, relpages * 8, relfilenode

FROM pg_class

WHERE relkind = ‘r’

ORDER BY tabela, indice DESC, tamanho_kb;


Tabelas e Soma

SELECT tablename, SUM( size_kb )

FROM

( SELECT c1.relname AS “tablename”,

c2.relpages * 8 AS “size_kb”

FROM pg_class c1, pg_class c2, pg_index i

WHERE c1.oid = i.indrelid

AND i.indexrelid = c2.oid

UNION

SELECT relname, relpages * 8

FROM pg_class

WHERE relkind = ‘r’ ) AS relations

GROUP BY tablename;

– r = ordinary table, i = index, S = sequence, v = view, c = composite type, — s = special, t = TOAST table


Tamanho em bytes de um banco:

select pg_database_size(‘banco’);


Tamanho em bytes de uma tabela:

pg_total_relation_size(‘tabela’)


Tamanho em bytes de tabela ou índice:

pg_relation_size(‘tabelaouindice’)


Lista donos e bancos:

SELECT rolname as dono, datname as banco

FROM pg_roles, pg_database

WHERE pg_roles.oid = datdba

ORDER BY rolname, datname;


Nomes de bancos:

select datname from pg_database where datname not in (‘template0′,’template1′) order by 1


Nomes e colunas:

select tablename,’T’ from pg_tables where tablename not like ‘pg\_%’ and tablename not in (‘sql_features’, ‘sql_implementation_info’, ‘sql_languages’, ‘sql_packages’, ‘sql_sizing’, ‘sql_sizing_profiles’)

union

select viewname,’V’ from pg_views where viewname not like ‘pg\_%’


Tamanho de esquema e índice:

SELECT nspname,

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

sum( ( select sum(relpages)

 from pg_class i, pg_index idx
 where i.oid = idx.indexrelid
 and t.oid=idx.indrelid ) ) * cast( 8192 AS bigint ) as "index size",

sum ( relpages * cast( 8192 AS bigint ) + ( select sum(relpages)

 from pg_class i, pg_index idx
 where i.oid = idx.indexrelid
 and t.oid=idx.indrelid ) * cast( 8192 AS bigint ) ) as "size"

FROM pg_class t, pg_namespace

WHERE relnamespace = pg_namespace.oid

and pg_namespace.nspname not like ‘pg_%’

and pg_namespace.nspname != ‘information_schema’

and relkind = ‘r’ group by nspname;


Retornando Tabelas e Seus Donos de um Esquema


SELECT n.nspname as “public”,

 c.relname as "opt_cidades",
 CASE c.relkind WHEN 'r' THEN 'tabela' WHEN 'v' THEN 'view' WHEN 'i' THEN 'índice' WHEN 'S' THEN 

‘sequencia’ WHEN ‘s’ THEN ‘especial’ END as “Tipo”, u.usename as “Dono”

FROM pg_catalog.pg_class c

 LEFT JOIN pg_catalog.pg_user u ON u.usesysid = c.relowner
 LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace

WHERE c.relkind IN (‘r’,)

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

ORDER BY 1,2;


Retorno:

public | opt_cidades | Tipo | Dono

+——————+——–+———-

 

public | opt_cidades | tabela | postgres
public | opt_estado | tabela | postgres


Retornando o OID e o Esquema de uma Tabela

SELECT c.oid AS “OID”,

 n.nspname AS "Esquema",
 c.relname AS "Tabela"

FROM pg_catalog.pg_class c

 LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace

WHERE pg_catalog.pg_table_is_visible(c.oid)

 AND c.relname ~ '^opt_cidades$'

ORDER BY 2, 3;


Retorno:

 OID | Esquema | Tabela


Este exemplo mostra uma consulta que lista os esquemas, nomes das tabelas e nomes das colunas das chaves primárias de um banco de dados. Exemplo tirado da lista de discussão pgsql-sql .

CREATE TEMP TABLE teste1 (id INT, texto TEXT, PRIMARY KEY (id));

CREATE TEMP TABLE teste2 (id1 INT, id2 INT, texto TEXT, PRIMARY KEY (id1,id2));

\dt

SELECT

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


Este exemplo mostra uma consulta que lista os nomes dos esquemas, tabelas, colunas e chaves das chaves estrangeiras, e os nomes dos esquemas, tabelas e colunas referenciadas. Exemplo tirado da lista de discussão pgsql-sql

CREATE TEMPORARY TABLE t1 (id SERIAL PRIMARY KEY, nome TEXT);
CREATE TEMPORARY TABLE t2 (id INT REFERENCES t1, nome TEXT);
SELECT
 n.nspname AS esquema,
 cl.relname AS tabela,
 a.attname AS coluna,
 ct.conname AS chave,
 nf.nspname AS esquema_ref,
 clf.relname AS tabela_ref,
 af.attname AS coluna_ref,
 pg_get_constraintdef(ct.oid) AS criar_sql
FROM pg_catalog.pg_attribute a
 JOIN pg_catalog.pg_class cl ON (a.attrelid = cl.oid AND cl.relkind = 'r')
 JOIN pg_catalog.pg_namespace n ON (n.oid = cl.relnamespace)
 JOIN pg_catalog.pg_constraint ct ON (a.attrelid = ct.conrelid AND
 ct.confrelid != 0 AND ct.conkey[1] = a.attnum)
 JOIN pg_catalog.pg_class clf ON (ct.confrelid = clf.oid AND clf.relkind = 'r')
 JOIN pg_catalog.pg_namespace nf ON (nf.oid = clf.relnamespace)
 JOIN pg_catalog.pg_attribute af ON (af.attrelid = ct.confrelid AND
 af.attnum = ct.confkey[1]);

Retorno:

 esquema | tabela | coluna | chave | esquema_ref | tabela_ref | coluna_ref | 

criar_sql

pg_temp_1 | t2 | id | t2_id_fkey | pg_temp_1 | t1 | id | FOREIGN KEY (id) 

REFERENCES t1(id)


SELECT a.attnum, a.attname AS field, t.typname as type, a.attlen AS length, a.atttypmod-4 as lengthvar, a.attnotnull as notnull

 FROM pg_class c, pg_attribute a, pg_type t
 WHERE c.relname = 'apagar' AND a.attnum > 0 AND a.attrelid = c.oid AND a.atttypid = t.oid
 ORDER BY a.attnum;


Saída:

ID do campo, nomecampo, tipo, tamanho, nulo/nãonulo


Outros

SELECT ic.relname AS index_name, bc.relname AS tab_name, ta.attname AS column_name, i.indisunique AS unique_key, i.indisprimary AS primary_key

 FROM pg_class bc, pg_class ic, pg_index i, pg_attribute ta, pg_attribute ia
 WHERE (bc.oid = i.indrelid)
 AND (ic.oid = i.indexrelid)
 AND (ia.attrelid = i.indexrelid)
 AND (ta.attrelid = bc.oid)
 AND (bc.relname = 'apagar')
 AND (ta.attrelid = i.indrelid)
 AND (ta.attnum = i.indkey[ia.attnum-1])
 ORDER BY index_name, tab_name, column_name


Saída:

nomeindex/chave, nometabela, nomecampo, unique(t/f), nomepk (t/f)


SELECT rcname as index_name, rcsrc

 FROM pg_relcheck, pg_class bc
 WHERE rcrelid = bc.oid
 AND bc.relname = 'apagar'
 AND NOT EXISTS (
 SELECT *
 FROM pg_relcheck as c, pg_inherits as i
 WHERE i.inhrelid = pg_relcheck.rcrelid
 AND c.rcname = pg_relcheck.rcname
 AND c.rcsrc = pg_relcheck.rcsrc
 AND c.rcrelid = i.inhparent
 )

Saída: retorna as constraints check.

SELECT pg_class.relname, pg_attribute.attname, pg_type.typname, pg_attribute.atttypmod-4 
 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'


Saída: tabela, campo, tipo, tamanho (varchar)


Outros Exemplos

create table tabela_exemplo (

campo_1 integer default 5, campo_2 text default ‘exemplo’, campo_3 float(10),

campo_4 serial, campo_5 double precision, campo_6 int8, campo_7 Point,

campo_8 char(3), campo_9 varchar(17) );

Depois de criada a tabela vamos criar a consulta que nos retornará as informações da tabela:

SELECT

rel.nspname AS Esquema, rel.relname AS Tabela, attrs.attname AS Campo, “Type”, “Default”, attrs.attnotnull AS “NOT NULL”

FROM (

SELECT c.oid, n.nspname, c.relname

FROM pg_catalog.pg_class c

LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace

WHERE pg_catalog.pg_table_is_visible(c.oid) ) rel

JOIN (

SELECT a.attname, a.attrelid, pg_catalog.format_type(a.atttypid, a.atttypmod) as “Type”,

(SELECT substring(d.adsrc for 128) 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 = ‘tabela_exemplo’ ORDER BY attrs.attnum;

Retorno: testes-# WHERE relname = ‘tabela_exemplo’ ORDER BY attrs.attnum;

esquema | tabela | campo | Type | Default | NOT NULL

Antes de tudo devemos criar um novo tipo de dado relacionado ao retorno que obteremos da função:

CREATE TYPE tabela_estrutura AS (Esquema text, Tabela text, Campo text, Tipo text, Valor text, AutoIncremento bool);


A função abaixo é definida em PL/PgSQL, linguagem procedural muito semelhante ao PL/SQL do Oracle. A função foi criada nesta linguagem devido a certas limitações que as funções em SQL possuem.

CREATE OR REPLACE FUNCTION Dados_Tabela(varchar(30))
 RETURNS SETOF tabela_estrutura AS '
DECLARE
 r tabela_estrutura%ROWTYPE;
 rec RECORD;
 vTabela alias for $1;
 eSql TEXT;
BEGIN
 eSql := SELECT
 CAST(rel.nspname as TEXT), CAST(rel.relname AS TEXT) , CAST(attrs.attname AS TEXT), 
 CAST("Type" AS TEXT), CAST("Default" AS TEXT), attrs.attnotnull
 FROM
 (SELECT c.oid, n.nspname, c.relname
 FROM pg_catalog.pg_class c
 LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
 WHERE pg_catalog.pg_table_is_visible(c.oid) ) rel
 JOIN 
 (SELECT a.attname, a.attrelid,
 pg_catalog.format_type(a.atttypid, a.atttypmod) as "Type",
 (SELECT substring(d.adsrc for 128) 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 % não encontrada, vTabela;
END IF;
RETURN;
END
' 
LANGUAGE 'plpgsql';

Para utilizar esta função, 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 att's
 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 binários


Baypassar os de sistema:

and n.nspname not like ‘pg\\_%’ — no catalogs

SELECT n.nspname, p.proname, format_type(t.oid, null) as typname
 FROM pg_namespace n, pg_aggregate a, 
 pg_proc p, pg_type t
 WHERE p.pronamespace = n.oid
 and a.aggfnoid = p.oid
 and p.proargtypes[0] = t.oid
 ORDER BY nspname, proname, typname;


Retorno: lista todas as funções agregadas e os tipos que podem ser aplicados


Dado o banco de dados, qual o seu diretório:

select datname, oid from pg_database;


Dado a tabela, qual o seu arquivo:

select relname, relfilenode from pg_class;


Exemplo que retorna índice, campo, tipo, comprimento, null, default:

 SELECT pg_attribute.attnum AS index, 
 attname AS field, 
 typname AS type, 
 atttypmod-4 as length, 
 NOT attnotnull AS "null", 
 adsrc AS default 
 FROM pg_attribute, 
 pg_class, 
 pg_type, 
 pg_attrdef 
 WHERE pg_class.oid=attrelid 
 AND pg_type.oid=atttypid 
 AND attnum >0 
 AND pg_class.oid=adrelid 
 AND adnum=attnum 
 AND atthasdef='t' 
 AND lower(relname)='datas' 
 UNION 
 SELECT pg_attribute.attnum AS index, 
 attname AS field, 
 typname AS type, 
 atttypmod-4 as length, 
 NOT attnotnull AS "null", 
 AS default 
 FROM pg_attribute, 
 pg_class, 
 pg_type 
 WHERE pg_class.oid=attrelid 
 AND pg_type.oid=atttypid 
 AND attnum>0 
 AND atthasdef='f' 
 AND lower(relname)='datas';
No comments yet.