Atenção: por essa edição ser muito antiga não há arquivo PDF para download.
Os artigos dessa edição estão disponíveis somente através do formato HTML.

Clique aqui para ler todos os artigos desta edição

PostgreSQL - Introdução e Conceitos

Eduardo Hoelz Stern

 

       O PostgreSQL não é um software novo. Seu desenvolvimento começou em 1986, na universidade de Berkeley, na Califórnia, com base no código-fonte do banco de dados INGRES. Por isso, na época ele foi chamado de Postgres - uma abreviação de Pos INGRES. O projeto foi liderado pelo Professor Michael Stonebraker e financiado pela Agência de Pesquisa de Projetos Avançados de Defesa dos EUA (DARPA), pelo Departamento de Pesquisa do Exército Americano (ARO), pela Fundação Nacional de Ciência (NSF) e pela ESL, Inc. Em 1994 deixou de ser desenvolvido somente em Berkeley e seu código-fonte foi disponibilizado na Internet. Em 1995 ganhou suporte à linguagem SQL e finalmente em 1996 teve seu nome alterado para PostgreSQL.

       Atualmente, o PostgreSQL utiliza a licença BSD, que dá total liberdade: qualquer pessoa pode alterar o código e utilizar o produto em operações comerciais, sem ter que pagar nada a ninguém. A única regra é que a Universidade de Berkeley não é responsável por nada que aconteça com o software.

 

Características

       Apesar da pouca popularidade, o PostgreSQL é um gerenciador de banco de dados veloz, robusto e que se encontra na lista dos que mais possuem recursos. Foi o pioneiro na introdução de vários conceitos objeto-relacionais que só recentemente foram implementados em alguns bancos de dados comerciais. Dentre as principais características, podemos citar:

 

- Suporte aos padrões ANSI SQL 89, 92 e 99;

- Suporte a transações;

- Sistema de concorrência de múltiplas versões dos dados (MVCC, no inglês): permite que gravações não bloqueiem leituras e vice-versa;

- Backup online;

- Integridade referencial;

- Funções definidas pelo usuário;

- Herança de tabelas;

- Conexão por interfaces nativas;

- Suporte a várias linguagens de desenvolvimento (PHP, Java, C, ASP, .Net, Perl, Python, VB, Delphi, C++ Builder etc);

-Tipos de dados definidos pelo usuário;

- Várias linguagens de programação de funções (plpgSQL, plTcl, plPerl, plPython, C etc);

- Possui uma estrutura própria para os objetos do banco e não depende de nenhum engine externo, como BerkeleyDB ou InnoDB.

 

Plataformas Suportadas

O PostgreSQL pode ser instalado nas plataformas Unix (Linux, FreeBSD, AIX, HPUX, Solaris, NetBSD, OpenBSD etc) – de fato, ele já faz parte da distribuição da maioria delas. A versão free do banco ainda não está disponível para Windows.

Quem necessita rodar a versão free do PostgreSQL no Windows deve utilizar um emulador UNIX, como o cygwin (www.cygwin.com). No entanto, o uso de um emulador faz com que o servidor fique até 50% mais lento do que o normal.

A distribuição comercial da dbExperts (www.dbexperts.com.br) contém uma versão do PostgreSQL nativa para Windows, dispensando o uso de qualquer emulador.

 

Conceitos Básicos

       Para iniciar o servidor PostgreSQL no Linux, utilize o comando service postgresql start. No Windows, utilize o painel de controle de serviços.

       Cada instalação do PostgreSQL cria uma área de dados (na documentação, referenciada como cluster), que é um diretório onde são armazenados todos os bancos de dados. Em geral, as distribuições criam automaticamente este diretório. Manualmente, ele pode ser gerado com o comando initdb, conforme a linha a seguir (o símbolo % representa o prompt):

 

%initdb –d  

 

NOTA: Muitos comandos do PostgreSQL estão disponíveis como aplicativos de linha de comando.

 

       Um banco de dados pode conter tabelas, views (que podem ser editáveis), seqüências, domínios, triggers, Stored Procedures e UDF´s.

       Esses objetos podem ser agrupados em schemas, que são subdivisões dentro de um banco de dados. A restrição é que não podem existir schemas dentro de schemas. Os objetos contidos em um schema são acessados com a sintaxe nome_do_schema.nome_do_objeto.

       Para criar um schema utilize o comando CREATE SCHEMA:

 

CREATE SCHEMA contabil;

 

       Para criar um objeto dentro de um schema, utilize a sintaxe nome_do_schema.nome_do_objeto:

 

CREATE TABLE contabil.contas(

  ...

 );

 

O usuário postgres

       Uma instalação nova cria um super-usuário chamado postgres, sem senha. Ele tem todas as permissões, sobre todos os bancos de dados. Novos usuários podem ser criados com o comando CREATE USER nome_usuario.

 

Criando databases

Para criar um novo banco de dados utilize o aplicativo createdb, na linha de prompt:

 

% createdb teste

ou

% createdb -U postgres teste

 

Para apagar um banco de dados utilize o comando dropdb:

 

% dropdb -U postgres teste

 

O parâmetro -U especifica qual usuário será usado para executar o comando (-U pode ser utilizado em todos os comandos do PostgreSQL). Caso o parâmetro não seja especificado, será assumido o nome do usuário logado no sistema operacional.

Observe que não há vínculo entre o usuário do sistema operacional e o usuário do banco de dados; o PostgreSQL apenas utiliza o usuário do sistema como “dica” para preencher o login, ou seja, o nome do usuário deve estar sempre cadastrado no banco de dados.

 

O database template1

       A instalação do PostgreSQL cria um banco de dados chamado template1, utilizado como matriz para criação de novos bancos. Para indicar outro banco de dados como modelo, informe o parâmetro -T no comando createdb:

 

% createdb -T meudbmatriz -U usuario nome_do_banco

 

Nota: O banco de dados template1 não pode ser apagado ou modificado.

 

Enviando comandos SQL

       O utilitário de linha de comando psql permite enviar comandos SQL diretamente para o servidor. A sintaxe para entrar no aplicativo é psql nome_do_banco login. Veja um exemplo:

 

% psql contabil postgres

 

Welcome to psql 7.3.3-dbExperts

 

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

 

contabil=#

 

       A partir do prompt # os comandos SQL podem ser digitados. O finalizador de comandos é o ponto-e-vírgula. Veja abaixo:

 

contabil=# select version();

PostgreSQL 7.3.3 (1 row)

 

A lista completa de parâmetros do psql pode ser visualizada com o comando psql –help.

Existem também utilitários gráficos para administração do PostgreSQL. Dentre eles, podemos citar o pgAdmin (www.pgadmin.org) e o pgAccess (www.pgaccess.org). Vide figura 1.

 

Figura 1.  pgAccess.

Conexão remota

       As conexões em rede com um servidor PostgreSQL são feitas sempre através do protocolo TCP/IP. Por padrão, o servidor espera essas conexões na porta 5432, mas isso pode ser alterado no arquivo de configuração postgresql.conf. No Linux, esse arquivo é criado no diretório /var/lib/pgsql/data.

       Uma aplicação cliente necessita das seguintes informações para efetuar a conexão com o servidor:

 

- Endereço IP ou nome DNS do servidor;

- Porta TCP/IP;

- Usuário;

- Senha;

- Database;

 

       Quando executamos o comando psql teste postgres, estamos dizendo para o utilitário psql se conectar na máquina local (localhost), na porta padrão (5432), com o usuário postgres, não passando nenhuma senha (se necessário, será pedida), no database teste.

Se o servidor estiver em outra máquina, utilize o parâmetro -h para informar o ip/nome do host:

 

% psql -h psql.dbexperts.net teste postgres

 

O comando abaixo faz a conexão através da porta 1028 (o servidor deve estar configurado para receber conexões nesta porta):

 

% psql -h psql.dbexperts.net:1028 teste postgres

 

Biblioteca client

A biblioteca libpq.so (ou libpq.dll, no Windows) é o client do banco e deve ser instalada nas máquinas que necessitarem se conectar com o servidor. Aplicações Java que utilizam o driver JDBC tipo IV do PostgreSQL não necessitam da biblioteca.

Seguem alguns links para download de drivers de conexão:

 

dbExpress e .Net - http://gborg.postgresql.org (já acompanham a libpq.dll)

ODBC - http://odbc.postgresql.org

JDBC - http://jdbc.postgresql.org

 

NOTA: A biblioteca libpq.dll está disponível também na versão free do PostgreSQL

 

Criando e manipulando tabelas

       Vamos implementar um exemplo. Primeiro, crie um novo banco de dados chamado sqlmagazine:

 

% createdb -U postgres sqlmagazine

 

       Em seguida, faça a conexão com o psql:

 

% psql sqlmagazine postgres

Welcome to psql 7.3.3

 

       Crie a tabela Contas com o comando a seguir:

 

sqlmagazine=# create table contas

                     (

                       id serial primary key,

                       titular text,

                       saldo numeric(11,2) not null

                     );

 

NOTICE: CREATE TABLE will create implicit sequence 'contas_id_seq' for SERIAL column 'contas.id'

NOTICE: CREATE TABLE/PRIMARY KEY will create implicit index 'contas_pkey' for table 'contas'

 

       Observe que o tipo de dados serial é um inteiro com numeração automática. Em seguida, crie a tabela de movimentos:

 

sqlmagazine=# create table movimentos

                     (

                       id serial primary key,

                       fk_conta integer references contas not null,

                       descricao text,

                       data timestamp default now() not null,

                       credito numeric(11,2) not null,

                       debito numeric(11,2) not null

                     );

 

NOTICE:  CREATE TABLE will create implicit sequence 'movimentos_id_seq' for SERIAL column 'movimentos.id'

NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index 'movimentos_pkey' for table 'movimentos'

NOTICE:  CREATE TABLE will create implicit trigger(s) for FOREIGN KEY check(s)

                       

Os comandos a seguir inserem novos registros:

 

sqlmagazine=# insert into contas(titular, saldo) values ('ClubeDelphi', 0);

sqlmagazine=# insert into contas(titular, saldo) values ('SQL Magazine', 0);

 

       Por último, temos alguns exemplos de SELECT:

 

sqlmagazine=# select * from contas;

 id |   titular    | saldo

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

  1 | ClubeDelphi  |  0.00

  2 | SQL Magazine |  0.00

(2 rows)

 

sqlmagazine=# select titular, sum(credito - debito) as saldo from contas inner join movimentos on contas.id=movimentos.fk_conta group by contas.id, contas.titular;

   titular    |  saldo  

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

 ClubeDelphi  |   650.00

 SQL Magazine |   550.00

(2 rows)

 

Autor

 

Eduardo Hoelz Stern

(ehstern@dbexperts.com.br), administrador de empresas formado pela Fundação Armando Álvares Penteado, em São paulo, atua há mais de 10 anos na área de informática com especialidade em bancos de dados e desenvolvimento de sistemas.

Diretor de TI da dbExperts Brasil (www.dbexperts.com.br), desenvolveu a única versão do PostgreSQL com suporte nativo a Windows e Mac Os X, que originou a distribuição comercial dbExperts PostgreSQL.