Instalação de PostgreSQL 8.4 em Ubuntu 9.10

fonte
http://ubuntuforums.org/showthread.php?t=1308975
http://skyl.org/log/post/skyl/2009/12/running-postgresql-84-on-ubuntu-karmic-koala-with-postgis-141-geodjango/
http://www.quanative.com/category/postgis/
http://biodivertido.blogspot.com/2009/10/install-postgresql-84-and-postgis-140.html

instalação de PostgreSQL
sudo apt-get install postgresql-8.4 postgresql-server-dev-8.4 postgresql-contrib-8.4 pgadmin3 pgadmin3-data unixodbc-bin odbc-postgresql r-cran-rodbc

instalação de outros pacotes necessarios
# antes de instalar postgis sao necessarios os seguintes pacotes
sudo apt-get install proj-bin libproj-dev gdal-bin

instalação de Postgis
wget http://postgis.refractions.net/download/postgis-1.4.0.tar.gz
tar xvfz postgis-1.4.0.tar.gz
cd postgis-1.4.0
./configure
make
sudo make install

mudar a senha do usuário postgres no gestor de base de dados
sudo su postgres -c psql template1
ALTER USER postgres WITH PASSWORD 'senha'; # com as ' e ; no final
\q # para sair

mudar a senha do usuário postgres no sistema linux
sudo passwd postgres # em seguida pedirá a senha

criar outro utilizador
su postgres
psql -d postgres -c "CREATE ROLE utilizador LOGIN PASSWORD 'senha' SUPERUSER INHERIT CREATEDB CREATEROLE;" # crear um novo utilizador
ou
createuser --createdb --superuser utilizador # o mesmo que usamos no sistema linux

melhora a conectividade com pgadmin
su postgres
psql -f /usr/share/postgresql/8.4/contrib/adminpack.sql


criar base de dados PostGIS
su postgres
createdb -U postgres postgis # cria uma base de dados modelo com o nome postgis
createlang -U postgres plpgsql postgis # cria a linguagem plpgsql para a base de dados
psql -U postgres -d postgis -f /usr/share/postgresql/8.4/contrib/postgis.sql # script
psql -U postgres -d postgis -f /usr/share/postgresql/8.4/contrib/spatial_ref_sys.sql # script

psql -d postgres -c "UPDATE pg_database SET datistemplate='true' WHERE datname='template_postgis';" # definir esta base de dados como modelo (template)
createdb -U postgres -T postgis casa # cria a base de dados casa

executa um ficheiro.sql na base de dados casa
su postgres
psql -U postgres -f /pasta
/ficheiro.sql -d casa

permitir ligaçoes externas

sudo gedit /etc/postgresql/8.4/main/postgresql.conf
#listen_addresses = 'localhost' -> listen_addresses = '*'
#password_encryption = on -> password_encryption = on
#autovacuum = on -> autovacuum = on
sudo gedit /etc/postgresql/8.4/main/pg_hba.conf
adicionar estas duas linhas no final do documento
host     all     all     193.144.100.254    255.255.255.0   trust
host     all     all     0.0.0.0    0.0.0.0   md5


Começar
su postgres
psql -U postgres # e em seguida introduzir senha de root do sistema

Regras de nomenclatura

fonte

base de dados
exemplo: bd_base_de_dados

schema
exemplo: sch_schema

tabela
exemplo: tb_tabela

views
exemplo: vw_views

sequence
<nome da tabela (com prefixo)>_<nome da coluna>_<seq>
exemplo: tb_cliente_id_cliente_seq

primary key
exemplo: pk_<nome_tabela_sem_prefixo>

foreign key

fk_<nomeTabelaFilha_sem_prefixo>_<nomeTabelaPai_sem_prefixo>

exemplo: fk_processoeleitoral_eleicao


index
idx_nome_da_coluna_indexada

function
fun_<nome tabela (com prefixo tb_)>_<XXX>  ou fun_<nome da função>
XXX - indica a ação realizada pela função (INSert ; DELete ; UPDate ; SELect )
exemplo: fun_tb_cliente_ins, fun_valida_cadastro

stored procedures
stp_<nome tabela (com prefixo tb_)>_<XXX>  ou stp_<xxxxxxxxx>
exemplo: stp_tb_municipio_upd, stp_gera_codigo_liberacao

trigger
trg_<nome tabela(com prefixo tb_)>_<XXX>
exemplo: trg_tb_comarca_ins_del

Exemplos SQL


select
select t1.campo2 , t2.campo2 from tabela1 t1, tabela2 t2 where t1.campo1 = t2.campo1 and t2.campo3 = 0;

seleccionar parte de uma data
select extract(year from data) as ano from tabela;
select extract(month from data) as ano from tabela;
select extract(day from data) as ano from tabela;

crear tabela igual a outra pré-existente
CREATE TABLE backup.t_cliente (LIKE t_cliente INCLUDING DEFAULTS INCLUDING INDEXES INCLUDING CONSTRAINTS);

copiar uma tabela de um esquema para outro
CREATE TABLE outro_esquema.foobar AS SELECT * FROM um_esquema.foobar;

inserir dados

INSERT INTO films (code, title, did, date_prod, kind) VALUES ('T_601', 'Yojimbo', 106, '1961-06-16', 'Drama');

INSERT INTO tabela1 (Col1, Col2, Col3) SELECT Col1, Col2, Col3 FROM tabela2;

INSERT INTO LocalTable (Col1, Col2, Col3) (SELECT Col1, Col2, Col3 FROM [LinkedServer].DatabaseName.DBO.TableName);

pg_dump -d db1 -t table1 | psql db2 insert into table2 (select * from table1);

inserir dados para uma nova tabela
SELECT * INTO nova_tabela FROM tabela_actual;

apagar dados
delete from tabela where campo = 'blah';

actualizar dados
update tabela1 set campo2 = ('prefixo'||tabela2.campo2) from tabela2 where tabela2.campo3=0 and tabela1.campo1 = tabela2.campo1 ;

importar dados de um ficheiro csv

copy tabela_destino from '/home/user/ficheiro.csv' using delimiters ',' with null as 'NULL';

exportar os resultados de uma consulta para um ficheiro csv
copy (select * from tabela) to '//unidadepc/pasta/ficheiro.csv' csv header; # a pasta tem de ter previlégios de escrita

mudar o nome de uma base de dados

ALTER DATABASE name RENAME TO newname

mudar o nome de uma tabela
alter table tabela01 rename to tabela02;

mudar o nome de um campo
ALTER TABLE tabela RENAME campo1 TO campo2;

adicionar um campo
ALTER TABLE Empleados ADD COLUMN Salario CURRENCY;

eliminar um campo
ALTER TABLE Empleados DROP COLUMN Salario;

mudar o tipo de um campo
ALTER TABLE tabela ALTER COLUMN campo TYPE varchar(80);

adicionar um comentario a um campo
COMMENT ON COLUMN esquema.tabela.campo IS 'comentario....';

campo unico, sem repetidos
ALTER TABLE tabela ADD UNIQUE (campo);

criar index
CREATE INDEX title_idx ON films (title);

apagar indice
ALTER TABLE tabela DROP INDEX campo;

adicionar constraint
ALTER TABLE Pedidos ADD CONSTRAINT RelacionPedidos FOREIGN KEY (IdEmpleado) REFERENCES Empleados (IdEmpleado);

eliminar constraint
ALTER TABLE Pedidos DROP CONSTRAINT RelacionPedidos;

executar uma consulta desde a terminal
psql -U utilizador -d base_dados -c "sentencia sql"

dump
pg_dump -U usuario -h ip_servidor -d banco > banco.sql

seleccionar tabelas onde determinado utilizador tem determinado privilegio
SELECT table_schema,table_name FROM information_schema.role_table_grants WHERE grantee = 'utilizador' AND privilege_type = 'privilegio' order by table_schema,table_name;

seleccionar colunas da base de dados sem comentários
SELECT pg_class.relname FROM pg_namespace JOIN pg_class ON pg_namespace.oid=pg_class.
relnamespace WHERE pg_namespace.nspname IN ('public') AND pg_class.relkind='r' AND pg_class.oid NOT IN (SELECT objoid FROM pg_description);

função e disparador
create or replace function nome_funcao() returns trigger as '
begin
NEW.campo_0 = NEW.campo_1 + NEW.campo_2;
return NEW;
end;
' language plpgsql;
create trigger nome_disparador before insert or update on nome_tabela
for each row execute procedure nome_funcion();

condiçao
SELECT a, CASE WHEN a=1 THEN 'one' WHEN a=2 THEN 'two' ELSE 'other' END FROM test;

cross table
In a simple data model of timeseries, we have a table with fields v (for
variable), t (for time) and y (the data value). v,t is the primary key.
So instead of a table:
t v y
---------------
1 a 0.5
1 b 1.1
1 c 5.1
2 a 0.6
2 b 1.2
2 c 5.2
3 a 0.7
3 b 1.4
3 c 5.5

we would like a table:
t ya yb yc
---------------------
1 0.5 1.1 5.1
2 0.6 1.2 5.2
3 0.7 1.4 5.5

select t, min(case when v = a then y else null end) as ya,
min(case when v = b then y else null end) as yb,
min(case when v = c then y else null end) as yc
from thetable
group by t;

seleccionar schemas, tabelas e comentarios das tabelas
select nspname,relname,description
from pg_description
inner join pg_class  on (objoid=oid)
inner join pg_namespace on (oid=relnamespace);

copiar tabela entre esquemas
pg_dump -n nome_do_esquema -d nome_do_banco -U usuario -f arquivo_de_backup
Se você está fazendo dump do esquema public aparecerá uma linha como a que esta abaixo no arquivo de backup:
SET search_path = public, pg_catalog;
Modifique esta linha para:
SET search_path = seu_esquema e depois faça:
psql -d nome_do_banco -U usuario -f arquivo_de_backup

PostGIS


criar tabela e adicionar dados geometricos de pontos
CREATE TABLE ciudades (gid serial primary key, nombre varchar(10), poblacion integer);
SELECT addgeometrycolumn ('esquema', 'ciudades', 'geom', 23030, 'POINT', 2); # adiciona a estructura da tabela recem criada à tabela geometry_columns
INSERT INTO ciudades (nombre, poblacion, geom) VALUES('Porto', 319999, geometryfromtext('POINT(700000 450000)', 23030));

ou mais manualmente
create table aldeas (gid serial primary key, nombre varchar(10), poblacion integer);
alter table aldeas add column geom geometry;
alter table aldeas add constraint enforce_dims_geom_aldeas check (ndims(geom)=2);
alter table aldeas add constraint enforce_dims_geom_aldeas2 check (srid(geom)=23030);
alter table aldeas add constraint enforce_dims_geom_aldeas3 check (geometrytype(geom)='POINT' OR  geom is null);

ver o que fizemos
SELECT * FROM ciudades;
SELECT astext(geom) FROM ciudades;  
SELECT asewkt(geom) FROM ciudades;

apagar tabela
select DropGeometryColumn('esquema','ciudades','geom');
drop table ciudades;

mudar o nome de uma tabela/tema
update geometry_columns set f_table_name = 'nome_novo' where f_table_name = 'nome_antigo';
alter table nome_antigo rename to nome_novo;

criar tabela e adicionar dados geometricos de linhas
create table carreteras (gid serial primary key, nombre varchar(10));
select addgeometrycolumn ('', 'carreteras', 'geometria', 23030, 'LINESTRING', 2);
insert into carreteras (nombre, geometria) values('A1', geometryfromtext('LINESTRING(750000 850000, 750000 950000, 850000 650000)', 23030));

obter as coordenadas num sistema diferente
UPDATE tabela SET
campo_lat = st_x(st_transform((geom), 4258)),
campo_lon = st_y(st_transform((geom), 4258));

criar uma vista num sistema de coordenadas diferente
create view pt_ct_lim_admin_pais_lin_20791 as select gid, st_transform(geom, 20791) from pt_ct_lim_admin_pais_lin;
create view pt_ct_lim_admin_pais_lin_20790 as select gid, st_transform(geom, 20790) from pt_ct_lim_admin_pais_lin;

apagar vista
drop view pt_ct_lim_admin_pais_lin_20791;

event layer de uma tabela de PostgreSQL con campos XY
alter table nome_da_tabela add column id serial primary key; # se já não tem um primary key
select AddGeometryColumn( 'public', 'nome_da_tabela', 'geom', 23030, 'POINT', 2 );
update nome_da_tabela set geom = setsrid(MakePoint(campo_com_x, campo_com_y), 23030);

exportar de PostgreSQL a shape
pgsql2shp -u postgres -P senha basedados tabela -f shape.shp

calcular área (m2)
alter table nome_da_tabela add column area_m2 bigint;
update nome_da_tabela set area_m2 = st_area(geom);
ou
update nome_da_tabela set area_m2 = st_area(transform(geom, 23030));

calcular perímetro (m)
alter table nome_da_tabela add column perimetro_m bigint;
update nome_da_tabela set perimetro_m = st_perimeter(geom);

calcular área
(m2) em temas com sistema de coordenadas geográficas (ex. 4326)
select st_area(st_transform(geom, 23030)) from nome_da_tabela;

calcular comprimento (m)
select st_length(geom) from nome_da_tabela;

transformar noutro istema de coordenadas
fonte: http://www.bostongis.com/PrinterFriendly.aspx?content_name=postgis_tut03
SELECT AddGeometryColumn( 'public', 'nome_da_tabela', 'geom', 32661, 'POINT', 2 );
UPDATE nome_da_tabela SET geom = st_transform(setsrid(makepoint(longitude, latitude),4269), 32661);

indexar o campo com a geometria para acelarar as análises espaciais

CREATE INDEX idx_nome_da_tabela ON nome_da_tabela USING GIST (geom);

clip & intersect
create table nome_da_tabela0  (gid serial PRIMARY KEY, campo1 varchar(80), campo2 smallint);
select addgeometrycolumn ('schema', 'nome_da_tabela ', 'geom', 23030, 'MULTIPOLYGON', 2);
insert into nome_da_tabela0(geom, campo1, campo2) 
select multi(intersection(a.geom, b.geom)), a.campo1, b.campo2 
from nome_da_tabela1 a, nome_da_tabela2 b 
where (a.geom && b.geom) and intersects (a.geom, b.geom);

dissolve
select st_union(geom) as geom, campo1, max(campo2) as campo2, sum(campo3) as campo3 into nome_da_tabela from outra_tabela group by campo1;
alter table nome_da_tabela add column gid serial primary key;
INSERT INTO geometry_columns(f_table_catalog, f_table_schema, f_table_name, f_geometry_column, coord_dimension, srid, type) VALUES ('"', 'schema', 'nome_da_tabela', 'geom', 2, 23030, 'MULTIPOLYGON');

grant select
GRANT SELECT ON TABLE schema.nome_da_tabela TO role;

Importar shape a PostgreSQL

su postgres
shp2pgsql -s 23030 -g geom -W iso-8859-1 -D -I /pasta/shape.shp novatabela basedados | psql basedados # -s 23030->ED50 UTM 30N; -s->nome do campo dom a geometria; -W iso-8859-1->codificacao latin1?; -D fonte de dados(shp).

Importar shape a PostgreSQL com passo intermedio
shp2pgsql -s 23030 -W iso-8859-1 -D /pasta/shape.shp novatabela basedados > /pasta/ficheiro.sql # Cria ficheiro sql; -s 23030->ED50 UTM 30N; -W iso-8859-1->codificacao latin1?; -D fonte de dados(shp).

psql -U postgres -d basedados -f /pasta/ficheiro.sql # Faz o insert dos dados do ficheiro sql à base de dados


Ver o que acabamos de importar
psql basedados # entrar na base de dados
SELECT * FROM novatabela; # ver a tabela que contem
SELECT * FROM geometry_columns; # ver todas as tabelas (capas/temas) que temos


Introduzir massivamenta shp's na base de dados

Criar usuário
createuser -P -s -e novousuario # este novo usuario tem de ser igual ao usuario do sistema, ex.: se entraste em Ubuntu com o usuário joaquim o novo usuario PostgreSQL tem de ser joaquim. -P para defenir a senha; -s para que seja super usuario.

Script em Python
Guardar o seguinte código num ficheiro.py, editar a última linha (a vermelho) com a pasta por onde deve começar a procura recursivamente (sub pastas) todos os shapes que encontre.

Mudar também e o código EPSG "20791", que corresponde ao Sistema de Coordenadas do shape (Lisbon (Lisbon)/Portuguese Grid), para o valor que lhe corresponda (mais códigos EPSG). A melhor solução será agrupar os shapes por Sistemas de Coordenadas em diferentes pastas e executar o script para cada uma das pastas/Sistemas de Coordenadas.

Após a importação a PostgreSQL é criado um index pelo campo de geometria (geom) para acelarar as análises espaciáis e um Vacuum analyze.
________________________________________________________________________________
# só tens que editar o que está a vermelho 'path', 'codigo EPSG'
#coding: latin-1

import os
import datetime

def shp2postgis(inicio, epsg):
principio = datetime.datetime.today()
conta = 0
l = os.walk(inicio)
for i in l:
directorio, subdirectorios, ficheros = i
for f in ficheros:
nome_completo = os.path.join(directorio, f)
tabela = f.split('.')[0]
extensao = f.split('.')[-1]
try:
if extensao == 'shp':
os.system('shp2pgsql -s %s -g geom -W iso-8859-1 -D -I %s %s bdg | psql bdg' % (epsg, nome_completo, tabela))
os.system("psql -d bdg -c 'VACUUM ANALYZE %s(geom);'" % tabela)
conta += 1
except:
pass
print conta, 'shp`s importados em', datetime.datetime.today() - principio

shp2postgis('/cartografia/shp/20791/','20791')
shp2postgis('/cartografia/shp/23030/','23030')


________________________________________________________________________________



Passar uma tabela 2d a 3d

select addgeometrycolumn('', 'centrales', 'geom3d', 23030, 'POINT',3);  # adicionar o campo para gemetria 3d
update centrales set geom3d = translate(force_3d(geom),0,0,1000); # adicionar o valor de altitude, neste caso 1000 m (depende do sistema de referencia)


Criar um disparador

createlang -U postgres plpgsql -d ej6 # cria a linguagem de promação
Guardar as seguintes sentencias num ficheiro, por exemplo: /home/alumno/Desktop/dispara.sql

CREATE OR REPLACE FUNCTION
disparador1() RETURNS trigger AS $
BEGIN
NEW.c3=NEW.c1+NEW.c2;
RETURN NEW;
END;
$ LANGUAGE plpgsql;
CREATE TRIGGER tgg_insert
BEFORE INSERT ON tabela1
FOR EACH ROW EXECUTE PROCEDURE disparador1();

sudo psql -U postgres # iniciamos psql
\i /home/alumno/Desktop/dispara.sql # integra o disparador na base de dados

Criar uma tabela de eventos com gatilhos

create table capaxy (gid serial primary key, x double precision, y double precision);
select addgeometrycolumn ('','capaxy','geom',-1,'POINT',2);

BEGIN TRANSACTION;

CREATE OR REPLACE FUNCTION tggFunction_updateEventos() RETURNS trigger AS
$$
  BEGIN
    IF ((NEW.x != OLD.x) OR (NEW.y != OLD.y)) THEN
      NEW.geom = ST_MAKEPOINT (NEW.x, NEW.y);
    END IF;
    RETURN NEW;
  END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER tggUpdateEventos
  BEFORE UPDATE ON capaxy
  FOR EACH ROW EXECUTE PROCEDURE tggFunction_updateEventos();

END TRANSACTION;

INSERT INTO capaxy (x,y,geom) values (10,20,null);
INSERT INTO capaxy (x,y,geom) values (11,21,null);


select gid,x,y,astext(geom) from capaxy;
 gid | x  | y  | astext
-----+----+----+--------
   3 | 10 | 20 |
   4 | 11 | 21 |
(2 rows)

update capaxy set gid=gid*10;

select gid,x,y,astext(geom) from capaxy;
 gid | x  | y  | astext
-----+----+----+--------
  30 | 10 | 20 |
  40 | 11 | 21 |
(2 rows)

update capaxy set x=12;
select gid,x,y,astext(geom) from capaxy;
 gid | x  | y  |    astext
-----+----+----+--------------
  30 | 12 | 20 | POINT(12 20)
  40 | 12 | 21 | POINT(12 21)
(2 rows)

-- Cambio para que tambien actualiza cuando cambio la geometria


BEGIN TRANSACTION;

CREATE OR REPLACE FUNCTION tggFunction_updateEventos() RETURNS trigger AS
$$
  BEGIN
    IF ((NEW.x != OLD.x) OR (NEW.y != OLD.y)) THEN
      NEW.geom = ST_MAKEPOINT (NEW.x, NEW.y);
    ELSE
      IF (NOT (NEW.geom ~= OLD.geom)) THEN
        NEW.x = ST_X (NEW.geom);
        NEW.y = ST_Y (NEW.geom);
      END IF;
    END IF;

    RETURN NEW;
  END;
$$ LANGUAGE plpgsql;

DROP TRIGGER IF EXISTS tggUpdateEventos ON capaxy;
CREATE TRIGGER tggUpdateEventos
  BEFORE UPDATE ON capaxy
  FOR EACH ROW EXECUTE PROCEDURE tggFunction_updateEventos();

END TRANSACTION;

-- y ahora lo probamos de nuevo
update capaxy set geom=ST_MAKEPOINT (20,30+gid);
select gid,x,y,astext(geom) from capaxy;
 gid | x  | y  |    astext
-----+----+----+--------------
  30 | 20 | 60 | POINT(20 60)
  40 | 20 | 70 | POINT(20 70)


Criar um novo cluster

sudo /etc/init.d/postgresql-8.3 stop # parar o serviço. Em SUSE /etc/init.d/postgresql stop
cd /home/user/ # ir a /home/user/
mkdir PostgreSQL # criar uma nova pasta onde vai residir o novo cluster
sudo chown -R postgres PostgreSQL # mudar o dono da pasta
su postgres # mudar para o usuario postgres

/usr/lib/postgresql/8.3/bin/initdb -E UTF8 /home/user/PostgreSQL # cria a estrutura de pastas necessárias e a codificaçao UTF8

/usr/lib/postgresql/8.3/bin/pg_ctl -D /home/user/PostgreSQL start # arrancar o serviço na nova pasta
psql # entra no gestor de base de dados
\l # mostra as bases de dados que existem no cluster recém criado

Mudar de um cluster a outro

su postgres
/etc/init.d/postgresql-8.3 stop # para el serviço
/usr/lib/postgresql/8.3/bin/pg_ctl -D /home/user/PostgreSQL start # em SUSE /etc/init.d/postgresql start

http://ryandaigle.com/articles/2006/6/6/changing-postgresql-s-data-directory-in-ubuntu
When installing PostgreSQL on debian the install process asks you what directory you want to contain your actual table data – which is nice when you want to use a dedicated partition instead of the default /var/lib/postgresql/data. However, in Ubuntu (Dapper Drake and Breezy Badger) the install process doesn’t give you the option of changing the default directory. Here are some quick notes on how to change the data directory to an existing non-default data dir (specifically for postgresql 7.4):
remove the /etc/postgresql/7.4/main/pgdata symlink
create a new pgdata symlink that points to your desired data directory.
Make sure the pg_hba.conf, pg_ident.conf, postgresql.conf and root.crt symlinks in the data dir point back to the originals in /etc/postgresql/7.4/main
Restart postgres and you should now be running from you desired, non-default data directory.

https://bugs.launchpad.net/ubuntu/+source/postgresql-8.2/+bug/162517
how can I change the location of my database :-?
On cluster creation: pg_createcluster -d /path/to/data/dir (see manpage).
On already existing clusters:
 - stop the db (init script or pg_ctlcluster)
 - move /var/lib/postgresql/8.2/main to whereever you want
 - do either of (whichever you like more):
   * change the /etc/postgresql/8.2/main/
pgdata symlink to the new location
   * set data_directory in /etc/postgresql/8.2/main/postgresql.conf and remove above symlink [1]
Martin
[1] I know that removal of the symlink should not be necessary, the
config file option should trump the pgdata symlink. This is fixed in
the current versions in Hardy.

http://ubuntuforums.org/showthread.php?t=16324
> Hi,
> I've not had a chance to test the packages yet, however on the webpage
> you didn't mention where the data files are stored? Should I assume
> /var/spool/pgsql/$version/$cluster or something similar?

The standard location is /var/lib/postgresql/$version/$cluster.
However, "pg_createcluster" allows to specify a different location and
you can also easily move around existing clusters by moving the
directory and adapting the symlink
/etc/postgresql/$version/$cluster/pgdata.

http://www.dbrunas.com.ar/article.php/20952.13539549
http://www.dbrunas.com.ar/article.php/20061106221307869
/etc/rc.d/init.d/postgresql

http://ubuntuforums.org/showthread.php?t=355501
Postgres does start successfully at boot-up. However, it starts the wrong cluster - the one created automatically at installation - and not the user-defined cluster.
So I have to use pg_ctl to stop the default cluster (the one created at /etc/postgresql/8.2/main/
pgdata), and then again to start my cluster (the one I created at /usr/local/pgsql/data).
I wish I could eliminate this extra step


Conectar Access a PostgreSQL

Instalar conector ODBC de PostreSQL

Descarregar a versão da base de dados PostgreSQL instalada, descomprimir e instalar o ficheiro msi.


Criar conexão

Painel de controlo -> Ferramentas administrativas -> Origem de dados (ODBC) -> DSN de usuário -> Agregar... -> PostgreSQL Unicode -> Finalizar -> Em "Data Source" por o nome da conexão (aconselhavel por o nome da base de dados a que nos vamos conectar para que nos lembremos), em "Database" o nome da base de dados a que nos quemos conectar que está em PostgreSQL, "Server" nome do PC (ou IP?), "User Name" nome de usuário PostgreSQL, "Password" senha de usuário PostgreSQL. Test, se está tudo bem, guardar -> Save.


Conectar

Abrir uma base de dados Access em branco ir a Ficheiro -> Obter dados externos -> Vincular tabelas... -> Em tipo de ficheiro seleccionar "Bases de dados ODBC()" -> Seleccionar a 2º aba "Origem de dados do equipo" -> Seleccionar o conector criado -> Aceitar -> Seleccionar tudo -> Aceitar.


Fonte: Vehrka



Comandos psql

Geral

  \c[onnect] [NOMEBD|- USUÁRIO|- MÁQUINA|- PORTA|-]conecta a um outro banco de dados
  \cd [DIRETÓRIO] muda o diretório de trabalho atual
  \copyright        mostra termos de uso e distribuição do PostgreSQL
  \encoding [CODIFICAÇÃO]      mostra ou define codificação do cliente
  \h [NOME]        mostra sintaxe dos comandos SQL, * para todos os comandos
  \q                   sair do psql
  \set [NOME [VALOR]]   define variável interna ou lista todos caso não tenha parâmetros
  \timing             alterna para duração da execução de comandos (atualmente desabilitado)
  \unset NOME     apaga (exclui) variável interna
  \! [COMANDO]   executa comando na shell ou inicia shell iterativa

Buffer de consulta

  \e [ARQUIVO]    edita o buffer de consulta (ou arquivo) com um editor externo
  \g [ARQUIVO]    envia o buffer de consulta para o servidor
  \p                    mostra o conteúdo do buffer de consulta
  \r                     reinicia (apaga) o buffer de consulta
  \s [ARQUIVO]     mostra histórico ou grava-o em um arquivo
  \w [ARQUIVO]    escreve o buffer de consulta para arquivo

Entrada/Saída

  \echo [STRING]  escreve cadeia de caracteres na saída padrão
  \i ARQUIVO        executa comandos de um arquivo
  \o [ARQUIVO]     envia todos os resultados da consulta para arquivo ou |pipe
  \qecho [STRING] escreve cadeia de caracteres para saída da consulta (veja \o)

Informativo
  \d [NOME]      descreve tabela, índice, sequência ou visão
  \d {t|i|s|v|S} [MODELO] (adicione "+" para obter mais detalhe)
                 lista tabelas/índices/sequências/visões/tabelas do sistema
  \da [MODELO]   lista funções de agregação
  \db [MODELO]   lista espaços de tabelas (adicione "+" para obter mais detalhe)
  \dc [MODELO]   lista conversões
  \dC                 lista conversões de tipos
  \dd [MODELO\]  mostra comentário do objeto
  \dD [MODELO]   lista domínios
  \df [MODELO]   lista funções (adicione "+" para obter mais detalhe)
  \dg [MODELO]   lista grupos
  \dn [MODELO]   lista esquemas (adicione "+" para obter mais detalhe)
  \do [NOME]      lista operadores
  \dl                  lista objetos grandes, mesmo que \lo_list
  \dp [MODELO]   lista privilégios de acesso de tabelas, visões e sequências
  \dT [MODELO]   lista tipos de dado (adicione "+" para obter mais detalhe)
  \du [MODELO]   lista usuários
  \l                    lista todos os bancos de dados (adicione "+" para obter mais detalhe)
  \z [MODELO]    lista privilégios de acesso de tabelas, visões e sequências (mesmo que \dp)

Formatação
  \a                alterna entre modo de saída desalinhado e alinhado
  \C [STRING]   define o título da tabela, ou apaga caso nada seja especificado
  \f [STRING]    mostra ou define separador de campos para saída de consulta desalinhada
  \H                alterna para modo de saída em HTML (atual desabilitado)
  \pset NOME [VALOR] define opção de saída da tabela
                 (NOME := {format|border|expanded|fieldsep|footer|null|
                 numericlocale|recordsep|tuples_only|title|tableattr|pager})
  \t             mostra somente registros (atual desabilitado)
  \T [STRING]  define atributos do marcador HTML <table> ou apaga caso nada seja especificado
  \x                alterna para saída expandida (atual desabilitado)

Cópia, Objetos Grandes
  \copy ...      realiza comando SQL COPY dos dados para máquina cliente
  \lo_export OIDLOB ARQUIVO
  \lo_import ARQUIVO [COMENTÁRIO]
  \lo_list
  \lo_unlink OIDLOB    operações com objetos grandes


Tipos de dados

  Esquema   |            Nome              |                             Descrição
------------+-----------------------+------------------------------------------------
 pg_catalog | abstime                     | absolute, limited-range date and time (Unix system time)
 pg_catalog | aclitem                      | access control list
 pg_catalog | "any"                         |
 pg_catalog | anyarray                    |
 pg_catalog | anyelement                 |
 pg_catalog | bigint                         | ~18 digit integer, 8-byte storage
 pg_catalog | bit                             | fixed-length bit string
 pg_catalog | bit varying                  | variable-length bit string
 pg_catalog | boolean                      | boolean, 'true'/'false'
 pg_catalog | box                            | geometric box '(lower left,upper right)'
 pg_catalog | bytea                         | variable-length string, binary values escaped
 pg_catalog | "char"                         | single character
 pg_catalog | character                    | char(length), blank-padded string, fixed storage length
 pg_catalog | char. varying   | varchar(length), non-blank-padded string, variable storage length
 pg_catalog | cid                               | command identifier type, sequence in transaction id
 pg_catalog | cidr                              | network IP address/netmask, network address
 pg_catalog | circle                            | geometric circle '(center,radius)'
 pg_catalog | cstring                          |
 pg_catalog | date                             | ANSI SQL date
 pg_catalog | double precision             | double-precision floating point number, 8-byte storage
 pg_catalog | inet                              | IP address/netmask, host address, netmask optional
 pg_catalog | int2vector                     | array of int2, used in system tables
 pg_catalog | integer                          | -2 billion to 2 billion integer, 4-byte storage
 pg_catalog | internal                         |
 pg_catalog | interval                         | @ <number> <units>, time interval
 pg_catalog | language_handler            |
 pg_catalog | line                               | geometric line (not implemented)'
 pg_catalog | lseg                             | geometric line segment '(pt1,pt2)'
 pg_catalog | macaddr                        | XX:XX:XX:XX:XX:XX, MAC address
 pg_catalog | money                          | monetary amounts, $d,ddd.cc
 pg_catalog | name                             | 63-character type for storing system identifiers
 pg_catalog | numeric                         | numeric(precision, decimal), arbitrary precision number
 pg_catalog | oid                                | object identifier(oid), maximum 4 billion
 pg_catalog | oidvector                       | array of oids, used in system tables
 pg_catalog | opaque                          |
 pg_catalog | path                              | geometric path '(pt1,...)'
 pg_catalog | point                              | geometric point '(x, y)'
 pg_catalog | polygon                          | geometric polygon '(pt1,...)'
 pg_catalog | real                                | single-precision floating point number, 4-byte storage
 pg_catalog | record                            |
 pg_catalog | refcursor                         | reference cursor (portal name)
 pg_catalog | regclass                          | registered class
 pg_catalog | regoper                           | registered operator
 pg_catalog | regoperator                      | registered operator (with args)
 pg_catalog | regproc                           | registered procedure
 pg_catalog | regprocedure                    | registered procedure (with args)
 pg_catalog | regtype                           | registered type
 pg_catalog | reltime                             | relative, limited-range time interval (Unix delta time)
 pg_catalog | smallint                            | -32 thousand to 32 thousand, 2-byte storage
 pg_catalog | smgr                                | storage manager
 pg_catalog | text                                 | variable-length string, no limit specified
 pg_catalog | tid                                   | (Block, offset), physical location of tuple
 pg_catalog | timestamp without time zone| date and time
 pg_catalog | timestamp with time zone     | date and time with time zone
 pg_catalog | time without time zone        | hh:mm:ss, ANSI SQL time
 pg_catalog | time with time zone             | hh:mm:ss, ANSI SQL time
 pg_catalog | tinterval                            | (abstime,abstime), time interval
 pg_catalog | "trigger"                            |
 pg_catalog | "unknown"                         |
 pg_catalog | void                                 |
 pg_catalog | xid                                   | transaction id


 Comandos SQL

ABORT
ALTER AGGREGATE 
ALTER CONVERSION
ALTER DATABASE        
ALTER DOMAIN        
ALTER FUNCTION       
ALTER GROUP     
ALTER INDEX            
ALTER LANGUAGE
ALTER OPERATOR CLASS
ALTER OPERATOR
ALTER ROLE 
ALTER SCHEMA
ALTER SEQUENCE
ALTER TABLE
ALTER TABLESPACE 
ALTER TRIGGER
ALTER TYPE     
ALTER USER
ANALYZE
BEGIN
CHECKPOINT
CLOSE
CLUSTER
COMMENT
COMMIT
COMMIT PREPARED

COPY # carrega dados desde um ficheiro de texto plano a uma tabela. exemplo:
COPY tabela_vazia FROM '/home/ficheiro_com_os_dados.dat' with null 'NULL' delimiter ';' ;

CREATE AGGREGATE
CREATE CAST
CREATE CONSTRAINT TRIGGER
CREATE CONVERSION
CREATE DATABASE
CREATE DOMAIN
CREATE FUNCTION
CREATE GROUP
CREATE INDEX                              
CREATE LANGUAGE                  
CREATE OPERATOR CLASS
CREATE OPERATOR
CREATE ROLE
CREATE RULE
CREATE SCHEMA
CREATE SEQUENCE
CREATE TABLE
CREATE TABLE AS
CREATE TABLESPACE
CREATE TRIGGER
CREATE TYPE
CREATE USER
CREATE VIEW
DEALLOCATE
DECLARE
DELETE
DROP AGGREGATE
DROP CAST
DROP CONVERSION
DROP DATABASE
DROP DOMAIN
DROP FUNCTION
DROP GROUP
DROP INDEX
DROP LANGUAGE
DROP OPERATOR CLASS
DROP OPERATOR
DROP OWNED
DROP ROLE
DROP RULE
DROP SCHEMA
DROP SEQUENCE
DROP TABLE
DROP TABLESPACE
DROP TRIGGER
DROP TYPE
DROP USER
DROP VIEW
END                      
EXECUTE                  
EXPLAIN                  
FETCH                    
GRANT                    
INSERT                   
LISTEN                   
LOAD                     
LOCK                     
MOVE                     
NOTIFY                   
PREPARE                  
PREPARE TRANSACTION      
REASSIGN OWNED           
REINDEX                  
RELEASE SAVEPOINT        
RESET                    
REVOKE                   
ROLLBACK                 
ROLLBACK PREPARED        
ROLLBACK TO SAVEPOINT    
SAVEPOINT                
SELECT                   
SELECT INTO              
SET                      
SET CONSTRAINTS          
SET ROLE                 
SET SESSION AUTHORIZATION
SET TRANSACTION          
SHOW                     
START TRANSACTION        
TRUNCATE                 
UNLISTEN                 
UPDATE                   
VACUUM                   
VALUES



Condicionais

http://www.postgresql.org/docs/current/interactive/functions-conditional.html

CASE WHEN
UPDATE tabela SET campo1 = CASE WHEN campo2 > campo3 THEN campo2 ELSE campo3 END;


GREATEST

UPDATE tabela SET campo1 = GREATEST(campo2 , campo3 );





Regras da lista de correio: http://www.postgresql.org.br/RegrasLista

PostgreSQL Cheat Sheet http://www.petefreitag.com/cheatsheets/postgresql/
Manual PostGIS em português: http://www.webgis.com.br/postgis
Wiki de PostGIS: http://postgis.refractions.net/support/wiki/