You are on page 1of 100

Apostila do Curso de Banco de Dados PostgreSQL

3 Edio

Aplicado a Sistemas Empresariais

Organizao

2010

Sumrio

1. Introduo .........................................................................................................................................................4 1.1. O que um sistema de banco de dados? ....................................................................................................4 1.2. O que um Banco de Dados? .....................................................................................................................6 1.3. Independncia dos Dados ...........................................................................................................................8 1.4. Banco de Dados Relacional .........................................................................................................................8 1.5. Comunicao de Dados ...............................................................................................................................8 1.6. Arquitetura Cliente/Servidor .......................................................................................................................9 1.7. Banco de Dados PostgreSQL........................................................................................................................9 1.8. Arquitetura do PostgreSQL .........................................................................................................................10 2. Modelagem Conceitual do Banco de Dados ........................................................................................................11 2.1. Abordagem geral ........................................................................................................................................11 2.2. Modelo de Entidades e Relacionamentos MER .........................................................................................11 2.2.1.Entidades (Entidades Regulares e Fracas) ............................................................................................11 2.2.2.Propriedades .......................................................................................................................................12 2.2.3.Relacionamentos.................................................................................................................................12 2.2.4.Subtipos e supertipos de entidades .....................................................................................................13 2.3. Diagramas de Entidades e Relacionamentos DER .....................................................................................13 2.4. Comparao dos Conceitos .........................................................................................................................14 3. Tipos de Dados ...................................................................................................................................................14 3.1. Tipos Numricos (Inteiros e Pontos Flutuantes) ..........................................................................................14 3.2. Tipo de Cadeia de Caracteres ......................................................................................................................18 3.3. Tipos de Data e Hora...................................................................................................................................20 3.4. Tipo Booleano.............................................................................................................................................26 3.5. Tipo para Endereo de Rede .......................................................................................................................27 3.6. Tipos Adicionais ..........................................................................................................................................29 4. Instalao do Banco de Dados ............................................................................................................................30 4.1. Instalao no ambiente Windows ...............................................................................................................30 4.2. Instalao no ambiente Linux ......................................................................................................................35 5. DDL (Linguagem de Definio de Dados) - Comandos de Criao, Alterao e Excluso de banco dados , de tabelas, de restries, de unicidades, de ndices, de chaves estrangeiras .....................................................40 CREATE DATABASE .............................................................................................................................................40 ALTER DATABASE ...............................................................................................................................................41 DROP DATABASE ................................................................................................................................................42 CREATE SHEMA ..................................................................................................................................................43 ALTER SHEMA.....................................................................................................................................................45 DROP SHEMA .....................................................................................................................................................45 CREATE TABLE ....................................................................................................................................................46 ALTER TABLE ......................................................................................................................................................54 DROP TABLE .......................................................................................................................................................60 6. DML Linguagem de Manipulao de Dados Comandos de Incluso, Alterao, Excluso de Dados ................61 INSERT ...............................................................................................................................................................61 UPDATE ..............................................................................................................................................................63 DELETE ...............................................................................................................................................................65

2
Curso de PostgreSQL 2010

7. DQL Linguagem de Consulta de Dados Comando de Seleo de Dados .........................................................67 SELECT ...............................................................................................................................................................67 Expresses de tabela ..........................................................................................................................................68 Listas de seleo.................................................................................................................................................75 Ordenao de linhas ...........................................................................................................................................77 8. DCL Linguagem de Controle de Dados Comandos de Criao, Alterao e Excluso de usurios ....................78 CREATE USER......................................................................................................................................................78 ALTER USER ........................................................................................................................................................80 DROP USER.........................................................................................................................................................81 9. Operadores e Funes de Agregao ..................................................................................................................81 Operadores lgicos.............................................................................................................................................81 Operadores de comparao ...............................................................................................................................82 Funes de Agregao ........................................................................................................................................83 10. Autenticao de Usurios (arquivo pg_hba.conf) ................................................................................................85 O arquivo pg_hba.conf .......................................................................................................................................85 11. Princpios de administrao do banco de dados (backup e restaurao de dados) ..............................................87 pg_dump............................................................................................................................................................87 pg_restore..........................................................................................................................................................93 12. Referncias Bibliogrficas ...................................................................................................................................99

3
Curso de PostgreSQL 2010

1. Introduo 1.1. O que um sistema de banco de dados? Um sistema de banco de dados basicamente um sistema computadorizado de manuteno de registros, cuja finalidade geral armazenar informaes e permitir que os usurios busquem e atualizem essas informaes quando precisar. O banco de dados, por si s, pode ser considerado como o equivalente eletrnico de um armrio de arquivamento. Ou seja, ele um repositrio ou recipiente para uma coleo de arquivos de dados computadorizados. Os usurios podem solicitar que o sistema realize diversas operaes envolvendo tais arquivos, por exemplo: Acrescentar novos arquivos ao banco de dados; Inserir dados em arquivos existentes; Buscar dados em arquivos existentes; Excluir dados em arquivos existentes; Alterar dados em arquivos existentes; Remover arquivos existentes do banco de dados.

Comparao de um sistema de banco de dados com o mundo real. Armrio de arquivos Banco de Dados

Figura 1

Mundo Real Armrio Metlico Estruturado Gavetas grandes Pastas de arquivos Arquivos Informaes nos papis Fechaduras Organizao dos Arquivos em Ordem Alfabtica

Mundo Digital Sistema Gerenciador de Banco de Dados Banco de Dados Esquemas de objetos Tabelas Dados Controle de Acesso de Usurios Utilizar o comando de Seleo (SELECT) para ordenar (ORDER BY) crescentemente em ordem alfabtica.

4
Curso de PostgreSQL 2010

Controle de acesso aos bancos de dados, tabelas, comandos de alterao nas bases de dados, monitoramente e etc.

Sistema de gerenciamento de banco de dados (SGBD)

Banco de Dados

Programas aplicao

de
Usurios finais

Figura 2

O sistema de banco de dados envolve cinco componentes principais: dados, hardware, rede, software, usurios. Dados Existem dois tipos de sistemas para acessar os dados em sistemas de banco de dados: Sistema monousurio: um sistema em que no mximo um usurio pode acessar o banco de dados em determinado momento, este tipo de banco de dados j est fora de uso; Sistemas multiusurios: aquele em que muitos usurios podem acessar o banco de dados ao mesmo tempo.

A principal caracterstica dos dados em um sistema de banco de dados que os mesmos estaro integrados e compartilhados. Integrado: quer dizer que o banco de dados pode ser considerado como uma unificao de vrios arquivos que, de outro modo, seriam distintos, com a eliminao de qualquer redundncia (repetio desnecessria) parcial ou total entres esses arquivos; Compartilhado: quer dizer que os dados que esto armazenados no banco de dados podem ser compartilhados entre diferentes usurios, no sentido de que diferentes usurios podem ter acesso aos mesmos dados, possivelmente ao mesmo tempo (acesso concorrente), para isto o servidor deve ter alta disponibilidade.

Hardware Volumes de armazenamento secundrio normalmente, discos magnticos -, que so usados para manter os dados armazenados, juntamente com os dispositivos de E/S(entrada/sada) associados (unidades de disco etc.); Processador (es) de hardware e memria principal associada, que so usados para dar suporte execuo do software do sistema de banco de dados.

5
Curso de PostgreSQL 2010

Rede A interligao dos computadores com o servidor de banco de dados realizada por meio de uma rede de computadores a cabo ou uma rede sem fio. A comunicao dos dados feita de forma digital, por um protocolo de comunicao. O mais utilizado o TCP/IP. Software Entre o banco de dados fsico ou seja, os dados fisicamente armazenados e os usurios do sistema existe uma camada de software, conhecida como Gerenciador de Banco de Dados ou Servidor de Banco de Dados ou mais freqentemente, chamado de Sistema de Gerenciamento de Banco de Dados (SGBD). Todas as requisies de acesso ao banco de dados so tratadas pelo SGBD; os recursos esboados de acrescentar e remover arquivos (ou tabelas), buscar dados e atualizar dados em tais arquivos ou tabelas, e assim por diante, so facilidades fornecidas pelo SGBD. A funo geral fornecida pelo SGBD , portanto, a de isolar os usurios do banco de dados dos detalhes no nvel de hardware. Algumas observaes adicionais: O SGBD o componente de software mais importante de todo o sistema, mas no o nico. Outros componentes incluem utilitrios, ferramentas de desenvolvimento de aplicaes, recursos para auxiliar no projeto, geradores de relatrios e (mais importante) o gerenciador de transaes ou monitor de TP (Transaction Processing Processamento de Transaes); O termo SGBD tambm usado para se referir genericamente a algum produto especfico de algum fornecedor em particular por exemplo, SQL NAVIGATOR para o Oracle, EMS Manager para o PostgreSQL.

Usurios Consideramos trs classes gerais de usurios: Programadores de Aplicaes: so os responsveis pelas escritas de programas de aplicaes de banco de dados em alguma linguagem de programao, como Delphi, Java, PHP, Visual Studio, C#, C++. Esses programas acessam o banco de dados atravs de uma biblioteca de conexo o qual emite uma requisio necessria ao SGBD. Os programas acessam o banco de dados interativamente (por exemplo, a partir de um terminal on-line, ou de um desktop, notebook e etc); Usurios finais: temos dois tipos de usurios finais, alguns acessam o banco de dados por meio de uma aplicao comercial. E os outros so os administradores de sistemas que acessam o banco de dados atravs de softwares que interagem diretamente com o SGBD, realizando requisies de busca de dados, por exemplo, para criarem relatrios; Administradores de Banco de Dados (DBA): a pessoa que fornece o suporte tcnico necessrio para atribuir todas as decises estratgicas e normas com relao aos dados da empresa dentro do banco de dados.

1.2. O que um Banco de Dados? Banco de dados uma coleo de dados persistentes, usado pelos sistemas de aplicao de uma determinada empresa ou instituio. Referimos-nos a eles como dados persistentes, porque uma vez que os dados foram aceitos pelo SGBD para entrada no banco de dados, eles s podem ser removidos do banco de dados mais tarde por alguma requisio explcita ao SGBD, e no de qualquer forma, por exemplo, ao fechar um programa ou reiniciar o computador.

6
Curso de PostgreSQL 2010

Entidades e relacionamentos Em uma Transportadora de Veculos podemos citar as seguintes entidades: Veculos, Motoristas, Fretes, Mercadorias, Rotas e etc, ou seja, entidade qualquer objeto distinguvel que deva ser representado no banco de dados, do qual seja necessrio registrar informaes. O relacionamento so as interligaes destas entidades bsicas. Propriedades De forma simples as propriedades so as informaes detalhadas de uma entidade. Por exemplo: de uma entidade veculo podemos ter as seguintes propriedades: placa, marca, modelo, ano, valor, volume. E para cada propriedade definido um tipo de dado especfico que o mesmo ir armazenar no banco de dados, variando entre numrico, caractere, data, hora dentre outros tipos. Modelo de Dados O modelo de dados uma definio abstrata, autnoma e lgica dos objetos, operadores e outros elementos que, juntos constituem a mquina abstrata com a qual os usurios interagem. Os objetos nos permitem modelar a estrutura dos dados. Os operadores nos permitem modelar seu comportamento. A estrutura dos dados so representados por meio de linhas em tabelas.

Figura 3 Vantagens de um banco de dados As vantagens de um sistema de bancos de dados em relao aos mtodos tradicionais, baseados em papel, para manuteno de registros, so: Densidade: No h necessidade de arquivos de papel, possivelmente volumosos; Velocidade: A mquina pode obter e atualizar dados com rapidez muito maior que o ser humano; Menos trabalho montono: Grande parte do tdio de manter os arquivos mo eliminada. As tarefas mecnicas so sempre feitas com melhor qualidade por mquinas;

7
Curso de PostgreSQL 2010

Atualidade: Informaes precisas e atualizadas esto disponveis a qualquer momento sob consulta; Proteo: Os dados podem ser mais bem protegidos contra perda no intencional e acesso ilegal.

1.3. Independncia dos Dados A independncia de dados um objetivo importante dos sistemas de bancos de dados, pois pode ser definida como a imunidade das aplicaes a alteraes na representao fsica e na tcnica de acesso o que significa que as aplicaes envolvidas no dependem de qualquer representao fsica ou tcnica de acesso especifico. Existem trs termos na independncia de dados que devem ser abordados, so eles: Um campo armazenado a menor unidade de dados armazenados. O banco de dados conter muitas ocorrncias de cada um dos vrios tipos de campos armazenados; Um registro armazenado uma coleo de campos armazenados; Um arquivo armazenado uma coleo de registros que contenham os mesmos campos.

A representao dos dados armazenados esto sujeitos a possveis modificaes. Isto permite que o banco de dados cresa sem prejudicar logicamente as aplicaes existentes uma das razes mais importantes para se exigir a independncia dos dados em primeiro lugar. Por exemplo, deve ser possvel estender um registro armazenado existente pela adio de novos campos armazenados, em geral representando informaes adicionais relativas entidade. Na figura 3, temos: Campos armazenados: codproduto, produto, valor, unidrepasse, codfornecedor, fornecedor Segundo registro armazenado: 83, CARTUCHO DE TINTA HP 96 COLOR 14ML, 71.00, CX, 2,PAPELARIA TRIBUTARIA Arquivo armazenado: TABELA PRODUTO Com a independncia dos dados possvel adicionar o campo qtestoque no arquivo TABELA PRODUTO, e em seguida, adicionar os valores nos registros j armazenados.

1.4. Banco de Dados Relacional. O tipo de banco de dados relacional recebe esta descrio de relacional devido a que o termo relao essencialmente apenas um termo matemtico para designar tabela. Ou seja, banco de dados relacional simplesmente um banco de dados estruturado em tabelas.

1.5. Comunicao de Dados As requisies a bancos de dados de um usurio final so transmitidas de um computador cliente que pode estar fisicamente afastada do prprio sistema de banco de dados at o SGBD, sob forma de mensagens de comunicao. De modo semelhante, as respostas do SGBD para o computador cliente do usurio so transmitidas sob forma de mensagens. Todas essas transmisses de mensagens ocorrem sob o controle de outro componente de software, o Gerenciador de Comunicao de Dados (gerenciador DC Data Communications). O gerenciador DC no faz parte do SGBD, mas um sistema autnomo (separado). Porm, como o gerenciador DC e o SGBD so claramente obrigados a trabalhar em harmonia. No qual o SGBD toma conta do banco de dados e o gerenciador DC manipula todas as mensagens do SGBD e para o SGBD. No PostgreSQL o gerenciador de comunicao o postmaster, na seo 1.8 ser explicado o seu funcionamento com mais detalhes.

8
Curso de PostgreSQL 2010

1.6. Arquitetura Cliente/Servidor A arquitetura Cliente/Servidor uma estrutura muito simples em duas partes, constituindo um servidor, tambm chamado de back end, e um conjunto de clientes, tambm chamados front ends. Servidor: o prprio SGBD. Ele admite todas as funes do SGBD, de definio de dados, manipulao de dados, segurana e integridade de dados e etc; Clientes: so as diversas aplicaes executadas em cima do SGBD, tanto aplicaes escritas em alguma linguagem de programao como Delphi, Java e PHP ou aplicaes fornecidas pelo fabricante do SGBD, por exemplo SQLMaestro, EMS Manager, PgAdmin ou psql (terminal interativo para manipulao direta no banco de dados), todos estes so para PostgreSQL. Veja a seguir um exemplo de uma arquitetura cliente/servidor.

Clientes

Sistema Comercial

Sistema Comercial

Software Gerador de Relatrios

SGBD

Servidor

Figura 4 1.7. Banco de Dados PostgreSQL O PostgreSQL um SGBD relacional e orientado a objetos. um software de livre distribuio e tem seu cdigo-fonte aberto. Oferece suporte linguagem SQL (Structured Query Language Linguagem Estruturada de Consulta) de acordo com os padres SQL92/SQL99, alm de outras caractersticas modernas. Em termos de recursos, pode ser comparado aos melhores bancos de dados comerciais existentes, sendo inclusive superior em alguns aspectos. O PostgreSQL introduziu conceitos do modelo objeto-relacional que hoje esto disponveis em alguns bancos de dados comerciais. O desenvolvimento do PostgreSQL teve incio no ano de 1985, no departamento de Cincia da Computao da Universidade da Califrnia, em Berkeley. Hoje mantido pela Internet por um grupo de desenvolvedores. Os termos PostgreSQL e Postgres sero usados no decorrer desta apostila, ambos para referenciar esse SGBD, visto que o nome do inicial do projeto era Postgres.

9
Curso de PostgreSQL 2010

1.8. Arquitetura do PostgreSQL Antes de comear a utilizar o PostgreSQL, importante que haja a compreenso de sua arquitetura bsica. Quando aberta uma sesso do PostgreSQL, ou seja uma comunicao de um computador cliente com o servidor. Trs processos (programas em execuo) trabalham de forma cooperativa, so eles: O processo postmaster; Uma aplicao cliente que est acessando o SGBD (por exemplo, o Sistema Comercial); Um ou mais servidores de banco de dados (o prprio processo postgres).

Um nico processo postmaster gerencia as conexes aos bancos de dados existentes em uma mquina. As aplicaes cliente que desejam acessar determinado banco de dados fazem chamadas a uma biblioteca (chamada LIBPQ). A biblioteca envia a requisio do usurio pela rede para o processo postmaster, que cria um novo processo-servidor e conecta o processo-cliente ao servidor criado. A partir da, os processos-cliente e servidor (frontend e backend) se comunicam sem a interveno do postmaster. Veja a figura a seguir.
Mquina Cliente

Sistema Comercial

Biblioteca (LIBPQ)

postmaster

Cria a conexo com o servidor

Figura 5

Mquina Servidor

10
Curso de PostgreSQL 2010

2. Modelagem Conceitual do Banco de Dados 2.1. Abordagem geral A modelagem do banco de dados comea pelo entendimento da importncia da sua realizao para o projeto de banco de dados. um processo que decide toda estrutura do banco de dados. Se o mesmo no for realizada o DBA (Administrador de Banco de Dados), no ter uma viso completa de todo o sistema que compem seu banco de dados. A organizao dos dados e a evoluo do sistema de banco de dados dependem exclusivamente da realizao de uma boa modelagem. Erros de modelagem ocasionam na inviabilidade da evoluo do sistema. Por isto que est tarefa deve ser realizada com muita mais anlise e estudo. Para fazermos a modelagem do banco de dados iremos utilizar as tcnicas do Modelo de Entidades/Relacionamentos. A explicao das tcnicas no s definem de modo que seja a nica verdade das mesmas, mas sim da suporte a uma flexibilidade de interpretao. 2.2. Modelo de Entidades e Relacionamentos - MER O Modelo de Entidades e Relacionamentos um modelo abstrato cuja finalidade descrever, de maneira conceitual, os dados a serem utilizados em um Sistema de Informaes. A principal ferramenta do modelo sua representao grfica, o Diagrama Entidade Relacionamento. Normalmente o modelo conhecido pela sua sigla MER e o diagrama pela sigla DER, o diagrama ser abordado com mais detalhes posteriormente. 2.2.1.Entidades (Entidades Regulares e Fracas) Uma entidade de modo formal um objeto perceptvel, de forma informal podemos dizer que uma coisa que pode ser identificada distintamente. Juntando as duas definies seria, um objeto que faz parte de um sistema, que tem uma identificao distinta e que influencia no processo de um sistema. Podemos classificar as entidades como: Entidade Fraca: uma entidade cuja existncia depende de alguma outra entidade, no sentido de que ela no pode existir se essa outra entidade tambm no existir. Por exemplo, a entidade Dependente s pode existir se a entidade Empregado existir no sistema; Entidade Regular (forte): Ao contrrio a entidade regular uma entidade que no fraca, tem a sua existncia por si s.

Exemplos: Tipos de Sistema Sistema de Indstria de Veculos Entidades Fornecedor Veculo Pea Departamento Empregado Dependente Pedido de Compra Item Estoque Classificao

Sistema de RH

Sistema de Vendas

11
Curso de PostgreSQL 2010

2.2.2. Propriedades Propriedade um item de informao que descreve uma entidade. Para melhorar o entendimento podemos visualizar a propriedade como uma caracterstica que comum para todas as ocorrncias de uma entidade. Por exemplo, em uma entidade EMPREGADO todos os empregados tm uma matricula, um nome, um salrio, e assim por diante. E tambm alguns autores utilizam o termo atributo em lugar de propriedade. As propriedades podem ser: Simples ou compostas: Por exemplo, a propriedade composta nome de empregado poderia ser constituda das propriedades simples primeiro nome, nome do meio, ltimo nome; Chave: uma propriedade que exclusiva nos seus valores, por exemplo o CPF, ou um endereo de email, no DER colocamos o smbolo @ para representar uma chave; Univalorada ou multivalorada: Univalorada assume somente um valor, multivalorada possui mais de um valor.

2.2.3. Relacionamentos Um relacionamento uma associao entre entidades, baseando em fatos do mundo real. As entidades envolvidas em determinado relacionamento so ditas participantes desse relacionamento. O nmero de participantes em determinado relacionamento chamado grau desse relacionamento. Podemos ter relacionamentos binrios, tercirios e assim por diante, sendo que quanto mais entidades estiverem participando no relacionamento mais complexo se torna o entendimento. Denominados os tipos associao entre duas entidades de cardinalidade, elas podem ser: Um para um ( 1 : 1 ) Uma instncia de uma entidade se relaciona somente com uma nica instncia de uma outra entidade, por exemplo:

USUARIO

USU_EMP

EMPREGADO

EMP_MOT

MOTORISTA

Um para muitos ( 1 : M ) Uma instncia de uma entidade se relaciona com muitos instncias de uma outra entidade, por exemplo:

DEPATARMENTO

DEPTO_EMP

EMPREGADO

Muitos para muitos ( M : M ) Muitas instncias de uma entidade se relaciona com muitas instncias de uma outra entidade, por exemplo:

12
Curso de PostgreSQL 2010

EMPREGADO

EMP_PROJ

PROJETO

2.2.4.Subtipos e supertipos de entidades Uma entidade subtipo descende de outra entidade. Por exemplo, temos a entidade MOTORISTA que um subtipo da entidade EMPREGADO. A entidade EMPREGADO um supertipo da entidade MOTORISTA. Podemos ter mais dois subtipos de MOTORISTA, sendo eles, MOTORISTA_CARRETA e MOTORISTA_CARRO, com isto podemos estabelecer que existe uma hierarquia dos tipos de entidades. Por exemplo:

EMPREGADO

MOTORISTA

MOTORISTA_CARRETA
2.3. Diagramas de Entidade e Relacionamento - DER

MOTORISTA_CARRO

Diagramas constituem uma tcnica para representar a estrutura lgica de um banco de dados de modo grfico. A diagramao um meio simples e fcil de representar o Modelo de Entidades e Relacionamentos e com isto entender os aspectos principais de um projeto de banco de dados. A seguir explicamos a simbologia utilizada:

ENTIDADES so os retngulos. ENTIDADE REGULAR:

ENTIDADE FRACA:

PROPRIEDADES so as elipses.

RELACIONAMENTOS so os losangos. RELACIONAMENTOS ENTRE ENTIDADES REGULARES RELACIONAMENTO ENTRE UMA ENTIDADE FRACA E UMA REGULAR

13
Curso de PostgreSQL 2010

2.4. Comparao dos conceitos Modelo de Entidade Relacionamento Entidade Instncia ou Ocorrncia Propriedade Relacionamento Modelo Conceitual Arquivo Registro Campo Ligao dos Arquivos Banco de Dados Tabela Linha Coluna (Campos) Relacionamento de chaves estrangeiras com chaves primrias

3. Tipos de dados
Os campos das tabelas precisam ser definidos com tipos de dados especficos. Cada tipo de dado determina quais valores podero ser armazenados nos campos. Por exemplo, numa tabela PRODUTO podemos ter os seguintes tipos de dados para cada campo. Campo descricao preco status observacao Tipo de Dado Cadeia de Caracteres Numrico Booleano Texto Tipo de Dado no SQL VARCHAR(100) DECIMAL(10,2) BOOLEAN TEXT Contedo do Campo ARROZ 5 KG TIPO FINO 9.56 1 DESDE A SAFRA DE 2009 ESTE PRODUTO ESTA COM UMA QUALIDADE INFERIOR

A definio de dados muito importante pelos seguintes motivos: Restrio na armazenagem dos dados. Por exemplo, no campo preo do produto, sendo definido como DECIMAL no ser possvel armazenar valores que contenham letras, apenas nmeros inteiros ou decimais. Se fosse permitido gravar letras no campo preo o sistema estaria suscetvel a ocasionar erros quando fosse efetuar operaes matemticas, como somar todos os preos dos produtos. Caso se em algum registro de produto, o campo preo tiver armazenado 345.00 reais, a palavra reais no permitiria a concluso da operao de soma. Economia de espao no banco de dados: Por exemplo, para campos que armazenam nmeros de pequena escala no recomendvel que sejam dos tipos de numricos como INTEGER(4 bytes) ou BIGINT(8 bytes), mais sim o SMALLINT(2 bytes). Parece ser irrisria a quantia de 2 a 6 bytes de diferena mais se tratando de um banco de dados com mais de 300 Gb, esta regra j surge um grande efeito no desempenho do banco de dados.

3.1. Tipos Numricos (Inteiros e Pontos Flutuantes);

Os tipos numricos consistem em inteiros de dois, quatro e oito bytes, nmeros de ponto flutuante de quatro e oito bytes, e decimais de preciso selecionvel. A seguir vejamos os tipos disponveis.

14
Curso de PostgreSQL 2010

Nome SMALLINT

Tamanho de armazenamento 2 bytes

Descrio inteiro com pequena escolha inteiro usual faixa

Faixa de valores -32.768 a +32.767

INTEGER BIGINT DECIMAL NUMERIC REAL DOUBLE PRECISION SERIAL BIGSERIAL

4 bytes 8 bytes varivel varivel 4 bytes 8 bytes 4 bytes 8 bytes

para

-2.147.483.648 a +2.147.483.647 -9.223.372.036.854.775.808 9.223.372.036.854.775.807 sem limite sem limite preciso de 6 dgitos decimais preciso de 15 dgitos decimais 1 a 2.147.483.647 1 a 9.223.372.036.854.775.807 a

inteiro com faixa larga preciso especificada pelo usurio, exato preciso especificada pelo usurio, exato preciso inexato preciso inexato varivel, varivel, auto-

inteiro com incremento

inteiro grande com auto-incremento

Tipos Inteiros Os tipos SMALLINT, INTEGER e BIGINT armazenam nmeros inteiros, ou seja, nmeros sem a parte fracionria, com faixas diferentes. A tentativa de armazenar um valor fora da faixa permitida resulta em erro. O tipo INTEGER a escolha usual, porque oferece o melhor equilbrio entre faixa de valores, tamanho de armazenamento e desempenho. Geralmente o tipo SMALLINT s utilizado quando o espao em disco est muito escasso. O tipo BIGINT somente deve ser usado quando a faixa de valores de INTEGER no for suficiente, porque este ltimo bem mais rpido. O tipo BIGINT pode no funcionar de modo correto em todas as plataformas, porque depende de suporte no compilador para inteiros de oito bytes. Nas mquinas sem este suporte, o BIGINT age do mesmo modo que o INTEGER (mas ainda ocupa oito bytes de armazenamento). Entretanto, no de nosso conhecimento nenhuma plataforma razovel onde este caso se aplique. O padro SQL somente especifica os tipos inteiros INTEGER (ou INT) e SMALLINT. O tipo BIGINT, e os nomes de tipo INT2, INT4 e INT8 so extenses, tambm compartilhadas por vrios outros sistemas de banco de dados SQL. Nmeros com preciso arbitrria O tipo NUMERIC pode armazenar nmeros com preciso de at 1.000 dgitos e realizar clculos exatos. recomendado, especialmente, para armazenar quantias monetrias e outras quantidades onde se requeira exatido. Entretanto, a aritmtica em valores do tipo NUMERIC muito lenta se comparada com os tipos inteiros, ou com os tipos de ponto flutuante descritos na prxima seo. So utilizados os seguintes termos: A escala do tipo NUMERIC o nmero de dgitos decimais da parte fracionria, direita do ponto decimal. A preciso do tipo NUMERIC o nmero total de dgitos

15
Curso de PostgreSQL 2010

significativos de todo o nmero, ou seja, o nmero de dgitos nos dois lados do ponto decimal. Portanto, o nmero 23.5141 possui preciso igual a 6 e escala igual a 4. Os inteiros podem ser considerados como tendo escala igual a zero. Tanto a preciso mxima quanto a escala de uma coluna do tipo NUMERIC podem ser configuradas. Para declarar uma coluna do tipo NUMERIC utilizada a sintaxe:

NUMERIC (preciso, escala)

A preciso deve ser um nmero positivo, enquanto a escala pode ser zero ou positiva. Como forma alternativa,

NUMERIC(preciso)

define a escala como sendo igual a 0. Especificando-se

NUMERIC

sem qualquer preciso ou escala criada uma coluna onde podem ser armazenados valores numricos com qualquer preciso ou escala, at a preciso limite da implementao. Se a escala do valor a ser armazenado for maior que a escala declarada para a coluna, o sistema arredonda o valor para o nmero de dgitos fracionrios especificado. Depois, se o nmero de dgitos esquerda do ponto decimal exceder a preciso declarada menos a escala declarada, gerado um erro. Arredondamento em tipo NUMERIC. Abaixo esto mostrados exemplos de insero de dados em um campo do tipo NUMERIC. No terceiro exemplo o arredondamento faz com que a preciso do campo seja excedida. [6]

BEGIN; CREATE TEMPORARY TABLE t ( c NUMERIC(6,3)) ON COMMIT DROP; INSERT INTO t VALUES (998.9991); INSERT INTO t VALUES (998.9999); SELECT * FROM t; c --------998.999 999.000 (2 linhas) INSERT INTO t VALUES (999.9999); ERRO: estouro de campo numrico DETALHE: O valor absoluto maior ou igual a 10^3 para campo com preciso 6, escala 3. COMMIT;

16
Curso de PostgreSQL 2010

ROLLBACK

Os valores numricos so armazenados fisicamente sem zeros adicionais no incio ou no final. Portanto, a preciso e a escala declaradas para uma coluna so as alocaes mximas, e no fixas (Sob este aspecto o tipo NUMERIC mais semelhante ao tipo VARCHAR(N) do que ao tipo CHAR(N)). Os tipos DECIMAL e NUMERIC so equivalentes. Os dois tipos fazem parte do padro SQL. Tipos de ponto flutuante Os tipos de dado REAL e DOUBLE PRECISION so tipos numricos no exatos de preciso varivel.

Se for necessrio armazenamento e clculos exatos (como em quantias monetrias), em vez de tipos de ponto flutuante deve ser utilizado o tipo NUMERIC; Se for desejado efetuar clculos complicados usando tipos de ponto flutuante para algo importante, especialmente dependendo de certos comportamentos em situaes limites (infinito ou muito prximo de zero), a implementao deve ser avaliada cuidadosamente; A comparao de igualdade de dois valores de ponto flutuante pode funcionar conforme o esperado, ou no.

Na maioria das plataformas o tipo real possui uma faixa de pelo menos 1E-37 a 1E+37, com preciso de pelo menos 6 dgitos decimais. O tipo double precision normalmente possui uma faixa em torno de 1E-307 a 1E+308 com preciso de pelo menos 15 dgitos. Os valores muito pequenos ou muito grandes causam erro. O arredondamento pode acontecer se a preciso do nmero entrado for muito grande. Os nmeros muito prximos de zero, que no podem ser representados de forma distinta de zero, causam erro de underflow. Alm dos valores numricos ordinrios, os tipos de ponto flutuante possuem diversos valores especiais: INFINITY -INFINITY NAN

Tipos seriais Os tipos de dado SERIAL e BIGSERIAL no so tipos verdadeiros, mas meramente uma notao conveniente para definir colunas identificadoras nicas (semelhante propriedade AUTO_INCREMENTO existente em alguns outros bancos de dados). Por exemplo: CREATE TABLE nome_da_tabela ( nome_da_coluna SERIAL ); Isto equivale a especificar: CREATE SEQUENCE nome_da_tabela_nome_da_coluna_seq; CREATE TABLE nome_da_tabela ( nome_da_coluna integer DEFAULT NEXTVAL('nome_da_tabela_nome_da_coluna_seq') NOT NULL );

17
Curso de PostgreSQL 2010

Conforme visto, foi criada uma coluna do tipo inteiro e feito o valor padro ser atribudo a partir de um gerador de seqncia. A restrio NOT NULL aplicada para garantir que no pode ser inserido o valor nulo explicitamente. Para inserir o prximo valor da seqncia em uma coluna do tipo serial deve ser especificada a atribuio do valor padro coluna serial, o que pode ser feito omitindo a coluna na lista de colunas no comando INSERT, ou atravs da utilizao da palavra chave DEFAULT. Os nomes de tipo SERIAL e SERIAL4 so equivalentes: ambos criam colunas do tipo INTEGER. Os nomes de tipo BIGSERIAL e SERIAL8 funcionam da mesma maneira, exceto por criarem uma coluna BIGINT. Deve ser utilizado BIGSERIAL se forem esperados mais de 231 identificadores durante a existncia da tabela. A seqncia criada para a coluna do tipo serial removida automaticamente quando a coluna que a definiu removida. A seqncia criada para a coluna do tipo serial pode ter seus parmetros alterados atravs do comando ALTER SEQUENCE, da mesma forma que qualquer outra seqncia criada atravs do comando CREATE SEQUENCE. Este exemplo mostra como proceder para fazer com que o valor inicial da coluna do tipo serial seja igual a 1000. => CREATE TABLE t ( c1 SERIAL, c2 TEXT); => ALTER SEQUENCE t_c1_seq RESTART WITH 1000; => INSERT INTO t VALUES (DEFAULT, 'Primeira linha'); => SELECT * FROM t; c1 | c2 ------+---------------1000 | Primeira linha Nas pginas 671 e 738 da Documentao do PostgreSQL 8.0.0 fala de todos os parmetros de manipulao de sequncias. 3.2. Tipo de Cadeia de Caracteres; Nome
CHARACTER VARYING(N), VARCHAR(N)

Descrio
comprimento varivel com limite

CHARACTER(N), CHAR(N) TEXT

comprimento fixo, completado com brancos comprimento varivel no limitado

O SQL define dois tipos primrios para caracteres: CHARACTER VARYING(N) E CHARACTER(N), onde n um nmero inteiro positivo. Estes dois tipos podem armazenar cadeias de caracteres com comprimento de at n caracteres. A tentativa de armazenar uma cadeia de caracteres mais longa em uma coluna de um destes tipos resulta em erro, a no ser que os caracteres excedentes sejam todos espaos; neste caso a cadeia de caracteres ser truncada em seu comprimento mximo (Esta exceo um tanto bizarra requerida pelo padro SQL). Se a cadeia de caracteres a ser armazenada for mais curta que o comprimento declarado, os valores do tipo CHARACTER so completados com espaos; os valores do tipo CHARACTER VARYING simplesmente armazenam uma cadeia de caracteres mais curta. Se um valor for convertido explicitamente (CAST) para CHARACTER VARYING(N), ou para CHARACTER(N), o excesso de comprimento ser truncado para n caracteres sem gerar erro (isto tambm requerido pelo padro SQL).

18
Curso de PostgreSQL 2010

As notaes VARCHAR(N) e CHAR(N) so sinnimos para CHARACTER VARYING(N) e CHARACTER(N), respectivamente. O uso de CHARACTER sem especificao de comprimento equivale a CHARACTER(1); se for utilizado CHARACTER VARYING sem especificador de comprimento, este tipo aceita cadeias de caracteres de qualquer tamanho. Este ltimo uma extenso do PostgreSQL. Alm desses o PostgreSQL disponibiliza o tipo text, que armazena cadeias de caracteres de qualquer comprimento. Embora o tipo text no esteja no padro SQL, vrios outros sistemas gerenciadores de banco de dados SQL tambm o possuem. Os valores do tipo CHARACTER so preenchidos fisicamente com espaos at o comprimento n especificado, sendo armazenados e mostrados desta forma. Entretanto, os espaos de preenchimento so tratados como no sendo significativos semanticamente. Os espaos de preenchimento so desconsiderados ao se comparar dois valores do tipo CHARACTER, e so removidos ao converter um valor do tipo CHARACTER para um dos outros tipos para cadeia de caracteres. Deve ser observado que os espaos no final so significativos semanticamente nos valores dos tipos CHARACTER VARYING e TEXT. So necessrios para armazenar dados destes tipos 4 bytes mais a prpria cadeia de caracteres e, no caso do tipo character, mais os espaos para completar o tamanho. As cadeias de caracteres longas so comprimidas automaticamente pelo sistema e, portanto, o espao fsico necessrio em disco pode ser menor. Os valores longos tambm so armazenados em tabelas secundrias, para no interferirem com o acesso rpido aos valores mais curtos da coluna. De qualquer forma, a cadeia de caracteres mais longa que pode ser armazenada em torno de 1 GB (O valor mximo permitido para n na declarao do tipo de dado menor que isto. No seria muito til mudar, porque de todo jeito nas codificaes de caractere multibyte o nmero de caracteres e de bytes podem ser bem diferentes. Se for desejado armazenar cadeias de caracteres longas, sem um limite superior especificado, deve ser utilizado TEXT ou CHARACTER VARYING sem a especificao de comprimento, em vez de especificar um limite de comprimento arbitrrio). Dica: No existe diferena de desempenho entre estes trs tipos, a no ser pelo aumento do tamanho do armazenamento quando utilizado o tipo completado com brancos. Enquanto o tipo CHARACTER(N) possui vantagens no desempenho em alguns outros sistemas gerenciadores de banco de dados, no possui estas vantagens no PostgreSQL. Na maioria das situaes deve ser utilizado TEXT ou CHARACTER VARYING em vez deste tipo. Exemplo. Utilizao dos tipos para cadeias de caracteres.

=> CREATE TABLE teste1 (a character(4)); => INSERT INTO teste1 VALUES ('ok'); => SELECT a, char_length(a) FROM teste1; -- (1) Resultado a | char_length ------+------------ok | 4 => CREATE TABLE teste2 (b VARCHAR(5)); => INSERT INTO teste2 VALUES ('ok'); => INSERT INTO teste2 VALUES ('bom '); -- (2)

=> INSERT INTO teste2 VALUES ('muito longo');

19
Curso de PostgreSQL 2010

ERRO: valor muito longo para o tipo character varying(5) => INSERT INTO teste2 VALUES (CAST('muito longo' AS VARCHAR(5))); -- truncamento explcito => SELECT b, char_length(b) FROM teste2; Resultado b | char_length --------+------------ok | 2 bom | 5 muito | 5

3.3. Tipos de Data e Hora;

O PostgreSQL suporta o conjunto completo de tipos para data e hora do SQL. Nome TIMESTAMP [ (p) ] [ without time zone ] TIMESTAMP [ (p) ] with time zone INTERVAL [ (p) ] DATE TIME [ (p) ] [ without time zone ] TIME [ (p) ] with time zone Tamanho de Armazenamento 8 bytes Descrio tanto data quanto hora tanto data quanto hora, com zona horria intervalo de tempo somente data somente a hora do dia somente a hora do dia, com zona horria Menor valor 4713 AC Maior valor 5874897 DC Resoluo 1 microssegundo / 14 dgitos 1 microssegundo / 14 dgitos 1 microssegundo / 14 dgitos 1 dia 1 microssegundo / 14 dgitos 1 microssegundo / 14 dgitos

8 bytes

4713 AC

5874897 DC

12 bytes 4 bytes 8 bytes

-178000000 anos 4713 AC 00:00:00.00

178000000 anos 32767 DC 23:59:59.99

12 bytes

00:00:00.00+12

23:59:59.9912

Os tipos TIME, TIMESTAMP, E INTERVAL aceitam um valor opcional de preciso p, que especifica o nmero de dgitos fracionrios mantidos no campo de segundos. Por padro no existe limite explcito para a preciso. O intervalo permitido para p de 0 a 6 para os tipos TIMESTAMP e INTERVAL. O tipo TIME WITH TIME ZONE definido pelo padro SQL, mas a definio contm propriedades que levam a uma utilidade duvidosa. Na maioria dos casos, a combinao de DATE, TIME, TIMESTAMP WITHOUT TIME ZONE e TIMESTAMP WITH TIME ZONE deve fornecer uma faixa completa de funcionalidades para data e hora requeridas por qualquer aplicativo. Entrada de data e hora

20
Curso de PostgreSQL 2010

A entrada da data e da hora aceita em praticamente todos os formatos razoveis, incluindo o ISO 8601, o SQLcompatvel, o POSTGRES tradicional, alm de outros. Para alguns formatos a ordem do dia, ms e ano na entrada da data ambguo e, por isso, existe suporte para especificar a ordem esperada destes campos. Deve ser definido o parmetro DateStyle como MDY para selecionar a interpretao ms-dia-ano, DMY para selecionar a interpretao dia-ms-ano, ou YMD para selecionar a interpretao ano-ms-dia. O PostgreSQL mais flexvel no tratamento da entrada de data e hora do que o requerido pelo padro SQL. A configurao do formato de data e hora pode ser realizado no arquivo de configurao postgresql.conf, sua explicao ser abordada mais a frente. Lembre-se que qualquer entrada literal de data ou hora necessita estar entre apstrofos, como os textos das cadeias de caracteres. Tabela de Entrada de data Exemplo January 1999 1999-01-08 1/8/1999 1/18/1999 01/02/03 1999-Jan-08 Jan-08-1999 08-Jan-1999 99-Jan-08 08-Jan-99 Jan-08-99 19990108 990108 1999.008 J2451187 January 8, 99 BC Horas Os tipos hora-do-dia so TIME [ (P) ] WITHOUT TIME ZONE E TIME [ (P) ] WITH TIME ZONE. Escrever apenas TIME equivale a escrever TIME WITHOUT TIME ZONE. Entradas vlidas para estes tipos consistem na hora do dia seguida por uma zona horria opcional. Se for especificada a zona horria na entrada de TIME WITHOUT TIME ZONE, esta ignorada em silncio. Entrada de hora 8, Descrio no-ambguo em qualquer modo de entrada em datestyle ISO 8601; 8 de janeiro em qualquer modo (formato recomendado) 8 de janeiro no modo MDY; 1 de agosto no modo DMY 18 de janeiro no modo MDY; rejeitado nos demais modos 2 de janeiro de 2003 no modo MDY; 1 de fevereiro de 2003 no modo DMY; 3 de fevereiro de 2001 no modo YMD 8 de janeiro e qualquer modo January 8 em qualquer modo 8 de janeiro em qualquer modo 8 de janeiro no modo YMD, caso contrrio errado 8 de janeiro, porm errado no modo YMD 8 de janeiro, porm errado no modo YMD ISO 8601; 8 de janeiro de 1999 em qualquer modo ISO 8601; 8 de janeiro de 1999 em qualquer modo ano e dia do ano dia juliano ano 99 antes da era comum [a]

21
Curso de PostgreSQL 2010

Exemplo 04:05:06.789 04:05:06 04:05 040506 04:05 AM 04:05 PM 04:05:06.789-8 04:05:06-08:00 04:05-08:00 040506-08 04:05:06 PST Entrada de zona horria Exemplo PST -8:00 -800 -8 zulu z Descrio ISO 8601 ISO 8601 ISO 8601 ISO 8601

Descrio

o mesmo que 04:05; AM no afeta o valor o mesmo que 16:05; a hora entrada deve ser <= 12 ISO 8601 ISO 8601 ISO 8601 ISO 8601 zona horria especificada pelo nome

Hora Padro do Pacfico (Pacific Standard Time) deslocamento ISO-8601 para PST deslocamento ISO-8601 para PST deslocamento ISO-8601 para PST Abreviatura militar para UTC Forma abreviada de zulu

Consulte o Apndice B, na pgina 1032 da Documentao PostgreSQL 8.0.0 para ver a lista de nomes de zona horria reconhecidos na entrada. O padro SQL diferencia os literais TIMESTAMP WITHOUT TIME ZONE de TIMESTAMP WITH TIME ZONE pela existncia de "+"; ou "-". Portanto, de acordo com o padro,

TIMESTAMP '2004-10-19 10:23:54'

um TIMESTAMP WITHOUT TIME ZONE , enquanto

TIMESTAMP '2004-10-19 10:23:54+02'

um TIMESTAMP WITH TIME ZONE. O PostgreSQL difere do padro requerendo que os literais TIMESTAMP WITH TIME ZONE sejam digitados explicitamente:

22
Curso de PostgreSQL 2010

TIMESTAMP WITH TIME ZONE '2004-10-19 10:23:54+02'

Se o literal no for informado explicitamente como sendo TIMESTAMP WITH TIME ZONE, o PostgreSQL ignora em silncio qualquer indicao de zona horria no literal. Ou seja, o valor resultante de data e hora derivado dos campos data e hora do valor da entrada, no sendo ajustado conforme a zona horria. Para TIMESTAMP WITH TIME ZONE, o valor armazenado internamente est sempre em UTC (Tempo Universal Coordenado, tradicionalmente conhecido por Hora Mdia de Greenwich, GMT [1]). Um valor de entrada possuindo a zona horria especificada explicitamente convertido em UTC utilizando o deslocamento apropriado para esta zona horria. Se no for especificada nenhuma zona horria na cadeia de caracteres da entrada, pressupe-se que est na mesma zona horria indicada pelo parmetro do sistema timezone, sendo convertida em UTC utilizando o deslocamento da zona em timezone. Quando um valor de TIMESTAMP WITH TIME ZONE enviado para a sada, sempre convertido de UTC para a zona horria corrente de TIMEZONE, e mostrado como hora local desta zona. Intervalos Os valores do tipo interval podem ser escritos utilizando uma das seguintes sintaxes:

[@] quantidade unidade [quantidade unidade...] [direo]

onde: quantidade um nmero (possivelmente com sinal); unidade second, minute, hour, day, week, month, year, decade, century, millennium, ou abreviaturas ou plurais destas unidades; direo pode ser ago (atrs) ou vazio. O sinal de arroba (@) opcional. As quantidades com unidades diferentes so implicitamente adicionadas na conta com o sinal adequado. As quantidades de dias, horas, minutos e segundos podem ser especificadas sem informar explicitamente as unidades. Por exemplo, '1 12:59:10' lido do mesmo modo que '1 day 12 hours 59 min 10 sec'. Valores especiais Por ser conveniente, o PostgreSQL tambm suporta vrios valores especiais para entrada de data e hora, conforme mostrado. Os valores INFINITY e -INFINITY possuem representao especial dentro do sistema, sendo mostrados da mesma maneira; porm, os demais so simplesmente notaes abreviadas convertidas para valores comuns de data e hora ao serem lidos (Em particular, NOW e as cadeias de caracteres relacionadas so convertidas para um valor especfico de data e hora to logo so lidas). Todos estes valores devem ser escritos entre apstrofos quando usados como constantes nos comandos SQL. Entradas especiais de data e hora Cadeia de caracteres Entrada EPOCH INFINITY

Tipos vlidos DATE, TIMESTAMP TIMESTAMP

Descrio 1970-01-01 00:00:00+00 (hora zero do sistema Unix) mais tarde que todos os outros carimbos do tempo

23
Curso de PostgreSQL 2010

Cadeia de caracteres Entrada -INFINITY NOW TODAY TOMORROW YESTERDAY ALLBALLS

Tipos vlidos TIMESTAMP DATE, TIMESTAMP TIME,

Descrio mais cedo que todos os outros carimbos do tempo hora de incio da transao corrente meia-noite de hoje meia-noite de amanh meia-noite de ontem 00:00:00.00 UTC

DATE, TIMESTAMP DATE, TIMESTAMP DATE, TIMESTAMP TIME

Tambm podem ser utilizadas as seguintes funes, compatveis com o padro SQL, para obter o valor corrente de data e hora para o tipo de dado correspondente: CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, LOCALTIME e LOCALTIMESTAMP. As ltimas quatro aceitam, opcionalmente, a especificao da preciso. Entretanto, deve ser observado que so funes SQL, no sendo reconhecidas como cadeias de caracteres de entrada de dados. Utilizao das entradas especiais de data e hora Neste exemplo so mostradas utilizaes das entradas especiais de data e hora para o tipo TIMESTAMP WITH TIME ZONE.

BEGIN; CREATE TEMPORARY TABLE t ( c1 TEXT, c2 TIMESTAMP WITH TIME ZONE ) ON COMMIT DROP; INSERT INTO t VALUES ('epoch', 'epoch'); INSERT INTO t VALUES ('infinity', 'infinity'); INSERT INTO t VALUES ('-infinity', '-infinity'); INSERT INTO t VALUES ('now', 'now'); INSERT INTO t VALUES ('today', 'today'); INSERT INTO t VALUES ('tomorrow', 'tomorrow'); INSERT INTO t VALUES ('yesterday', 'yesterday'); INSERT INTO t VALUES ('CURRENT_TIMESTAMP', CURRENT_TIMESTAMP); SELECT * FROM t; COMMIT; c1 | c2 ------------------------------+---------------------------epoch | 1969-12-31 21:00:00-03 infinity | infinity -infinity | -infinity now | 2007-03-04 09:10:20.234-03 today | 2007-03-04 00:00:00-03 tomorrow | 2007-03-05 00:00:00-03 yesterday | 2007-03-03 00:00:00-03 CURRENT_TIMESTAMP | 2007-03-04 09:10:20.234-03 (8 linhas)

24
Curso de PostgreSQL 2010

Sadas de data e hora Utilizando o comando SET datestyle o formato de sada para os tipos de data e hora podem ser definidos como um dos quatro estilos ISO 8601, SQL (Ingls), POSTGRES tradicional e German. O padro o formato ISO (o padro SQL requer a utilizao do formato ISO 8601; o nome do formato de sada "SQL" um acidente histrico). A Tabela 8-14 mostra exemplo de cada um dos estilos de sada. A sada dos tipos date e time obviamente utilizam apenas a parte da data ou da hora de acordo com os exemplos fornecidos. Estilos de sada de data e hora Especificao de estilo ISO SQL POSTGRES German Descrio ISO 8601/padro SQL estilo tradicional estilo original estilo regional Exemplo 2005-04-21 18:39:28.283566-03 04/21/2005 18:39:28.283566 BRT Thu Apr 21 18:39:28.283566 2005 BRT 21.04.2005 18:39:28.283566 BRT

Nos estilos SQL e POSTGRES, o dia vem antes do ms se a ordem de campo DMY tiver sido especificada, seno o ms vem antes do dia (veja na Seo 8.5.1 como esta especificao tambm afeta a interpretao dos valores de entrada). A Convenes de ordem na data Definio de datestyle SQL, DMY SQL, MDY Postgres, DMY European, DMY Ordem de entrada dia/ms/ano ms/dia/ano dia/ms/ano dia/ms/ano Exemplo de sada 21/04/2005 18:39:28.283566 BRT 04/21/2005 18:39:28.283566 BRT Thu 21 Apr 18:39:28.283566 2005 BRT 12/11/2005 12:20:00

A sada do tipo INTERVAL se parece com o formato da entrada, exceto que as unidades como century e week so convertidas em anos e dias, e que agora convertido no sinal apropriado. No modo ISO a sada se parece com

[ quantidade unidade [ ... ] ] [ dias ] [ horas:minutos:segundos ]

Os estilos de data e hora podem ser selecionados pelo usurio utilizando o comando SET datestyle, o parmetro DateStyle no arquivo de configurao postgresql.conf, ou a varivel de ambiente PGDATESTYLE no servidor ou no cliente. A funo de formatao to_char tambm pode ser utilizada como uma forma mais flexvel de formatar a sada de data e hora. Zonas horrias Zonas horrias e convenes de zonas horrias so influenciadas por decises polticas, e no apenas pela geometria da Terra. As zonas horrias em torno do mundo se tornaram um tanto padronizadas durante o sculo XX, mas continuam propensas a mudanas arbitrrias, particularmente com relao a horrios de inverno e de vero. Atualmente o PostgreSQL suporta as regras de horrio de inverno e vero (daylight-savings rules) no perodo de tempo que vai de 1902 at 2038 (correspondendo faixa completa de tempo do sistema Unix convencional). Datas fora desta faixa so

25
Curso de PostgreSQL 2010

consideradas como estando na "hora padro" da zona horria selecionada, sem importar em que parte do ano se encontram. O PostgreSQL se esfora para ser compatvel com as definies do padro SQL para o uso tpico. Entretanto, o padro SQL possui uma combinao nica de tipos e funcionalidades para data e hora. Os dois problemas bvios so:

Embora o tipo date no possua zona horria associada, o tipo time pode possuir. As zonas horrias do mundo real possuem pouco significado a menos que estejam associadas a uma data e hora, porque o deslocamento pode variar durante o ano devido ao horrio de vero. A zona horria padro especificada como um deslocamento numrico constante em relao ao UTC. No possvel, portanto, fazer ajuste devido ao horrio de vero ao se realizar aritmtica de data e hora entre fronteiras do horrio de vero .

Para superar estas dificuldades, recomenda-se utilizar tipos de data e hora contendo tanto a data quanto a hora quando utilizar zonas horrias. Recomenda-se no utilizar o tipo time with time zone (embora seja suportado pelo PostgreSQL para os aplicativos legados e para conformidade com o padro SQL). O PostgreSQL assume a zona horria local para qualquer tipo contendo apenas a data ou a hora. Todas as datas e horas com zona horria so armazenadas internamente em UTC. So convertidas para a hora local na zona especificada pelo parmetro de configurao timezone antes de serem mostradas ao cliente. O parmetro de configurao timezone pode ser definido no arquivo postgresql.conf. Existem, tambm, vrias outras formas especiais de defini-lo:

Se timezone no for especificada no arquivo de configurao postgresql.conf, nem como uma chave da linha de comando do postmaster, o servidor tenta utilizar o valor da varivel de ambiente TZ como a zona horria padro. Se TZ no estiver definida, ou no contiver nenhum nome de zona horria conhecido pelo PostgreSQL, o servidor tenta determinar a zona horria padro do sistema operacional verificando o comportamento da funo localtime() da biblioteca C. A zona horria padro selecionada atravs da correspondncia mais prximas entre as zonas horrias conhecidas pelo PostgreSQL. O comando SQL SET TIME ZONE define a zona horria para a sesso. Esta uma forma alternativa de SET TIMEZONE TO com uma sintaxe mais compatvel com a especificao SQL. Se a varivel de ambiente PGTZ estiver definida no cliente, utilizada pelos aplicativos libpq para enviar o comando SET TIME ZONE para o servidor durante a conexo.

3.4. Tipo Booleano; O PostgreSQL disponibiliza o tipo SQL padro boolean. O tipo boolean pode possuir apenas um dos dois estados: "verdade" ou "falso". O terceiro estado, "desconhecido", representado pelo valor nulo do SQL. Valores literais vlidos Para o estado Verdade TRUE 't' 'true' Para o estado Falso FALSE 'f' 'false'

26
Curso de PostgreSQL 2010

'y' 'yes' '1'

'n' 'no' '0'

A utilizao das palavras chave TRUE e FALSE preferida (e em conformidade com o padro SQL). Utilizao do tipo boolean

CREATE TABLE teste1 (a BOOLEAN, b text); INSERT INTO teste1 VALUES (TRUE, 'sim'); INSERT INTO teste1 VALUES (FALSE, 'nao'); SELECT * FROM teste1; a| b ---+--------t | sim f | nao SELECT * FROM teste1 WHERE a; a| b ---+--------t | sim

O Exemplo mostra que os valores do tipo BOOLEAN so exibidos utilizando as letras t e f. Dica: Os valores do tipo BOOLEAN no podem ser convertidos diretamente em outros tipos (por exemplo, CAST (valor_BOOLEANO AS INTEGER) no funciona). A converso pode ser feita utilizando a expresso CASE: CASE WHEN valor_BOOLEANO THEN 'valor se for verdade' ELSE 'valor se for falso' END . O tipo BOOLEAN utiliza 1 byte para seu armazenamento.

3.5. Tipo para Endereo de Rede; O PostgreSQL disponibiliza tipos de dado para armazenar endereos IPv4, IPv6 e MAC. prefervel utilizar estes tipos em vez dos tipos de texto puro, porque estes tipos possuem verificao de erro na entrada, alm de vrios operadores e funes especializadas (para mais informaes consulte a pg. 189 da documentao) Tipos para endereo de rede Nome CIDR INET MACADDR Tamanho de Armazenamento 12 ou 24 bytes 12 ou 24 bytes 6 bytes Descrio redes IPv4 e IPv6 hospedeiros e redes IPv4 e IPv6 endereo MAC

27
Curso de PostgreSQL 2010

Ao ordenar os tipos de dado INET e CIDR, os endereos IPv4 vm sempre na frente dos endereos IPv6, inclusive os endereos IPv4 encapsulados ou mapeados em endereos IPv6, tais como ::10.2.3.4 ou ::ffff::10.4.3.2. INET O tipo de dado INET armazena um endereo de hospedeiro IPv4 ou IPv6 e, opcionalmente, a identificao da sub-rede onde se encontra, tudo em um nico campo. A identificao da sub-rede representada declarando quantos bits do endereo do hospedeiro representam o endereo de rede (a "mscara de rede"). Se a mscara de rede for 32 e o endereo for IPv4, ento o valor no indica uma sub-rede, e sim um nico hospedeiro. No IPv6 o comprimento do endereo de 128 bits e, portanto, 128 bits especificam o endereo de um nico hospedeiro. Deve ser observado que se for desejado aceitar apenas endereos de rede, deve ser utilizado o tipo CIDR em vez do tipo INET. O formato de entrada para este tipo endereo/y, onde endereo um endereo IPv4 ou IPv6, e y o nmero de bits da mscara de rede. Se a parte /y for deixada de fora, ento a mscara de rede ser 32 para IPv4 e 128 para IPv6, e o valor representa um nico hospedeiro apenas. Ao ser mostrado, a poro /y suprimida se a mscara de rede especificar apenas um nico hospedeiro. CIDR O tipo CIDR armazena uma especificao de rede IPv4 ou IPv6 sem a especificao da mscara. Exemplos de entrada para o tipo CIDR. Entrada CIDR 192.168.100.128/25 192.168/24 192.168/25 192.168.1 192.168 128.1 128 128.1.2 10.1.2 10.1 10 10.1.2.3/32 2001:4f8:3:ba::/64 2001:4f8:3:ba:2e0:81ff:fe22: d1f1/128 ::ffff:1.2.3.0/120 ::ffff:1.2.3.0/128 Sada CIDR 192.168.100.128/25 192.168.0.0/24 192.168.0.0/25 192.168.1.0/24 192.168.0.0/24 128.1.0.0/16 128.0.0.0/16 128.1.2.0/24 10.1.2.0/24 10.1.0.0/16 10.0.0.0/8 10.1.2.3/32 2001:4f8:3:ba::/64 2001:4f8:3:ba:2e0:81ff:fe22: d1f1/128 ::ffff:1.2.3.0/120 ::ffff:1.2.3.0/128

abbrev(CIDR)
192.168.100.128/25 192.168.0/24 192.168.0.0/25 192.168.1/24 192.168.0/24 128.1/16 128.0/16 128.1.2/24 10.1.2/24 10.1/16 10/8 10.1.2.3/32 2001:4f8:3:ba::/64 2001:4f8:3:ba:2e0:81ff:f e22:d1f1 ::ffff:1.2.3/120 ::ffff:1.2.3.0/128

INET versus CIDR

28
Curso de PostgreSQL 2010

A diferena essencial entre os tipos de dado inet e cidr que inet aceita valores com bits diferente de zero direita da mscara de rede, enquanto cidr no aceita. Dica: Caso no se goste do formato de sada para os valores de INET ou CIDR, deve-se tentar utilizar as funes host(), text() e abbrev(). MACADDR

O tipo MACADDR armazena endereos de MAC, ou seja, endereos de hardware da placa Ethernet (embora os endereos de MAC sejam utilizados para outras finalidades tambm). A entrada aceita em vrios formatos habituais incluindo '08002b:010203' '08002b-010203' '0800.2b01.0203' '08-00-2b-01-02-03' '08:00:2b:01:02:03' sendo que todos especificam o mesmo endereo. Letras maisculas e minsculas so aceitas para os dgitos de a f. A sada sempre na ltima forma mostrada. Na distribuio do cdigo fonte do PostgreSQL, o diretrio contrib/mac contm ferramentas que podem ser utilizadas para fazer a correspondncia entre endereos de MAC e nomes de fabricantes de hardware. 3.6. Tipos Adicionais. Tipos Geomtricos; Tipos Compostos; Matrizes;
Tipos para cadeias de bits.

29
Curso de PostgreSQL 2010

4. Instalao do Banco de Dados 4.1. Instalao no ambiente Windows;

Clique em Prximo prosseguir a instalao.

Outra vez clique em Prximo para prosseguir.

30
Curso de PostgreSQL 2010

Clique com o boto esquerdo do mouse sobre o primeiro item PostgreSQL e marque a opo Todo o recurso ser instalado no disco rgido. E clique em Prximo para prosseguir.

31
Curso de PostgreSQL 2010

Senha postgres

Coloque a senha postgres, e clique a Prximo para prosseguir.

Ele pergunta se deseja criar o usurio postgres, voc confirma, pois por este usurio que so realizadas as transaes no banco de dados.

32
Curso de PostgreSQL 2010

Em seguida ele perguntar se deseja que o sistema gera uma senha mais difcil, marque que no.

Marque a opo Aceitar conexes em todos os endereos, e no apenas localhost. E coloque a senha postgres, est senha a de super usurio do banco de dados.

Clique em OK para continuar a instalao.

33
Curso de PostgreSQL 2010

Marque a opo Pl/pgsql, e clique em Prximo para continuar a instalao.

Marque a opo e Funes Criptografia, e clique em Prximo para prosseguir a instalao.

E por ltimo clique em Prximo para comear a instalao. E pronto. 34


Curso de PostgreSQL 2010

4.2. Instalao no ambiente Linux.


Instalao do PostgreSQL 8.4 no Ubuntu 9.04 1. Abra o terminal de comandos do linux; 2. digite no terminal:$ sudo su (coloque senha)

3. Depois execute um comando ./nome_progama.bin. Por exemplo: root@gabriel-desktop:/home/gabriel# ./postgresql-8.4.0-1b2-linux.bin Em seguida ir aparecer a tela de instalao do PostgreSQL.

Clique em avanar e prossiga a instalao do PostgreSQL.

35
Curso de PostgreSQL 2010

Informe o diretrio de instalao do banco, por padro de instalao no /opt/PostgreSQL/8.4/, nada impede de voc mudar para um diretria de sua melhor preferncia.

Depois informe o diretrio de dados, lembrando que neste diretrio ser armazenado os dados das tabelas e os principais arquivos de configurao do PostgreSQL.

Informe a senha do super-usurio do banco de dados.

36
Curso de PostgreSQL 2010

Informe a porta de conexo com o banco de dados. A porta padro a 5432.

37
Curso de PostgreSQL 2010

Selecione a coleo de dados do sistema, igualmente o que est na imagem logo acima.

Clique em avanar para iniciar a instalao do PostgreSQL.

38
Curso de PostgreSQL 2010

Aps concluir esta etapa o banco de dados estar instalado com sucesso.

39
Curso de PostgreSQL 2010

5. DDL (Linguagem de Definio de Dados) - Comandos de Criao, Alterao e Excluso de banco dados, de tabelas, de restries, de unicidades, de ndices, de chaves estrangeiras; CREATE DATABASE: cria um banco de dados Sinopse CREATE DATABASE nome [ [ WITH ] [ OWNER [=] dono_do_banco_de_dados ] [ TEMPLATE [=] modelo ] [ ENCODING [=] codificao ] [ TABLESPACE [=] espao_de_tabelas ] ] Descrio O comando CREATE DATABASE cria um banco de dados no PostgreSQL. Para poder criar um banco de dados necessrio ser um superusurio ou possuir o privilgio especial CREATEDB. Consulte o comando CREATE USER. Normalmente, o criador se torna o dono do novo banco de dados. Os superusurios podem criar bancos de dados cujos donos so outros usurios utilizando a clusula OWNER e, at mesmo, criar bancos de dados cujos donos so usurios sem nenhum privilgio especial. Usurios comuns com privilgio CREATEDB podem criar apenas bancos de dados cujos donos so eles mesmos. Por padro, o novo banco de dados criado clonando o de banco de dados comum do sistema template1. Um modelo diferente pode ser especificado escrevendo TEMPLATE modelo. Em particular, escrevendo TEMPLATE template0 pode ser criado um banco de dados bsico contendo apenas os objetos comuns pr-definidos pela verso do PostgreSQL em uso. Esta forma til quando se deseja evitar a cpia de qualquer objeto da instalao local que possa ter sido adicionado ao template1. Explicao dos Parmetros nome O nome do banco de dados a ser criado. dono_do_banco_de_dados O nome do usurio do banco de dados que ser o dono do novo banco de dados, ou DEFAULT para usar o padro (ou seja, o usurio que est executando o comando). modelo Nome do modelo a partir do qual o novo banco de dados ser criado, ou DEFAULT para utilizar o modelo padro (template1). codificao Codificao do conjunto de caracteres a ser utilizado no novo banco de dados. Deve ser especificada uma constante cadeia de caracteres (por exemplo, 'SQL_ASCII'), ou o nmero inteiro da codificao, ou DEFAULT para utilizar a codificao padro. Os conjuntos de caracteres suportados pelo PostgreSQL sero descritos logo a frente. espao_de_tabelas

40
Curso de PostgreSQL 2010

O nome do espao de tabelas associado ao novo banco de dados, ou DEFAULT para utilizar o espao de tabelas do banco de dados modelo. Este espao de tabelas o espao de tabelas padro para os objetos criados neste banco de dados. Consulte o comando CREATE TABLESPACE para obter informaes adicionais. Os parmetros opcionais podem ser escritos em qualquer ordem, e no apenas na ordem mostrada acima. Observaes O comando CREATE DATABASE no pode ser executado dentro de um bloco de transao. Erros contendo could not initialize database directory (no foi possvel inicializar o diretrio do banco de dados) esto normalmente relacionados com a falta de permisso no diretrio de dados, disco cheio, ou outros problemas no sistema de arquivos. Deve ser utilizado DROP DATABASE para remover o banco de dados. O aplicativo createdb, fornecido por convenincia, um programa em torno deste comando. Embora seja possvel copiar outro banco de dados em vez do template1 especificando seu nome como modelo, no se pretende (ainda) que esta seja uma funcionalidade de COPY DATABASE de uso geral. Recomenda-se que os bancos de dados utilizados como modelo sejam tratados como se fossem somente para leitura. Exemplos Para criar um banco de dados: => CREATE DATABASE lusiadas; Para criar o banco de dados vendas pertencendo ao usurio usuvendas com o espao de tabelas padro espvendas: =>CREATE DATABASE vendas OWNER usuvendas TABLESPACE espvendas; Para criar o banco de dados musica com suporte a conjunto de caracteres ISO-8859-1: => CREATE DATABASE musica ENCODING 'LATIN1' TEMPLATE template0; Compatibilidade No existe o comando CREATE DATABASE no padro SQL. Os bancos de dados so equivalentes aos catlogos, cuja criao definida pela implementao.

ALTER DATABASE: altera um banco de dados Sinopse ALTER DATABASE nome SET parmetro { TO | = } { valor | DEFAULT } ALTER DATABASE nome RESET parmetro ALTER DATABASE nome RENAME TO novo_nome ALTER DATABASE nome OWNER TO novo_dono Descrio O comando ALTER DATABASE altera os atributos de um banco de dados. As duas primeiras formas mudam, para um banco de dados do PostgreSQL, o valor padro para a sesso de uma varivel de configurao em tempo de execuo. Depois, sempre que uma nova sesso for iniciada neste banco de dados, o valor

41
Curso de PostgreSQL 2010

especificado se torna o valor padro para a sesso. O padro especfico para o banco de dados substitui qualquer definio presente no arquivo postgresql.conf, ou que tenha sido recebida a partir da linha de comando do postmaster. Somente o dono do banco de dados ou um superusurio podem mudar os padres para a sesso de um banco de dados. Certas variveis no podem ser definidas desta maneira, ou somente podem ser definidas por um superusurio. A terceira forma muda o nome do banco de dados. Somente o dono do banco de dados ou um superusurio podem mudar o nome do banco de dados; os donos que no so superusurios devem possuir, tambm, o privilgio CREATEDB. O banco de dados corrente no pode ter seu nome mudado (Deve-se conectar a um banco de dados diferente se for necessrio realizar esta operao). A quarta forma muda o dono do banco de dados. Somente um superusurio pode mudar o dono do banco de dados. Parmetros

Nome
O nome do banco de dados cujos atributos esto sendo alterados.

parmetro valor
Define o padro de sesso deste banco de dados, para o parmetro de configurao especificado, como o valor fornecido. Se valor for DEFAULT ou, de forma equivalente, se RESET for utilizado, a definio especfica para o banco de dados removida, e a definio padro global do sistema passa a ser herdada nas novas sesses. Deve ser utilizado RESET ALL para remover todas as definies especficas do banco de dados.

novo_nome
O novo nome do banco de dados.

novo_dono
O novo dono do banco de dados. Exemplos Para renomear um banco de dados:

ALTER DATABASE dbprod RENAME TO dbproducao; Compatibilidade O comando ALTER DATABASE uma extenso do PostgreSQL. DROP DATABASE: remove um banco de dados Sinopse DROP DATABASE nome Descrio

42
Curso de PostgreSQL 2010

O comando DROP DATABASE remove um banco de dados. Remove as entradas no catlogo para o banco de dados e remove o diretrio contendo os dados. Pode ser executado apenas pelo dono do banco de dados. Tambm, no pode ser executado se voc ou alguma outra pessoa estiver conectado ao banco de dados a ser removido; se conecte ao template1 ou a qualquer outro banco de dados para executar este comando. O comando DROP DATABASE no pode ser desfeito. Utilize com cuidado! Parmetros nome O nome do banco de dados a ser removido. Observaes O comando DROP DATABASE no pode ser executado dentro de um bloco de transao. Este comando no pode ser executado enquanto conectado ao banco de dados de destino. Portanto, mais conveniente utilizar o aplicativo dropdb, que um script englobando este comando. Compatibilidade No existe o comando DROP DATABASE no padro SQL. CREATE SCHEMA: cria um esquema Sinopse CREATE SCHEMA nome_do_esquema [ AUTHORIZATION nome_do_usurio ] [ elemento_do_esquema [ ... ] ] CREATE SCHEMA AUTHORIZATION nome_do_usurio [ elemento_do_esquema [ ... ] ] Descrio O comando CREATE SCHEMA cria um esquema no banco de dados corrente. O nome do esquema deve ser distinto do nome de todos os outros esquemas existentes no banco de dados corrente. Um esquema essencialmente um espao de nomes: contm objetos com nome (tabelas, tipos de dado, funes e operadores), cujos nomes podem ser iguais aos de outros objetos existentes em outros esquemas. Os objetos com nome so acessados "qualificando" seus nomes usando o nome do esquema como prefixo, ou definindo um caminho de procura que inclua os esquemas desejados. O comando CREATE que especifica um nome de objeto no qualificado cria o objeto no esquema corrente (o primeiro do caminho de procura, que pode ser determinado pela funo current_schema). Opcionalmente, o comando CREATE SCHEMA pode incluir subcomandos para criar objetos no novo esquema. Estes subcomandos so tratados, essencialmente, da mesma maneira como so tratados os comandos em separado submetidos aps a criao do esquema, exceto que, se for utilizada a clusula AUTHORIZATION, todos os objetos criados pertencero a este usurio. Parmetros

nome_do_esquema
O nome do esquema a ser criado. Se for omitido, ser usado o nome do usurio como nome do esquema. O nome no pode comear por pg_, porque estes nomes so reservados para os esquemas do sistema.

nome_do_usurio 43
Curso de PostgreSQL 2010

O nome do usurio que ser o dono do esquema. Se for omitido, tem como padro o usurio que est executando o comando. Somente os superusurios podem criar esquemas pertencentes a outros usurios.

elemento_do_esquema
Um comando SQL definindo um objeto a ser criado no esquema. Atualmente, somente CREATE TABLE, CREATE VIEW, CREATE INDEX, CREATE SEQUENCE, CREATE TRIGGER e GRANT so aceitos como clusula no comando CREATE SCHEMA. Os objetos de outros tipos podem ser criados por comandos em separado, aps o esquema ter sido criado. Observaes Para criar um esquema o usurio deve possuir o privilgio CREATE no banco de dados corrente ( claro que os superusurios no so afetados por esta exigncia). Exemplos Criar um esquema:

CREATE SCHEMA meu_esquema;

Criar um esquema para o usurio antonio; o esquema tambm se chamar antonio:

CREATE SCHEMA AUTHORIZATION antonio;

Criar um esquema e criar uma tabela e uma viso nele:

CREATE SCHEMA hollywood CREATE TABLE filmes (titulo text, lancamento date, premios text[]) CREATE VIEW premiados AS SELECT titulo, lancamento FROM filmes WHERE premios IS NOT NULL;

Deve ser observado que os subcomandos individuais no terminam por ponto-e-vrgula. Abaixo est mostrada uma forma equivalente para se obter o mesmo resultado:

CREATE SCHEMA hollywood; CREATE TABLE hollywood.filmes (titulo text, lancamento date, premios text[]); CREATE VIEW hollywood.premiados AS SELECT titulo, lancamento FROM hollywood.filmes WHERE premios IS NOT NULL; Compatibilidade

44
Curso de PostgreSQL 2010

O padro SQL permite a clusula DEFAULT CHARACTER SET no comando CREATE SCHEMA, bem como mais tipos de subcomandos que os aceitos atualmente pelo PostgreSQL. O padro SQL especifica que os subcomandos presentes em CREATE SCHEMA podem estar em qualquer ordem. A implementao atual do PostgreSQL no trata todos os casos de referncia frente nos subcomandos; alguma vezes pode ser necessrio reordenar os subcomandos para evitar referncias frente. De acordo com o padro SQL, o dono do esquema sempre possui todos os objetos que este contm. O PostgreSQL permite que os esquemas contenham objetos pertencentes a outros usurios. Isto s acontece quando o dono do esquema concede o privilgio CREATE em seu esquema para algum outro usurio.

ALTER SCHEMA: altera a definio de um esquema Sinopse ALTER SCHEMA nome RENAME TO novo_nome ALTER SCHEMA nome OWNER TO novo_dono Descrio O comando ALTER SCHEMA altera a definio de um esquema. Para mudar o nome do esquema necessrio ser o dono do esquema e possuir o privilgio CREATE para o banco de dados. Para mudar o dono do esquema necessrio ser um superusurio. Parmetros nome O nome de um esquema existente. novo_nome O novo nome do esquema. O novo nome no pode comear por pg_, porque estes nomes so reservados para os esquemas do sistema. novo_dono O novo dono do esquema. Compatibilidade No existe o comando ALTER SCHEMA no padro SQL.

DROP SCHEMA: remove um esquema Sinopse DROP SCHEMA nome [, ...] [ CASCADE | RESTRICT ] Descrio O comando DROP SCHEMA remove esquemas do banco de dados.

45
Curso de PostgreSQL 2010

O esquema somente pode ser removido pelo seu dono ou por um superusurio. Deve ser observado que o dono pode remover o esquema (e, portanto, todos os objetos que este contm), mesmo que no seja o dono de alguns objetos contidos no esquema. Parmetros nome O nome do esquema. CASCADE Remove automaticamente os objetos (tabelas, funes, etc.) contidos no esquema. RESTRICT Recusa remover o esquema caso este contenha algum objeto. Este o padro.

Exemplos Para remover do banco de dados o esquema meu_esquema junto com todos os objetos que este contm:

DROP SCHEMA meu_esquema CASCADE; Compatibilidade O comando DROP SCHEMA est em conformidade total com o padro SQL, exceto pelo padro permitir remover apenas um esquema por comando. CREATE TABLE: cria uma tabela Sinopse CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE nome_da_tabela ( { nome_da_coluna tipo_de_dado [ DEFAULT expresso_padro ] [ restrio_de_coluna [ ... ] ] | restrio_de_tabela | LIKE tabela_ancestral [ { INCLUDING | EXCLUDING } DEFAULTS ] } [, ... ] ) [ INHERITS ( tabela_ancestral [, ... ] ) ] [ WITH OIDS | WITHOUT OIDS ] [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ] [ TABLESPACE espao_de_tabelas ] onde restrio_de_coluna : [ CONSTRAINT nome_da_restrio ] { NOT NULL | NULL | UNIQUE [ USING INDEX TABLESPACE espao_de_tabelas ] | PRIMARY KEY [ USING INDEX TABLESPACE espao_de_tabelas ] | CHECK (expresso) | REFERENCES tabela_referenciada [ ( coluna_referenciada ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE ao ] [ ON UPDATE ao ] }

46
Curso de PostgreSQL 2010

[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] e restrio_de_tabela : [ CONSTRAINT nome_da_restrio ] { UNIQUE ( nome_da_coluna [, ... ] ) [ USING INDEX TABLESPACE espao_de_tabelas ] | PRIMARY KEY ( nome_da_coluna [, ... ] ) [ USING INDEX TABLESPACE espao_de_tabelas ] | CHECK ( expresso ) | FOREIGN KEY ( nome_da_coluna [, ... ] ) REFERENCES tabela_referenciada [ ( coluna_referenciada [, ... ] ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE ao ] [ ON UPDATE ao ] } [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] Descrio O comando CREATE TABLE cria uma tabela, inicialmente vazia, no banco de dados corrente. O usurio que executa o comando se torna o dono da tabela. Se for fornecido o nome do esquema (por exemplo, CREATE TABLE meu_esquema.minha_tabela ...) ento a tabela ser criada no esquema especificado, seno ser criada no esquema corrente. As tabelas temporrias so criadas em um esquema especial e, portanto, no pode ser fornecido o nome do esquema ao se criar tabelas temporrias. O nome da tabela deve ser distinto do nome de qualquer outra tabela, seqncia, ndice ou viso no mesmo esquema. As clusulas opcionais de restrio especificam as restries (testes) que as linhas novas ou modificadas devem satisfazer para a operao de insero ou de modificao ser bem-sucedida. Uma restrio um objeto SQL que ajuda a definir o conjunto de valores vlidos para a tabela de vrias maneiras. Existem duas formas para definir restries: restries de tabela e restries de coluna. A restrio de coluna definida como parte da definio da coluna. A definio da restrio de tabela no vinculada a uma determinada coluna, e pode conter mais de uma coluna. Toda restrio de coluna tambm pode ser escrita como restrio de tabela; a restrio de coluna somente uma notao conveniente para ser usada quando a restrio afeta apenas uma coluna. [3] Parmetros

TEMPORARY ou TEMP
Se for especificado, a tabela ser criada como sendo uma tabela temporria. As tabelas temporrias so automaticamente removidas no final da sesso ou, opcionalmente, no final da transao corrente (consulte ON COMMIT abaixo). As tabelas permanentes existentes no estaro visveis na sesso corrente enquanto existirem tabelas temporrias com o mesmo nome, a no ser que sejam referenciadas por um nome qualificado pelo esquema. Todo ndice criado em tabela temporria tambm temporrio. Opcionalmente, pode ser escrito GLOBAL ou LOCAL antes de TEMPORARY ou de TEMP. Isto no faz qualquer diferena no PostgreSQL, mas consulte Compatibilidade.

nome_da_tabela
O nome (opcionalmente qualificado pelo esquema) da tabela a ser criada.

nome_da_coluna
O nome da coluna a ser criada na nova tabela.

tipo_de_dado 47
Curso de PostgreSQL 2010

O tipo de dado da coluna. Pode incluir especificadores de matriz (array). Para obter informaes adicionais sobre os tipos de dado suportados pelo PostgreSQL deve ser consultado o captulo dos tipos de dados.

DEFAULT expresso_padro
A clusula DEFAULT atribui um valor de dado padro para a coluna em cuja definio est presente. O valor pode ser qualquer expresso sem varivel (variable-free) (subconsultas e referncias cruzadas a outras colunas da tabela corrente no so permitidas). O tipo de dado da expresso padro deve corresponder ao tipo de dado da coluna. A expresso padro utilizada em todas as operaes de insero que no especificam o valor para a coluna. Se no houver valor padro para a coluna, ento o valor padro ser o valor nulo.

CONSTRAINT nome_da_restrio
Um nome opcional para a restrio de coluna ou de tabela. Se no for especificado, o nome ser gerado pelo sistema.

NOT NULL
A coluna no pode conter valores nulos.

NULL
A coluna pode conter valores nulos. Este o padro. Esta clusula s est disponvel para manter a compatibilidade com bancos de dados SQL fora do padro. Sua utilizao nos novos aplicativos desencorajada.

UNIQUE (restrio de coluna) UNIQUE ( nome_da_coluna [, ... ] ) (restrio de tabela)


A restrio UNIQUE especifica que um grupo de uma ou mais colunas da tabela pode conter apenas valores nicos. O comportamento da restrio de unicidade de tabela o mesmo da restrio de unicidade de coluna, mas com a capacidade adicional de conter vrias colunas. Para a finalidade de restrio de unicidade, os valores nulos no so considerados iguais. Cada restrio de unicidade de tabela deve especificar um conjunto de colunas diferente do conjunto de colunas especificado por qualquer outra restrio de unicidade e de chave primria definida para a tabela (Seno, seria apenas a mesma restrio declarada duas vezes).

PRIMARY KEY (restrio de coluna) PRIMARY KEY ( nome_da_coluna [, ... ] ) (restrio de tabela)
A restrio de chave primria especifica que a coluna, ou colunas, da tabela podem conter apenas valores nicos (no duplicados) e no nulos. Tecnicamente a chave primria (PRIMARY KEY) simplesmente uma combinao de unicidade (UNIQUE) com no nulo (NOT NULL), mas identificar um conjunto de colunas como chave primria tambm fornece metadados sobre o projeto do esquema, porque as chaves primrias implicam em que outras tabelas podem depender deste conjunto de colunas como identificador nico para linhas.

48
Curso de PostgreSQL 2010

Somente pode ser especificada uma chave primria para cada tabela, seja como restrio de coluna ou como restrio de tabela. A restrio de chave primria deve especificar um conjunto de colunas diferente dos conjuntos de colunas especificados pelas restries de unicidade definidos para a mesma tabela.

CHECK (expresso)
A clusula CHECK especifica uma expresso, que produz um resultado booleano, que as linhas novas ou atualizadas devem satisfazer para a operao de insero ou de atualizao ser bem-sucedida. As expresses avaliadas como TRUE ou UNKNOWN so bem-sucedidas. Se alguma linha de uma operao de insero ou de atualizao produzir um resultado FALSE ser lanada uma exceo de erro, e a insero ou atualizao no ir alterar o banco de dados. Uma restrio de verificao especificada como uma restrio de coluna deve fazer referncia somente ao valor desta coluna, enquanto uma expresso que aparece como uma restrio de tabela pode fazer referncia a vrias colunas. Atualmente as expresses CHECK no podem conter subconsultas, nem fazer referncia a variveis que no sejam colunas da linha corrente.

REFERENCES tabela_referenciada [ ( coluna_referenciada ) ] [ MATCH tipo_de_correspondncia ] [ ON DELETE ao ] [ ON UPDATE ao ]


(restrio de coluna) FOREIGN KEY ( coluna [, ... ] ) REFERENCES tabela_referenciada [ ( coluna_referenciada [, ... ] ) ]

[ MATCH tipo_de_correspondncia ] [ ON DELETE ao ] [ ON UPDATE ao ] (restrio de tabela)


Estas clusulas especificam uma restrio de chave estrangeira, a qual requer que um grupo de uma ou mais colunas da nova tabela somente possa conter valores que correspondem a valores nas colunas referenciadas de alguma linha da tabela referenciada. Se a coluna_referenciada for omitida, ser utilizada a chave primria da tabela_referenciada. As colunas referenciadas devem ser colunas de uma restrio de unicidade ou de chave primria na tabela referenciada. Os valores inseridos nas colunas que fazem referncia so comparados com os valores das colunas referenciadas da tabela referenciada utilizando o tipo de comparao especificado. Existem trs tipos de comparao: MATCH FULL, MATCH PARTIAL e MATCH SIMPLE, que tambm o padro. MATCH FULL no permite uma coluna de uma chave estrangeira com vrias colunas ser nula, a menos que todas as colunas da chave estrangeira sejam nulas. MATCH SIMPLE permite que algumas colunas da chave estrangeira sejam nulas, enquanto outras colunas da chave estrangeira no so nulas. MATCH PARTIAL ainda no est implementado. Alm disso, quando os dados das colunas referenciadas so modificados so realizadas certas aes nos dados das colunas desta tabela. A clusula ON DELETE especifica a ao a ser realizada quando uma linha referenciada da tabela referenciada excluda. Da mesma forma, a clusula ON UPDATE especifica a ao a ser realizada quando uma coluna referenciada da tabela referenciada atualizada para um novo valor. Se a linha for atualizada, mas a coluna referenciada no mudar de valor, nenhuma ao executada. As aes referenciais fora NO ACTION no podem ser postergadas, mesmo que a restrio seja declarada como postergvel ( deferrable). Existem as seguintes aes possveis para cada clusula:

NO ACTION
Produz um erro indicando que a excluso ou a atualizao cria uma violao da restrio de chave estrangeira. Se a restrio for postergada, este erro ser produzido em tempo de verificao de restrio se ainda houver alguma linha fazendo referncia. Esta a ao padro.

49
Curso de PostgreSQL 2010

RESTRICT
Produz um erro indicando que a excluso ou a atualizao cria uma violao da restrio de chave estrangeira. o mesmo que NO ACTION, exceto que a verificao no postergvel.

CASCADE
Exclui qualquer linha que faa referncia linha excluda, ou atualiza o valor da coluna que faz referncia para o novo valor da coluna referenciada, respectivamente.

SET NULL
Atribui o valor nulo s colunas que fazem referncia.

SET DEFAULT
Atribui o valor padro s colunas que fazem referncia. Se as colunas referenciadas forem modificadas com freqncia, aconselhvel adicionar um ndice coluna da chave estrangeira para que as aes referenciais associadas coluna da chave estrangeira possam ser realizadas com mais eficincia.

ON COMMIT
O comportamento das tabelas temporrias ao trmino do bloco de transao pode ser controlado utilizando ON COMMIT. As trs opes so:

PRESERVE ROWS
No realizada nenhuma ao especial ao trmino da transao. Este o comportamento padro.

DELETE ROWS
Todas as linhas da tabela temporria so excludas ao trmino de cada bloco de transao. Essencialmente, feito um TRUNCATE automtico aps cada efetivao.

DROP
A tabela temporria removida ao trmino do bloco de transao corrente.

TABLESPACE espao_de_tabelas
O espao_de_tabelas o nome do espao de tabelas onde a nova tabela ser criada. Se no for especificado ser utilizado o default_tablespace, ou o espao de tabelas padro do banco de dados se default_tablespace for uma cadeia de caracteres vazia.

USING INDEX TABLESPACE espao_de_tabelas

50
Curso de PostgreSQL 2010

Esta clusula permite selecionar o espao de tabelas onde o ndice associado restrio UNIQUE ou PRIMARY KEY ser criado. Se no for especificado ser utilizado o default_tablespace, ou o espao de tabelas padro do banco de dados se default_tablespace for uma cadeia de caracteres vazia. Observaes O PostgreSQL cria, automaticamente, um ndice para cada restrio de unicidade e de chave primria para impor a unicidade. Portanto, no necessrio criar explicitamente um ndice para as colunas da chave primria (Para obter mais informaes deve ser consultado o comando CREATE INDEX). Uma tabela no pode ter mais de 1600 colunas (Na prtica o limite efetivo menor, por causa da restrio do comprimento das tuplas). Exemplos Criar a tabela filmes e a tabela distribuidores:

CREATE TABLE filmes ( cod_filme CHAR(5) CONSTRAINT pk_filmes PRIMARY KEY, titulo VARCHAR(40) NOT NULL, id_dist INTEGER NOT NULL, data_prod DATE, tipo VARCHAR(10), duracao INTERVAL HOUR TO MINUTE ); CREATE TABLE distribuidores ( id_dist INTEGER PRIMARY KEY DEFAULT NEXTVAL('serial'), nome VARCHAR(40) NOT NULL CHECK (nome <> '') );

Definir uma restrio de unicidade para a tabela filmes, usando a sintaxe de restrio de tabela. As restries de unicidade com sintaxe de restrio de tabela podem ser definidas contendo uma ou mais colunas da tabela.

CREATE TABLE filmes ( cod_filme CHAR(5), titulo VARCHAR(40), id_dist INTEGER, data_prod DATE, tipo VARCHAR(10), duracao INTERVAL HOUR TO MINUTE, CONSTRAINT unq_data_prod UNIQUE(data_prod) );

Definir uma restrio de verificao, usando a sintaxe de restrio de coluna:

CREATE TABLE distribuidores ( id_dist INTEGER CHECK (id_dist > 100),

51
Curso de PostgreSQL 2010

nome );

VARCHAR(40)

Definir uma restrio de verificao, usando a sintaxe de restrio de tabela:

CREATE TABLE distribuidores ( id_dist integer, nome varchar(40) CONSTRAINT chk_dist CHECK (id_dist > 100 AND nome <> '') );

Definir uma restrio de chave primria para a tabela filmes, usando a sintaxe de restrio de tabela, As restries de chave primria com sintaxe de restrio de tabela podem ser definidas usando uma ou mais colunas da tabela.

CREATE TABLE filmes ( cod_filme CHAR(5), titulo VARCHAR(40), id_dist INTEGER, data_prod DATE, tipo VARCHAR(10), duracao INTERVAL HOUR TO MINUTE, CONSTRAINT pk_filmes PRIMARY KEY(cod_filme,titulo) );

Definir a restrio de chave primria para a tabela distribuidores. Os dois exemplos abaixo so equivalentes, o primeiro utiliza a sintaxe de restrio de tabela, e o segundo utiliza a sintaxe de restrio de coluna.

CREATE TABLE distribuidores ( id_dist INTEGER, nome VARCHAR(40), PRIMARY KEY(id_dist) ); CREATE TABLE distribuidores ( id_dist INTEGER PRIMARY KEY, nome VARCHAR(40) );

O comando abaixo especifica uma constante literal como o valor padro para a coluna nome, faz o valor padro da coluna id_dist ser gerado pela seleo do prximo valor de um objeto de seqncia, e faz o valor padro da coluna data_mod ser o momento em que a linha foi inserida.

CREATE TABLE distribuidores ( nome VARCHAR(40) DEFAULT 'Luso Filmes',

52
Curso de PostgreSQL 2010

id_dist INTEGER DEFAULT nextval('seq_distribuidores'), data_mod TIMESTAMP DEFAULT CURRENT_TIMESTAMP );

Definir duas restries de coluna NOT NULL na tabela distribuidores, sendo que uma das restries recebe um nome fornecido explicitamente:

CREATE TABLE distribuidores ( id_dist INTEGER CONSTRAINT nao_nulo NOT NULL, nome VARCHAR(40) NOT NULL );

Definir uma restrio de unicidade para a coluna nome:

CREATE TABLE distribuidores ( id_dist INTEGER, nome VARCHAR(40) UNIQUE );

Mesma coisa, especificado como uma restrio de tabela:

CREATE TABLE distribuidores ( id_dist INTEGER, nome VARCHAR(40), UNIQUE(nome) );

Criar a tabela cinemas no espao de tabelas diskvol1:

CREATE TABLE cinemas ( id SERIAL, nome TEXT, local TEXT ) TABLESPACE diskvol1; Compatibilidade O comando CREATE TABLE est em conformidade com o SQL-92 e com um subconjunto do SQL:1999, com as excees listadas abaixo.

53
Curso de PostgreSQL 2010

Tabelas temporrias Embora a sintaxe de CREATE TEMPORARY TABLE se parea com a do padro SQL, o efeito no o mesmo. No padro as tabelas temporrias so definidas apenas uma vez, passando a existir automaticamente (comeando com um contedo vazio) para todas as sesses que necessitarem destas. Em vez disso, o PostgreSQL requer que cada sesso execute seu prprio comando CREATE TEMPORARY TABLE para cada tabela temporria a ser utilizada, permitindo que sesses diferentes usem o mesmo nome de tabela temporria para finalidades diferentes, enquanto a abordagem do padro obriga todas as instncias de um determinado nome de tabela temporria ter a mesma estrutura de tabela. A definio do padro para o comportamento de tabelas temporrias amplamente ignorado. O comportamento do PostgreSQL neste ponto semelhante ao de vrios outros bancos de dados SQL. A distino feita pelo padro entre tabelas temporrias globais e locais no est presente no PostgreSQL, uma vez que esta distino depende do conceito de mdulos, que o PostgreSQL no possui. Por motivo de compatibilidade, o PostgreSQL aceita as palavras chave GLOBAL e LOCAL na declarao da tabela temporria, mas elas no produzem efeito. A clusula ON COMMIT para as tabelas temporrias tambm lembra o padro SQL, mas possui algumas diferenas. Se a clusula ON COMMIT for omitida, o padro SQL especifica que o comportamento padro dever ser ON COMMIT DELETE ROWS. Entretanto, o comportamento padro no PostgreSQL ON COMMIT PRESERVE ROWS. A opo ON COMMIT DROP no existe no padro SQL. Restries de verificao de coluna O padro SQL diz que as restries de coluna CHECK s podem fazer referncia coluna onde esto aplicadas; somente as restries de tabela CHECK podem fazer referncia a vrias colunas. O PostgreSQL no impe esta restrio; as restries CHECK de coluna e de tabela so tratadas da mesma maneira. Tabelas sem coluna O PostgreSQL permite a criao de tabelas sem colunas (por exemplo, CREATE TABLE foo();). Isto uma extenso ao padro SQL, que no permite tabelas com zero coluna. As tabelas sem coluna no so muito teis, mas se no forem permitidas criam um caso especial para o comando ALTER TABLE DROP COLUMN e, por isso, parece mais simples ignorar esta restrio contida na especificao. Espaos de tabelas O conceito de espaos de tabelas do PostgreSQL no faz parte do padro. Portanto, as clusulas TABLESPACE e USING INDEX TABLESPACE so extenses.

ALTER TABLE: altera a definio de uma tabela Sinopse ALTER TABLE [ ONLY ] nome [ * ] ao [, ... ] ALTER TABLE [ ONLY ] nome [ * ] RENAME [ COLUMN ] coluna TO novo_nome_da_coluna ALTER TABLE nome

54
Curso de PostgreSQL 2010

RENAME TO novo_nome onde ao uma entre: ADD [ COLUMN ] coluna tipo [ restrio_de_coluna [ ... ] ] DROP [ COLUMN ] coluna [ RESTRICT | CASCADE ] ALTER [ COLUMN ] coluna TYPE tipo [ USING expresso ] ALTER [ COLUMN ] coluna SET DEFAULT expresso ALTER [ COLUMN ] coluna DROP DEFAULT ALTER [ COLUMN ] coluna { SET | DROP } NOT NULL ALTER [ COLUMN ] coluna SET STATISTICS inteiro ALTER [ COLUMN ] coluna SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN } ADD restrio_de_tabela DROP CONSTRAINT nome_da_restrio [ RESTRICT | CASCADE ] CLUSTER ON nome_do_ndice SET WITHOUT CLUSTER SET WITHOUT OIDS OWNER TO novo_dono SET TABLESPACE nome_do_espao_de_tabelas Descrio O comando ALTER TABLE altera a definio de uma tabela existente. Existem vrias sub-formas:

ADD COLUMN
Esta forma adiciona uma coluna tabela utilizando a mesma sintaxe do comando CREATE TABLE.

DROP COLUMN
Esta forma remove uma coluna da tabela. Os ndices e as restries da tabela que envolvem a coluna tambm so automaticamente removidos. necessrio especificar CASCADE se algum objeto fora da tabela depender da coluna como, por exemplo, referncias de chaves estrangeiras ou vises.

ALTER COLUMN TYPE


Esta forma muda o tipo de uma coluna da tabela. Os ndices e as restries de tabela simples que envolvem a coluna so automaticamente convertidos para usar o novo tipo da coluna, atravs da reanlise da expresso original fornecida. A clusula opcional USING especifica como computar o novo valor da coluna a partir do antigo; quando omitida, a converso padro a mesma de uma converso de atribuio do tipo antigo para o novo. A clusula USING deve ser fornecida quando no h nenhuma converso implcita ou de atribuio do tipo antigo para o novo.

SET DEFAULT ou DROP DEFAULT


Estas formas definem ou removem o valor padro para a coluna. O valor padro somente aplicado aos comandos INSERT subseqentes; as linhas existentes na tabela no so modificadas. Tambm podem ser criados valores padro para vises e, neste caso, so inseridos dentro do comando INSERT na viso antes da regra ON INSERT da viso ser aplicada.

SET NOT NULL ou DROP NOT NULL 55


Curso de PostgreSQL 2010

Estas formas alteram se a coluna est marcada para aceitar valores nulos ou para rejeitar valores nulos. A forma SET NOT NULL s pode ser utilizada quando no existem valores nulos na coluna.

ADD CONSTRAINT (restrio_de_tabela)


Esta forma adiciona uma nova restrio tabela utilizando a mesma sintaxe do comando CREATE TABLE.

DROP CONSTRAINT
Esta forma remove restries de tabela. Atualmente as restries de tabela no necessitam ter nomes nicos e, portanto, pode haver mais de uma restrio correspondendo ao nome especificado. Todas as restries correspondentes so removidas.

OWNER
Esta forma torna o usurio especificado o dono da tabela, ndice, seqncia ou viso.

SET TABLESPACE
Esta forma muda o espao de tabelas da tabela para o espao de tabelas especificado, e move os arquivos de dados associados tabela para o novo espao de tabelas. Havendo ndices na tabela, estes no so movidos; porm, podem ser movidos separadamente atravs de comandos SET TABLESPACE adicionais. Consulte tambm CREATE TABLESPACE.

RENAME
A forma RENAME muda o nome de uma tabela (ou de um ndice, de uma seqncia ou de uma viso), ou o nome de uma coluna da tabela. No produz efeito sobre os dados armazenados. Todas as aes, exceto RENAME, podem ser combinadas em uma lista de alteraes mltiplas a serem aplicadas em paralelo. Por exemplo, possvel adicionar vrias colunas e/ou alterar o tipo de vrias colunas em um nico comando. Esta situao particularmente til em tabelas grandes, uma vez que somente necessrio realizar uma passagem pela tabela. necessrio ser o dono da tabela para executar ALTER TABLE; exceto para ALTER TABLE OWNER, que somente pode ser executado por um superusurio. Parmetros

nome
O nome (opcionalmente qualificado pelo esquema) da tabela existente a ser alterada.

coluna
O nome de uma coluna nova ou existente.

novo_nome_da_coluna
O novo nome para uma coluna existente.

56
Curso de PostgreSQL 2010

novo_nome
O novo nome da tabela.

tipo
O tipo de dado da nova coluna, ou o novo tipo de dado de uma coluna existente.

restrio_de_tabela
A nova restrio de tabela para a tabela.

nome_da_restrio
O nome da restrio existente a ser removida.

CASCADE
Remove, automaticamente, os objetos que dependem da coluna ou da restrio removida (por exemplo, vises fazendo referncia coluna).

RESTRICT
Recusa remover a coluna ou a restrio se existirem objetos que dependem das mesmas. Este o comportamento padro.

nome_do_ndice
O nome do ndice pelo qual a tabela deve ser marcada para agrupamento.

novo_dono
O nome de usurio do novo dono da tabela.

nome_do_espao_de_tabelas
O nome do espao de tabelas para o qual a tabela ser movida. Observaes A palavra chave COLUMN apenas informativa, podendo ser omitida. Quando uma coluna adicionada usando ADD COLUMN, todas as linhas existentes na tabela so inicializadas com o valor padro da coluna (NULL, se no for especificada a clusula DEFAULT). Adicionar uma coluna com um valor padro no nulo, ou mudar o tipo de uma coluna existente, faz com que toda a tabela seja reescrita. Isto pode levar uma quantidade de tempo significativa no caso de uma tabela grande e, temporariamente, ser necessrio o dobro do espao em disco. A adio das restries CHECK e NOT NULL obrigam varrer toda a tabela para verificar se as linhas existentes esto em concordncia com a restrio.

57
Curso de PostgreSQL 2010

A razo principal para fornecer a opo de especificar vrias alteraes em um nico comando ALTER TABLE, que vrias varreduras ou reescritas da tabela podem assim ser combinadas em uma nica passagem pela tabela. A forma DROP COLUMN no remove fisicamente a coluna, simplesmente torna a coluna invisvel para as operaes SQL. As operaes subseqentes de insero e de atualizao na tabela armazenam o valor nulo na coluna. Portanto, remover uma coluna rpido mas no reduz imediatamente o espao em disco da tabela, porque o espao ocupado pela coluna removida no recuperado. O espao recuperado ao longo do tempo, medida que as linhas existentes so atualizadas. Algumas vezes vantajoso o fato de ALTER TYPE requerer a reescrita de toda a tabela, porque o processo de reescrita elimina todo o espao morto presente na tabela. Por exemplo, para recuperar imediatamente o espao ocupado por uma coluna removida, a forma mais rpida

ALTER TABLE tabela ALTER COLUMN qualquer_coluna TYPE qualquer_tipo;

onde qualquer_coluna uma coluna remanescente na tabela, e qualquer_tipo o mesmo tipo que a coluna j possui. Este comando resulta em uma modificao da tabela que no semanticamente visvel, mas fora uma reescrita eliminando os dados que no so mais teis. No permitido alterar qualquer parte dos catlogos do sistema. Para obter informaes adicionais sobre os parmetros vlidos deve ser consultado o comando CREATE TABLE. Exemplos Para adicionar uma coluna do tipo VARCHAR a uma tabela:

ALTER TABLE distribuidores ADD COLUMN endereco VARCHAR(30);

Para remover uma coluna da tabela:

ALTER TABLE distribuidores DROP COLUMN endereco RESTRICT;

Para mudar o tipo de duas colunas existentes em uma nica operao:

ALTER TABLE distribuidores ALTER COLUMN endereco TYPE VARCHAR(80), ALTER COLUMN nome TYPE VARCHAR(100);

Para mudar o nome de uma coluna existente:

ALTER TABLE distribuidores RENAME COLUMN endereco TO cidade;

58
Curso de PostgreSQL 2010

Para mudar o nome de uma tabela existente:

ALTER TABLE distribuidores RENAME TO fornecedores;

Para adicionar uma restrio de no nulo a uma coluna:

ALTER TABLE distribuidores ALTER COLUMN logradouro SET NOT NULL;

Para remover a restrio de no nulo da coluna:

ALTER TABLE distribuidores ALTER COLUMN logradouro DROP NOT NULL;

Para adicionar uma restrio de verificao tabela:

ALTER TABLE distribuidores ADD CONSTRAINT chk_cep CHECK (char_length(cod_cep) = 8);

Para remover uma restrio de verificao de uma tabela e de todas as suas descendentes:

ALTER TABLE distribuidores DROP CONSTRAINT chk_cep;

Para adicionar uma restrio de chave estrangeira a uma tabela:

ALTER TABLE distribuidores ADD CONSTRAINT fk_dist FOREIGN KEY (endereco) REFERENCES enderecos (endereco) MATCH FULL;

Para adicionar uma restrio de unicidade (multicoluna) tabela:

ALTER TABLE distribuidores ADD CONSTRAINT unq_id_dist_cod_cep UNIQUE (id_dist, cod_cep);

Para adicionar uma restrio de chave primria a uma tabela com o nome gerado automaticamente, levando em conta que a tabela pode possuir somente uma nica chave primria:

ALTER TABLE distribuidores ADD PRIMARY KEY (id_dist); Compatibilidade

59
Curso de PostgreSQL 2010

As formas ADD, DROP e SET DEFAULT esto em conformidade com o padro SQL. As outras formas so extenses do PostgreSQL ao padro SQL. Tambm, a capacidade de especificar mais de uma manipulao em um nico comando ALTER TABLE uma extenso. O comando ALTER TABLE DROP COLUMN pode ser utilizado para remover a nica coluna da tabela, produzindo uma tabela com zero coluna. Esta uma extenso ao padro SQL, que no permite tabelas sem nenhuma coluna. DROP TABLE: remove uma tabela Sinopse DROP TABLE nome [, ...] [ CASCADE | RESTRICT ] Descrio O comando DROP TABLE remove tabelas do banco de dados. Somente o dono pode remover a tabela. Para deixar uma tabela sem linhas, sem remov-la, deve ser usado o comando DELETE ou TRUNCATE. O comando DROP TABLE sempre remove todos os ndices, regras, gatilhos e restries existentes na tabela de destino. Entretanto, para remover uma tabela referenciada por uma viso ou por uma restrio de chave estrangeira de outra tabela, deve ser especificado CASCADE (CASCADE remove inteiramente a viso dependente, mas no caso da restrio de chave estrangeira somente a chave estrangeira removida, e no a outra tabela inteiramente). Parmetros

nome
O nome (opcionalmente qualificado pelo esquema) da tabela a ser removida.

CASCADE
Remove automaticamente os objetos que dependem da tabela (como as vises).

RESTRICT
Recusa remover a tabela se existirem objetos que dependem da mesma. Este o padro. Exemplos Remover duas tabelas, filmes e distribuidores:

DROP TABLE filmes, distribuidores; Compatibilidade Este comando est em conformidade com o padro SQL, exceto que o padro permite a remoo de apenas uma tabela por comando.

60
Curso de PostgreSQL 2010

6. DML Linguagem de Manipulao de Dados Comandos de Incluso, Alterao, Excluso de Dados INSERT: cria novas linhas na tabela Sinopse INSERT INTO tabela [ ( coluna [, ...] ) ] { DEFAULT VALUES | VALUES ( { expresso | DEFAULT } [, ...] ) | consulta } Descrio O comando INSERT insere novas linhas na tabela. Podem ser inseridas uma ou mais linhas especificadas por expresses de valor, ou zero ou mais linhas resultantes de uma consulta. Os nomes das colunas de destino podem ser listados em qualquer ordem. Se no for fornecida nenhuma lista de nomes de colunas, o padro usar todas as colunas da tabela na ordem em que foram declaradas; ou os primeiros N nomes de colunas, se existirem apenas N colunas fornecidas na clusula VALUES ou na consulta. Os valores fornecidos pela clusula VALUES ou pela consulta so associados lista de colunas explcita ou implcita da esquerda para a direita. As colunas que no esto presentes na lista de colunas explcita ou implcita so preenchidas com o valor padro, seja o valor padro declarado ou nulo se no houver nenhum. Se a expresso para alguma coluna no for do tipo de dado correto, ser tentada uma converso de tipo automtica. necessrio possuir o privilgio INSERT na tabela para poder inserir linhas. Se for utilizada a clusula consulta para inserir linhas a partir de uma consulta, tambm ser necessrio possuir o privilgio SELECT em todas as tabelas usadas pela consulta. Parmetros

tabela
O nome (opcionalmente qualificado pelo esquema) de uma tabela existente.

coluna
O nome de uma coluna da tabela. O nome da coluna pode ser qualificado por um nome de subcampo ou por um ndice de matriz, se for necessrio (a insero em apenas alguns campos de uma coluna composta deixa os outros campos nulos).

DEFAULT VALUES
Todas as colunas so preenchidas com seu valor padro.

expresso
Uma expresso ou valor a ser atribudo coluna correspondente.

DEFAULT
A coluna correspondente preenchida com o valor padro.

consulta 61
Curso de PostgreSQL 2010

Uma consulta (comando SELECT) que fornece as linhas a serem inseridas. Para obter a descrio da sintaxe deve ser consultado o comando SELECT. Sadas Ao terminar bem-sucedido, o comando INSERT retorna uma linha de fim de comando na forma

INSERT oid contador

O contador o nmero de linhas inseridas. Se contador for igual a um, e a tabela de destino possuir OIDs, ento oid ser o OID atribudo linha inserida, seno oid ser zero. Exemplos Inserir uma nica linha na tabela filmes:

INSERT INTO filmes VALUES ('UA502', 'Bananas', 105, '1971-07-13', 'Comdia', '82 minutes');

No exemplo abaixo a coluna duracao omitida e, portanto, receber o valor padro:

INSERT INTO filmes (cod, titulo, id_dist, data_prod, tipo) VALUES ('T_601', 'Yojimbo', 106, '1961-06-16', 'Drama');

O exemplo abaixo utiliza a clusula DEFAULT para a coluna data_prod em vez de especificar um valor.

INSERT INTO filmes VALUES ('UA502', 'Bananas', 105, DEFAULT, 'Comdia', '82 minutes'); INSERT INTO filmes (cod, titulo, id_dist, data_prod, tipo) VALUES ('T_601', 'Yojimbo', 106, DEFAULT, 'Drama');

Para inserir uma linha consistindo inteiramente de valores padro:

INSERT INTO filmes DEFAULT VALUES;

O exemplo abaixo insere algumas linhas na tabela filmes a partir da tabela temp_filmes com a mesma disposio de colunas da tabela filmes:

INSERT INTO filmes SELECT * FROM temp_filmes WHERE data_prod < '2004-05-07';

62
Curso de PostgreSQL 2010

O exemplo mostrado abaixo insere em colunas de matriz:

-- Criar um tabuleiro vazio de 3x3 posies para o Jogo da Velha -- (estes comandos criam o mesmo tabuleiro) INSERT INTO tictactoe (game, board[1:3][1:3]) VALUES (1,'{{"","",""},{"","",""},{"","",""}}'); INSERT INTO tictactoe (game, board) VALUES (2,'{{,,},{,,},{,,}}'); Compatibilidade O comando INSERT est em conformidade com o padro SQL. O caso em que a lista de nomes de colunas omitida, mas nem todas as colunas so preenchidas a partir da clusula VALUES ou da consulta no permitido pelo padro

UPDATE: atualiza linhas de uma tabela Sinopse UPDATE [ ONLY ] tabela SET coluna = { expresso | DEFAULT } [, ...] [ FROM lista_do_from ] [ WHERE condio ] Descrio O comando UPDATE muda os valores das colunas especificadas em todas as linhas que satisfazem a condio. Somente precisam ser mencionadas na clusula SET as colunas que sero modificadas; as colunas que no sero modificadas explicitamente mantero seus valores atuais. Por padro, o comando UPDATE atualiza linhas na tabela especificada e nas suas tabelas descendentes. Se for desejado atualizar apenas a tabela especificada, dever ser utilizada a clusula ONLY. Existem duas maneiras de modificar uma tabela utilizando informaes contidas em outras tabelas do banco de dados: usando subselees, ou especificando tabelas adicionais na clusula FROM. A tcnica mais apropriada depende das circunstncias especficas. necessrio possuir o privilgio UPDATE na tabela para atualiz-la, assim como o privilgio SELECT em todas as tabelas cujos valores so lidos pela expresso ou pela condio. Parmetros

tabela
O nome (opcionalmente qualificado pelo esquema) da tabela a ser atualizada.

coluna
O nome de uma coluna da tabela. O nome da coluna pode ser qualificado pelo nome de um subcampo ou ndice de matriz, se for necessrio.

expresso
Uma expresso a ser atribuda coluna. A expresso pode usar o valor antigo desta e de outras colunas da tabela.

63
Curso de PostgreSQL 2010

DEFAULT
Define o valor da coluna como o seu valor padro (que ser nulo se no tiver sido atribudo coluna nenhuma expresso padro especfica).

lista_do_from
Uma lista de expresses de tabela, que permite aparecerem colunas de outras tabelas na condio WHERE e nas expresses de atualizao. semelhante lista de tabelas que pode ser especificada na clusula Clusula FROM do comando SELECT. Deve ser observado que a tabela de destino no deve aparecer na lista_do_from, a menos que se deseje uma autojuno (neste caso deve aparecer com um alis na lista_do_from).

condio
Uma expresso que retorna um valor do tipo boolean. Somente so atualizadas as linhas para as quais esta expresso retorna true. Sadas Ao terminar bem-sucedido, o comando UPDATE retorna uma linha de fim de comando na forma

UPDATE contador

O contador o nmero de linhas atualizadas. Se contador for 0, nenhuma linha correspondeu condio (o que no considerado um erro). Observaes Quando a clusula FROM est presente o que acontece, essencialmente, que feita a juno da tabela de destino com as tabelas mencionadas na lista_do_from, e cada linha produzida pela juno representa uma operao de atualizao para a tabela de destino. Quando se usa a clusula FROM deve-se garantir que a juno produzir, no mximo, uma linha de sada para cada linha a ser modificada. Em outras palavras, a linha de destino no deve ser juntada com mais de uma linha das outras tabelas, porque seno somente uma das linhas da juno ser utilizada para atualizar a linha de destino, mas qual delas ser utilizada no imediatamente previsvel. Devido a esta indeterminao, mais seguro fazer referncia a outras tabelas somente dentro de subselees, embora seja mais difcil de ler e mais lento do que a utilizao da juno. Exemplos Mudar a palavra Drama para Dramtico na coluna tipo da tabela filmes:

UPDATE filmes SET tipo = 'Dramtico' WHERE tipo = 'Drama';

Ajustar as entradas de temperatura e redefinir a precipitao com seu valor padro em uma linha da tabela clima:

64
Curso de PostgreSQL 2010

UPDATE clima SET temp_min = temp_min+1, temp_max = temp_min+15, precipitacao = DEFAULT WHERE cidade = 'So Francisco' AND data = '2003-07-03';

Incrementar o contador de vendas do vendedor que gerencia a conta da Corporao Acme, usando a sintaxe da clusula FROM:

UPDATE empregados SET contador_de_vendas = contador_de_vendas + 1 FROM contas WHERE contas.nome = 'Corporao Acme' AND empregados.id = contas.vendedor;

Realizar a mesma operao utilizando uma subseleo na clusula WHERE:

UPDATE empregados SET contador_de_vendas = contador_de_vendas + 1 WHERE id = (SELECT vendedor FROM contas WHERE nome = 'Corporao Acme');

Tentar inserir um novo item no estoque junto com a quantidade em estoque. Se o item j existir, em vez inserir, atualizar o contador de estoque do item existente. Para fazer isto, sem interromper toda a transao, utilizado um ponto de salvamento.

BEGIN; -- outras operaes SAVEPOINT sp1; INSERT INTO vinhos VALUES('Chateau Lafite 2003', '24'); -- Assumindo que o comando acima falhou devido violao de chave nica, -- sero submetidos os comandos abaixo: ROLLBACK TO sp1; UPDATE vinhos SET estoque = estoque + 24 WHERE nome_do_vinho = 'Chateau Lafite 2003'; -- prosseguir com as outras operaes e, finalmente, COMMIT; Compatibilidade Este comando est em conformidade com o padro SQL, exceto pela clusula FROM que uma extenso do PostgreSQL. Alguns outros sistemas de bancos de dados oferecem uma opo FROM onde se pressupe que a tabela de destino ser listada novamente dentro da clusula FROM. O PostgreSQL no interpreta a clusula FROM desta forma. Deve-se tomar cuidado ao portar aplicativos que utilizam esta extenso.

DELETE: exclui linhas de uma tabela Sinopse DELETE FROM [ ONLY ] tabela [ WHERE condio ]

65
Curso de PostgreSQL 2010

Descrio O comando DELETE exclui da tabela especificada as linhas que satisfazem a clusula WHERE. Se a clusula WHERE estiver ausente, o efeito ser excluir todas as linhas da tabela. O resultado ser uma tabela vlida, porm vazia. Dica: O comando TRUNCATE uma extenso do PostgreSQL que fornece um mecanismo mais rpido para excluir todas as linhas da tabela. Por padro, o comando DELETE exclui linhas da tabela especificada e de todas as suas tabelas descendentes. Se for desejado excluir linhas apenas da tabela especificada, deve ser utilizada a clusula ONLY. necessrio possuir o privilgio DELETE na tabela para excluir linhas da mesma, assim como o privilgio SELECT para todas as tabelas cujos valores so lidos pela condio. Parmetros

tabela
O nome (opcionalmente qualificado pelo esquema) de uma tabela existente.

condio
Uma expresso retornando um valor do tipo boolean, que determina as linhas a serem excludas. Sadas Ao trmino bem-sucedido, o comando DELETE retorna uma linha de fim de comando na forma

DELETE contador

O contador o nmero de linhas excludas. Se contador for igual a 0, ento nenhuma linha correspondeu condio (isto no considerado um erro). Observaes O PostgreSQL permite que se faa referncia a colunas de outras tabelas na condio WHERE. Por exemplo, para excluir todos os filmes produzidos por um determinado produtor pode ser utilizado:

DELETE FROM filmes WHERE filmes.id_produtor = produtores.id_produtor AND produtores.nome = 'foo';

Essencialmente o que acontece neste comando uma juno entre as tabelas filmes e produtores, com todas as linhas de filmes juntadas com sucesso sendo marcadas para excluso. Esta sintaxe no padro. Uma forma mais padro de se fazer isto :

DELETE FROM filmes

66
Curso de PostgreSQL 2010

WHERE id_produtor IN (SELECT id_produtor FROM produtores WHERE nome = 'foo');

Em alguns casos o estilo juno mais fcil de ser escrito ou mais rpido de executar do que o estilo subseleo. Uma objeo ao estilo juno que no existe uma lista explcita de quais tabelas esto sendo utilizadas, o que torna este estilo propenso a erros; tambm no pode tratar autojunes. Exemplos Excluir todos os filmes, exceto os musicais:

DELETE FROM filmes WHERE tipo <> 'Musical';

Limpar a tabela filmes:

DELETE FROM filmes; Compatibilidade Este comando est em conformidade com o padro SQL, exceto que capacidade de fazer referncia a outras tabelas na clusula WHERE uma extenso do PostgreSQL.

7. DQL Linguagem de Consulta de Dados Comando de Seleo de Dados


SELECT: retorna linhas de uma tabela ou de uma viso Sinopse SELECT [ ALL | DISTINCT [ ON ( expresso [, ...] ) ] ] * | expresso [ AS nome_de_sada ] [, ...] [ FROM item_do_from [, ...] ] [ WHERE condio ] [ GROUP BY expresso [, ...] ] [ HAVING condio [, ...] ] [ { UNION | INTERSECT | EXCEPT } [ ALL ] seleo ] [ ORDER BY expresso [ ASC | DESC | USING operador ] [, ...] ] [ LIMIT { contador | ALL } ] [ OFFSET incio ] [ FOR UPDATE [ OF nome_da_tabela [, ...] ] ] onde item_do_from pode ser um entre: [ ONLY ] nome_da_tabela [ * ] [ [ AS ] alis [ ( alis_de_coluna [, ...] ) ] ] ( seleo ) [ AS ] alis [ ( alis_de_coluna [, ...] ) ] nome_da_funo ( [ argumento [, ...] ] ) [ AS ] alis [ ( alis_de_coluna [, ...] | definio_de_coluna [, ...] ) ] nome_da_funo ( [ argumento [, ...] ] ) AS ( definio_de_coluna [, ...] )

67
Curso de PostgreSQL 2010

item_do_from [ NATURAL ] tipo_de_juno item_do_from [ ON condio_de_juno | USING ( coluna_de_juno [, ...] ) ] Descrio O processo de trazer, ou o comando para trazer os dados armazenados no banco de dados, chamado de consulta. No SQL, o comando SELECT utilizado para especificar consultas. A sintaxe geral do comando SELECT SELECT lista_de_seleo FROM expresso_de_tabela [especificao_da_ordenao] As prximas sees descrevem em detalhes a lista de seleo, a expresso de tabela, e a especificao da ordenao.

Expresses de tabela Uma expresso de tabela computa uma tabela. A expresso de tabela contm a clusula FROM seguida, opcionalmente, pelas clusulas WHERE, GROUP BY e HAVING. As expresses de tabela triviais fazem, simplesmente, referncia as to faladas tabelas em disco, chamadas de tabelas base, mas podem ser utilizadas expresses mais complexas para modificar ou combinar tabelas base de vrias maneiras. As clusulas opcionais WHERE, GROUP BY e HAVING, da expresso de tabela, especificam um processo de transformaes sucessivas realizadas na tabela produzida pela clusula FROM. Todas estas transformaes produzem uma tabela virtual que fornece as linhas passadas para a lista de seleo, para ento serem computadas as linhas de sada da consulta. A clusula FROM A Clusula FROM deriva uma tabela a partir de uma ou mais tabelas especificadas na lista, separada por vrgulas, de referncias a tabela. FROM referncia_a_tabela [, referncia_a_tabela [, ...]] Uma referncia a tabela pode ser um nome de tabela (possivelmente qualificado pelo esquema) ou uma tabela derivada, como uma subconsulta, uma juno de tabelas ou, ainda, uma combinao complexa destas. Se for listada mais de uma referncia a tabela na clusula FROM, feita uma juno cruzada (cross-join) (veja abaixo) para formar a tabela virtual intermediria que poder, ento, estar sujeita s transformaes das clusulas WHERE, GROUP BY e HAVING, gerando o resultado final de toda a expresso de tabela. Juno de tabelas Uma tabela juntada uma tabela derivada de outras duas tabelas (reais ou derivadas), de acordo com as regras do tipo particular de juno. Esto disponveis as junes internas, externas e cruzadas. Tipos de juno Juno cruzada T1 CROSS JOIN T2

68
Curso de PostgreSQL 2010

Para cada combinao de linhas de T1 e T2, a tabela derivada contm uma linha formada por todas as colunas de T1 seguidas por todas as colunas de T2. Se as tabelas possurem N e M linhas, respectivamente, a tabela juntada ter N * M linhas.

FROM T1 CROSS JOIN T2 equivale a FROM T1, T2. Tambm equivale a FROM T1 INNER JOIN T2 ON TRUE
(veja abaixo). Junes qualificadas T1 { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2 ON expresso_booleana T1 { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2 USING ( lista de colunas de juno ) T1 NATURAL { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2 As palavras INNER e OUTER so opcionais em todas as formas. INNER o padro; LEFT, RIGHT e FULL implicam em juno externa. Os tipos possveis de juno qualificada so:

INNER JOIN
Para cada linha L1 de T1, a tabela juntada possui uma linha para cada linha de T2 que satisfaz a condio de juno com L1.

LEFT OUTER JOIN


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.

RIGHT OUTER JOIN


Primeiro, realizada uma juno interna. Depois, para cada linha de T2 que no satisfaz a condio de juno com nenhuma linha de T1, adicionada uma linha juntada com valores nulos nas colunas de T1. o oposto da juno esquerda: a tabela resultante possui, incondicionalmente, uma linha para cada linha de T2.

FULL OUTER JOIN


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. Tambm, para cada linha de T2 que no satisfaz a condio de juno com nenhuma linha de T1, adicionada uma linha juntada com valores nulos nas colunas de T1. Para reunir tudo isto, vamos supor que temos as tabelas t1

num | nome -----+-----1|a 2|b 3|c

69
Curso de PostgreSQL 2010

e t2

num | valor -----+------1 | xxx 3 | yyy 5 | zzz

e mostrar os resultados para vrios tipos de juno:

=> SELECT * FROM t1 CROSS JOIN t2; num | nome | num | valor -----+------+-----+------1 | a | 1 | xxx 1 | a | 3 | yyy 1 | a | 5 | zzz 2 | b | 1 | xxx 2 | b | 3 | yyy 2 | b | 5 | zzz 3 | c | 1 | xxx 3 | c | 3 | yyy 3 | c | 5 | zzz (9 linhas) => SELECT * FROM t1 INNER JOIN t2 ON t1.num = t2.num; num | nome | num | valor -----+------+-----+------1 | a | 1 | xxx 3 | c | 3 | yyy (2 linhas) => SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num; num | nome | num | valor -----+------+-----+------1 | a | 1 | xxx 2|b | | 3 | c | 3 | yyy (3 linhas) => SELECT * FROM t1 RIGHT JOIN t2 ON t1.num = t2.num; num | nome | num | valor -----+------+-----+------1 | a | 1 | xxx 3 | c | 3 | yyy | | 5 | zzz

70
Curso de PostgreSQL 2010

(3 linhas) => SELECT * FROM t1 FULL JOIN t2 ON t1.num = t2.num; num | nome | num | valor -----+------+-----+------1 | a | 1 | xxx 2|b | | 3 | c | 3 | yyy | | 5 | zzz (4 linhas) Aliases de tabela e de coluna Pode ser dado um nome temporrio s tabelas, e s referncias a tabela complexas, para ser usado nas referncias tabela derivada no restante do comando. Para criar um alis de tabela, escreve-se FROM referncia_a_tabela AS alis ou FROM referncia_a_tabela alis

A palavra chave AS opcional. O alis pode ser qualquer identificador. Uma utilizao tpica de alis de tabela para atribuir identificadores curtos a nomes de tabelas longos, para manter a clusula de juno legvel. Por exemplo:

SELECT * FROM um_nome_muito_comprido u JOIN outro_nome_muito_comprido o ON u.id = o.num;

O alis se torna o novo nome da referncia tabela na consulta corrente no mais possvel fazer referncia tabela pelo seu nome original. Portanto,

SELECT * FROM minha_tabela AS m WHERE minha_tabela.a > 5;

no uma sintaxe SQL vlida. O que acontece de verdade (isto uma extenso do PostgreSQL ao padro), que uma referncia a tabela implcita adicionada clusula FROM. Portanto, a consulta processada como se tivesse sido escrita assim

SELECT * FROM minha_tabela AS m, minha_tabela AS minha_tabela WHERE minha_tabela.a > 5; Subconsultas Subconsultas especificando uma tabela derivada devem estar entre parnteses, e devem ter um nome de alis de tabela atribudo. Por exemplo:

71
Curso de PostgreSQL 2010

FROM (SELECT * FROM tabela1) AS nome_alis

Este exemplo equivale a FROM tabela1 AS nome_alis. Casos mais interessantes, que no podem ser reduzidos a junes simples, ocorrem quando a subconsulta envolve agrupamento ou agregao. A clusula WHERE A sintaxe da Clusula WHERE WHERE condio_de_pesquisa onde a condio_de_pesquisa qualquer expresso de valor que retorne um valor do tipo boolean. Aps o processamento da clusula FROM ter sido feito, cada linha da tabela virtual derivada verificada com relao condio de pesquisa. Se o resultado da condio for verdade, a linha mantida na tabela de sada, seno (ou seja, se o resultado for falso ou nulo) a linha desprezada. Normalmente a condio de pesquisa faz referncia a pelo menos uma coluna da tabela gerada pela clusula FROM; embora isto no seja requerido, se no for assim a clusula WHERE no ter utilidade. Nota: A condio de juno de uma juno interna pode ser escrita tanto na clusula WHERE quanto na clusula JOIN. Por exemplo, estas duas expresses de tabela so equivalentes:

FROM a, b WHERE a.id = b.id AND b.val > 5

FROM a INNER JOIN b ON (a.id = b.id) WHERE b.val > 5

As clusulas GROUP BY e HAVING Aps passar pelo filtro WHERE, a tabela de entrada derivada pode estar sujeita ao agrupamento, utilizando a clusula GROUP BY, e eliminao de grupos de linhas, utilizando a clusula HAVING. SELECT lista_de_seleo FROM ... [WHERE ...] GROUP BY referncia_a_coluna_de_agrupamento [, referncia_a_coluna_de_agrupamento]... A Clusula GROUP BY utilizada para agrupar linhas da tabela que compartilham os mesmos valores em todas as colunas da lista. Em que ordem as colunas so listadas no faz diferena. O efeito combinar cada conjunto de linhas que compartilham valores comuns em uma linha de grupo que representa todas as linhas do grupo. Isto feito para eliminar redundncia na sada, e/ou para calcular agregaes aplicveis a estes grupos. Por exemplo:

72
Curso de PostgreSQL 2010

=> SELECT * FROM teste1; x|y ---+--a|3 c|2 b|5 a|1 (4 linhas) => SELECT x, sum(y) FROM teste1 GROUP BY x; x | sum ---+----a| 4 b| 5 c| 2 (3 linhas)

Aqui SUM() a funo de agregao que calcula um valor nico para o grupo todo. Abaixo est mostrado um outro exemplo: clculo do total das vendas de cada produto (e no o total das vendas de todos os produtos).

SELECT cod_prod, p.nome, (sum(v.unidades) * p.preco) AS vendas FROM produtos p LEFT JOIN vendas v USING (cod_prod) GROUP BY cod_prod, p.nome, p.preco;

Neste exemplo, as colunas cod_prod, p.nome e p.preco devem estar na clusula GROUP BY, porque so referenciadas na lista de seleo da consulta (dependendo da forma exata como a tabela produtos for definida, as colunas nome e preo podem ser totalmente dependentes da coluna cod_prod, tornando os agrupamentos adicionais teoricamente desnecessrios, mas isto ainda no est implementado). A coluna v.unidades no precisa estar na lista do GROUP BY, porque usada apenas na expresso de agregao (sum(...)), que representa as vendas do produto. Para cada produto, a consulta retorna uma linha sumarizando todas as vendas do produto. No SQL estrito, a clusula GROUP BY somente pode agrupar pelas colunas da tabela de origem, mas o PostgreSQL estende esta funcionalidade para permitir o GROUP BY agrupar pelas colunas da lista de seleo. O agrupamento por expresses de valor, em vez de nomes simples de colunas, tambm permitido. Se uma tabela for agrupada utilizando a clusula GROUP BY, mas houver interesse em alguns grupos apenas, pode ser utilizada a clusula HAVING, de forma parecida com a clusula WHERE, para eliminar grupos da tabela agrupada. A sintaxe : SELECT lista_de_seleo FROM ... [WHERE ...] GROUP BY ... HAVING expresso_booleana

73
Curso de PostgreSQL 2010

As expresses na clusula HAVING podem fazer referncia tanto a expresses agrupadas quanto a no agrupadas (as quais necessariamente envolvem uma funo de agregao). Exemplo:

=> SELECT x, sum(y) FROM teste1 GROUP BY x HAVING sum(y) > 3; x | sum ---+----a| 4 b| 5 (2 linhas) => SELECT x, sum(y) FROM teste1 GROUP BY x HAVING x < 'c'; x | sum ---+----a| 4 b| 5 (2 linhas)

Agora vamos fazer um exemplo mais prximo da realidade:

SELECT cod_prod, p.nome, (sum(v.unidades) * (p.preco - p.custo)) AS lucro FROM produtos p LEFT JOIN vendas v USING (cod_prod) WHERE v.data > CURRENT_DATE - INTERVAL '4 weeks' GROUP BY cod_prod, p.nome, p.preco, p.custo HAVING sum(p.preco * v.unidades) > 5000;

No exemplo acima, a clusula WHERE est selecionando linhas por uma coluna que no agrupada (a expresso somente verdadeira para as vendas feitas nas quatro ltimas semanas, enquanto a clusula HAVING restringe a sada aos grupos com um total de vendas brutas acima de 5000. Deve ser observado que as expresses de agregao no precisam ser necessariamente as mesmas em todas as partes da consulta. Utilizao da expresso CASE para agrupar valores A expresso CASE pode fazer parte da lista de agrupamento. Este exemplo usa a expresso CASE para agrupar as notas dos alunos em conceitos, e calcular a nota mnima, mxima e mdia, alm da quantidade de notas, correspondente a cada conceito. Abaixo est mostrado o script utilizado:

CREATE TABLE notas ( nota decimal(4,2) CONSTRAINT chknota CHECK (nota BETWEEN 0.00 AND 10.00) ); INSERT INTO notas VALUES(10); INSERT INTO notas VALUES(9.2); INSERT INTO notas VALUES(9.0);

74
Curso de PostgreSQL 2010

INSERT INTO notas VALUES(8.3); INSERT INTO notas VALUES(7.7); INSERT INTO notas VALUES(7.4); INSERT INTO notas VALUES(6.4); INSERT INTO notas VALUES(5.8); INSERT INTO notas VALUES(5.1); INSERT INTO notas VALUES(5.0); INSERT INTO notas VALUES(0); SELECT CASE WHEN nota < 3 THEN 'E' WHEN nota < 5 THEN 'D' WHEN nota < 7 THEN 'C' WHEN nota < 9 THEN 'B' ELSE 'A' END AS conceito, COUNT(*) AS quantidade, MIN(nota) AS menor, MAX(nota) AS maior, AVG(nota) AS media FROM notas GROUP BY CASE WHEN nota < 3 THEN 'E' WHEN nota < 5 THEN 'D' WHEN nota < 7 THEN 'C' WHEN nota < 9 THEN 'B' ELSE 'A' END ORDER BY conceito;

A seguir esto mostrados os resultados obtidos:

conceito | quantidade | menor | maior | media ----------+------------+-------+-------+-----------------------A | 3 | 9.00 | 10.00 | 9.4000000000000000 B | 3 | 7.40 | 8.30 | 7.8000000000000000 C | 4 | 5.00 | 6.40 | 5.5750000000000000 E | 1 | 0.00 | 0.00 | 0.00000000000000000000 (4 linhas)

Listas de seleo Conforme foi mostrado na seo anterior, a expresso de tabela do comando SELECT constri uma tabela virtual intermediria, possivelmente por meio da combinao de tabelas, vises, eliminao de linhas, agrupamento, etc. Esta tabela finalmente passada adiante para ser processada pela lista de seleo. A lista de seleo determina quais colunas da tabela intermediria vo realmente para a sada.

75
Curso de PostgreSQL 2010

Itens da lista de seleo O tipo mais simples de lista de seleo o *, que emite todas as colunas produzidas pela expresso de tabela. De outra forma, a lista de seleo uma lista separada por vrgulas de expresses de valor. Por exemplo, esta pode ser uma lista de nomes de colunas: SELECT a, b, c FROM ...

Os nomes das colunas a, b e c podem ser os nomes verdadeiros das colunas das tabelas referenciadas na clusula FROM, ou aliases dados a estas colunas. O espao de nomes disponvel na lista de seleo o mesmo da clusula WHERE, a no ser que seja utilizado agrupamento e, neste caso, passa a ser o mesmo da clusula HAVING. Quando mais de uma tabela possui uma coluna com o mesmo nome, o nome da tabela deve ser fornecido tambm, como em:

SELECT tbl1.a, tbl2.a, tbl1.b FROM ... Rtulos de coluna Podem ser atribudos nomes para as entradas da lista de seleo para processamento posterior. Neste caso, "processamento posterior" uma especificao opcional de classificao e o aplicativo cliente (por exemplo, os ttulos das colunas para exibio). Por exemplo:

SELECT a AS valor, b + c AS soma FROM ...

Se nenhum nome de coluna de sada for especificado utilizando AS, o sistema atribui um nome padro. Para referncias a colunas simples, o nome da coluna referenciada. Para chamadas de funo, o nome da funo. Para expresses complexas o sistema gera um nome genrico. Nota: Aqui, o nome dado coluna de sada diferente do nome dado na clusula FROM. Na verdade, este processo permite mudar o nome da mesma coluna duas vezes, mas o nome escolhido na lista de seleo o passado adiante. DISTINCT Aps a lista de seleo ser processada, a tabela resultante pode opcionalmente estar sujeita remoo das linhas duplicadas. A palavra chave DISTINCT deve ser escrita logo aps o SELECT para especificar esta funcionalidade: SELECT DISTINCT lista_de_seleo ... (Em vez de DISTINCT pode ser utilizada a palavra ALL para especificar o comportamento padro de manter todas as linhas) Como bvio, duas linhas so consideradas distintas quando tm pelo menos uma coluna diferente. Os valores nulos so considerados iguais nesta comparao.

76
Curso de PostgreSQL 2010

Como alternativa, uma expresso arbitrria pode determinar quais linhas devem ser consideradas distintas: SELECT DISTINCT ON (expresso [, expresso ...]) lista_de_seleo ... Neste caso, expresso uma expresso de valor arbitrria avaliada para todas as linhas. Um conjunto de linhas para as quais todas as expresses so iguais so consideradas duplicadas, e somente a primeira linha do conjunto mantida na sada. Deve ser observado que a "primeira linha" de um conjunto imprevisvel, a no ser que a consulta seja ordenada por um nmero suficiente de colunas para garantir a ordem nica das linhas que chegam no filtro DISTINCT (o processamento de DISTINCT ON ocorre aps a ordenao do ORDER BY). Ordenao de linhas Aps a consulta ter produzido a tabela de sada (aps a lista de seleo ter sido processada) esta tabela pode, opcionalmente, ser ordenada. Se nenhuma ordenao for especificada, as linhas retornam em uma ordem aleatria. Neste caso, a ordem real depende dos tipos de plano de varredura e de juno e da ordem no disco, mas no se deve confiar nisto. Uma ordem de sada especfica somente pode ser garantida se a etapa de ordenao for especificada explicitamente. A clusula ORDER BY especifica a ordem de classificao: SELECT lista_de_seleo FROM expresso_de_tabela ORDER BY coluna1 [ASC | DESC] [, coluna2 [ASC | DESC] ...] onde coluna1, etc., fazem referncia s colunas da lista de seleo. Pode ser tanto o nome de sada da coluna quanto o nmero da coluna. Alguns exemplos:

SELECT a, b FROM tabela1 ORDER BY a; SELECT a + b AS soma, c FROM tabela1 ORDER BY soma; SELECT a, sum(b) FROM tabela1 GROUP BY a ORDER BY 1;

Como extenso ao padro SQL, o PostgreSQL tambm permite ordenar por expresses arbitrrias:

SELECT a, b FROM tabela1 ORDER BY a + b;

Tambm permitido fazer referncia a nomes de colunas da clusula FROM que no esto presentes na lista de seleo:

SELECT a FROM tabela1 ORDER BY b;

Cada especificao de coluna pode ser seguida pela palavra opcional ASC ou DESC, para definir a direo de ordenao como ascendente ou descendente. A ordem ASC o padro. A ordenao ascendente coloca os valores menores na frente, sendo que "menor" definido nos termos do operador <. De forma semelhante, a ordenao descendente determinada pelo operador >. Se for especificada a ordenao por mais de uma coluna, as ltimas entradas so utilizadas para ordenar as linhas iguais sob a ordem imposta pelas colunas de ordenao anteriores.

77
Curso de PostgreSQL 2010

8. DCL Linguagem de Controle de Dados Comandos de Criao, Alterao e Excluso de usurios CREATE USER: cria uma conta de usurio do banco de dados Sinopse CREATE USER nome [ [ WITH ] opo [ ... ] ] onde opo pode ser: SYSID id_do_usurio | CREATEDB | NOCREATEDB | CREATEUSER | NOCREATEUSER | IN GROUP nome_do_grupo [, ...] | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'senha' | VALID UNTIL 'data_e_hora' Descrio O comando CREATE USER adiciona um novo usurio ao agrupamento de bancos de dados do PostgreSQL. Consulte o Captulo 17 e o Captulo 19 da documentao do PostgreSQL para obter informaes adicionais sobre o gerenciamento de usurios e autenticao. Apenas os superusurios do banco de dados podem usar este comando. Parmetros

nome
O nome do usurio.

id_do_usurio
A clusula SYSID pode ser utilizada para escolher o identificador de usurio do PostgreSQL do novo usurio. Normalmente no necessrio, mas pode ser til se for necessrio recriar o dono de um objeto que ficou rfo. Se no for especificado, ser utilizado por padro o maior identificador de usurio atribudo acrescido de um (com mnimo de 100).

CREATEDB NOCREATEDB
Estas clusulas definem a permisso para o usurio criar banco de dados. Se for especificado CREATEDB, o usurio sendo definido ter permisso para criar seus prprios bancos de dados. Se for especificado NOCREATEDB, nega-se ao usurio a permisso para criar banco de dados. Se nenhuma destas clusulas for especificada, o padro NOCREATEDB.

CREATEUSER NOCREATEUSER
Estas clusulas determinam se o usurio pode ou no criar novos usurios. CREATEUSER tambm torna o usurio um superusurio, o qual pode passar por cima de todas as restries de acesso. Se nenhuma destas clusulas for especificada, o padro NOCREATEUSER.

78
Curso de PostgreSQL 2010

nome_do_grupo
O nome de um grupo existente onde o usurio ser includo como um novo membro. Podem ser especificados nomes de vrios grupos.

senha
Define a senha do usurio. Se no se pretende utilizar autenticao por senha esta opo pode ser omitida, mas o usurio no poder mais se conectar se for decidido mudar para autenticao por senha. A senha poder ser definida ou mudada posteriormente atravs do comando ALTER USER.

ENCRYPTED UNENCRYPTED
Estas clusulas controlam se a senha ser armazenada criptografada, ou no, nos catlogos do sistema; Se no for especificada nenhuma destas clusulas, o comportamento padro ser determinado pelo parmetro de configurao password_encryption. Se a cadeia de caracteres da senha j estiver criptografada no formato MD5, ento a cadeia de caracteres ser armazenada como est, independentemente de ser especificado ENCRYPTED ou UNENCRYPTED (porque o sistema no pode descriptografar a cadeia de caracteres criptografada contendo a senha). Esta funcionalidade permite a restaurao de senhas criptografadas efetuadas por uma operao de dump/restore. Deve ser observado que os clientes antigos podem no possuir suporte para o mecanismo de autenticao MD5, necessrio para trabalhar com as senhas que so armazenadas criptografadas.

data_e_hora
A clusula VALID UNTIL define uma data e hora aps a qual a senha do usurio no mais vlida. Se esta clusula for omitida, a conta ser vlida para sempre. Observaes Deve ser usado o comando ALTER USER para mudar os atributos de um usurio, e DROP USER para remover um usurio. Deve se usado ALTER GROUP para adicionar ou remover usurios de grupos. O PostgreSQL inclui o programa createuser que possui a mesma funcionalidade do CREATE USER (na verdade, chama este comando), mas pode ser executado a partir da linha de comando. A clusula VALID UNTIL define uma data de expirao para a senha apenas, e no para a conta do usurio per se. Em particular, a obedincia data de expirao no imposta ao se conectar utilizando um mtodo de autenticao no baseado em senha. Exemplos Criar um usurio sem senha:

CREATE USER jonas;

Criar um usurio com senha:

79
Curso de PostgreSQL 2010

CREATE USER manuel WITH PASSWORD 'jw8s0F4';

Criar um usurio com uma senha vlida at o fim de 2004. Aps o primeiro segundo de 2005 a senha no ser mais vlida.

CREATE USER miriam WITH PASSWORD 'jw8s0F4' VALID UNTIL '2005-01-01';

Criar uma conta onde o usurio pode criar bancos de dados:

CREATE USER manuel WITH PASSWORD 'jw8s0F4' CREATEDB; Compatibilidade O comando CREATE USER uma extenso do PostgreSQL. O padro SQL deixa a definio de usurios para a implementao.

ALTER USER: altera uma conta de usurio do banco de dados Sinopse ALTER USER nome [ [ WITH ] opo [ ... ] ] onde opo pode ser: CREATEDB | NOCREATEDB | CREATEUSER | NOCREATEUSER | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'senha' | VALID UNTIL 'data_e_hora' ALTER USER nome RENAME TO novo_nome ALTER USER nome SET parmetro { TO | = } { valor | DEFAULT } ALTER USER nome RESET parmetro Exemplos Mudar a senha do usurio:

ALTER USER marcos WITH PASSWORD 'hu8jmn3';

Mudar a data de expirao da senha do usurio:

ALTER USER manuel VALID UNTIL 'Jan 31 2030';

80
Curso de PostgreSQL 2010

Mudar a data de expirao da senha, especificando que a senha expira ao meio dia de 4 de maio de 2005, usando uma zona horria uma hora adiante da UTC:

ALTER USER cristiane VALID UNTIL 'May 4 12:00:00 2005 +1';

Tornar o usurio vlido para sempre:

ALTER USER andrea VALID UNTIL 'infinity';

Dar ao usurio permisso para criar outros usurios e novos bancos de dados:

ALTER USER luizete CREATEUSER CREATEDB;

DROP USER: remove uma conta de usurio do banco de dados Sinopse DROP USER nome Descrio O comando DROP USER remove o usurio especificado. No remove as tabelas, vises ou outros objetos pertencentes ao usurio. Se o usurio possuir algum banco de dados uma mensagem de erro gerada. 9. Operadores e Funes de Agregao O PostgreSQL fornece um grande nmero de funes e operadores para os tipos de dado nativos. Os usurios tambm podem definir suas prprias funes e operadores. Os comandos \df e \do do psql podem ser utilizados para mostrar a lista de todas as funes e operadores disponveis, respectivamente. Operadores lgicos Esto disponveis os operadores lgicos habituais: AND OR NOT O SQL utiliza a lgica booleana de trs valores, onde o valor nulo representa o "desconhecido". Devem ser observadas as seguintes tabelas verdade:

a
TRUE TRUE

b
TRUE FALSE

a AND b
TRUE FALSE

a OR b
TRUE TRUE

81
Curso de PostgreSQL 2010

a
TRUE FALSE FALSE NULL

b
NULL FALSE NULL NULL NOT a FALSE TRUE NULL

a AND b
NULL FALSE FALSE NULL

a OR b
TRUE FALSE NULL NULL

a
TRUE FALSE NULL

Os operadores AND e OR so comutativos, ou seja, pode-se trocar a ordem dos operandos esquerdo e direito sem afetar o resultado. Operadores de comparao Esto disponveis os operadores de comparao habituais, conforme mostrado na Tabela a seguir. Operador < > <= >= = <> ou != Descrio menor maior menor ou igual maior ou igual igual diferente

Os operadores de comparao esto disponveis para todos os tipos de dado onde fazem sentido. Todos os operadores de comparao so operadores binrios, que retornam valores do tipo boolean; expresses como 1 < 2 < 3 no so vlidas (porque no existe o operador < para comparar um valor booleano com 3). Alm dos operadores de comparao, est disponvel a construo especial BETWEEN. a BETWEEN x AND y equivale a a >= x AND a <= y Analogamente, a NOT BETWEEN x AND y equivale a a < x OR a > y

82
Curso de PostgreSQL 2010

Funes de agregao As funes de agregao retornam um nico valor como resultado de um conjunto de valores de entrada. Na tabela a seguir mostra as funes de agregao internas. Funo avg(expresso) Tipo do argumento smallint, integer, bigint, real, double precision, numeric ou interval Tipo retornado numeric para qualquer argumento de tipo inteiro, double precision para argumento de tipo ponto flutuante, caso contrrio o mesmo tipo de dado do argumento o mesmo tipo de dado do argumento Descrio a mdia (mdia aritmtica) de todos os valores de entrada

bit_and(expresso)

smallint, integer, bigint ou bit

o AND bit a bit de todos os valores de entrada no nulos, ou nulo se algum for nulo o OR bit a bit de todos os valores de entrada no nulos, ou nulo se algum for nulo verdade se todos os valores de entrada forem verdade, seno falso verdade se ao menos um dos valores de entrada for verdade, seno falso

bit_or(expresso)

smallint, integer, bigint ou bit

o mesmo tipo de dado do argumento

bool_and(expresso)

bool

bool

bool_or(expresso)

bool

bool

83
Curso de PostgreSQL 2010

Funo count(*)

Tipo do argumento

Tipo retornado bigint

Descrio nmero valores entrada de de

count(expresso)

any

bigint

nmero de valores de entrada para os quais o valor da expresso no nulo equivale ao bool_and valor mximo da expresso entre todos os valores de entrada valor mnimo da expresso entre todos os valores de entrada desvio padro da amostra dos valores de entrada

every(expresso)

bool

bool

max(expresso)

qualquer tipo de dado matriz, numrico, cadeia de caracteres, data ou hora

o mesmo tipo de dado do argumento

min(expresso)

qualquer tipo de dado matriz, numrico, cadeia de caracteres, data ou hora

o mesmo tipo de dado do argumento

stddev(expresso)

smallint, integer, bigint, real, double precision ou numeric

double precision para argumentos de ponto flutuante, caso contrrio numeric. bigint para argumentos smallint ou integer, numeric para argumentos bigint, double precision

sum(expresso)

smallint, integer, bigint, real, double precision, numeric ou interval

somatrio da expresso para todos os valores de entrada

84
Curso de PostgreSQL 2010

Funo

Tipo do argumento

Tipo retornado para argumentos de ponto flutuante, caso contrrio o mesmo tipo de dado do argumento

Descrio

variance(expresso)

smallint, integer, bigint, real, double precision ou numeric

double precision para argumentos de ponto flutuante, caso contrrio numeric.

varincia da amostra dos valores de entrada (quadrado do desvio padro da amostra)

Deve ser observado que, com exceo do count, estas funes retornam o valor nulo quando nenhuma linha for selecionada. 10. Autenticao de Usurios (arquivo pg_hba.conf) Quando um aplicativo cliente se conecta ao servidor de banco de dados especifica o nome de usurio do PostgreSQL a ser usado na conexo, de forma semelhante feita pelo usurio para acessar o sistema operacional Unix. Dentro do ambiente SQL, o nome de usurio do banco de dados determina os privilgios de acesso aos objetos do banco de dados Para obter mais informaes deve ser visto o Captulo 17 da Documentao. Portanto, essencial controlar como os usurios de banco de dados podem se conectar. A autenticao o processo pelo qual o servidor de banco de dados estabelece a identidade do cliente e, por extenso, determina se o aplicativo cliente (ou o usurio executando o aplicativo cliente) tem permisso para se conectar com o nome de usurio que foi informado. O PostgreSQL possui vrios mtodos diferentes para autenticao de clientes. O mtodo utilizado para autenticar uma determinada conexo cliente pode ser selecionado tomando por base o endereo de hospedeiro (do cliente), o banco de dados ou o usurio. Os nomes de usurio do PostgreSQL so logicamente distintos dos nomes de usurio do sistema operacional onde o servidor executa. Se todos os usurios de um determinado servidor de banco de dados tambm possuem conta no sistema operacional do servidor, recomendvel atribuir nomes de usurio do banco de dados correspondendo aos nomes de usurio do sistema operacional. Entretanto, um servidor que aceita conexes remotas pode possuir muitos usurios de banco de dados que no possuem conta no sistema operacional local e, nestes casos, a associao entre os nomes de usurio do banco de dados e os nomes de usurio do sistema operacional no necessria. O arquivo pg_hba.conf A autenticao do cliente controlada pelo arquivo que por tradio se chama pg_hba.conf e armazenado no diretrio de dados do agrupamento de bancos de dados. HBA significa autenticao baseada no hospedeiro (host-based

85
Curso de PostgreSQL 2010

authentication). instalado um arquivo pg_hba.conf padro quando o diretrio de dados inicializado pelo utilitrio initdb. Entretanto, possvel colocar o arquivo de configurao da autenticao em outro local; consulte o parmetro de configurao hba_file. O formato geral do arquivo pg_hba.conf um conjunto de registros, sendo um por linha. As linhas em branco so ignoradas, da mesma forma que qualquer texto aps o caractere de comentrio #. Um registro formado por vrios campos separados por espaos ou tabulaes. Os campos podem conter espaos em branco se o valor do campo estiver entre aspas. Os registros no podem ocupar mais de uma linha. Cada registro especifica um tipo de conexo, uma faixa de endereos de IP de cliente (se for relevante para o tipo de conexo), um nome de banco de dados, um nome de usurio e o mtodo de autenticao a ser utilizado nas conexes que correspondem a estes parmetros. O primeiro registro com o tipo de conexo, endereo do cliente, banco de dados solicitado e nome de usurio que corresponder utilizado para realizar a autenticao. No existe fall-through (procura exaustiva) ou backup: se um registro for escolhido e a autenticao no for bem-sucedida, os prximos registros no sero levados em considerao. Se no houver correspondncia com nenhum registro, ento o acesso negado. Uma vez que os registros de pg_hba.conf so examinados seqencialmente a cada tentativa de conexo, a ordem dos registros possui significado. Normalmente, os primeiros registros possuem parmetros de correspondncia de conexo mais exigentes e mtodos de autenticao menos exigentes, enquanto os ltimos registros possuem parmetros de correspondncia menos exigentes e mtodos de autenticao mais exigentes. Por exemplo, pode-se desejar utilizar a autenticao trust para conexes TCP/IP locais, mas requerer o uso de senha para conexes TCP/IP remotas. Neste caso, o registro especificando a autenticao trust para conexes a partir de 127.0.0.1 deve aparecer antes do registro especificando autenticao por senha para uma faixa mais ampla de endereos de IP de cliente permitidos. O arquivo pg_hba.conf lido durante a inicializao e quando o processo servidor principal ( postmaster) recebe um sinal SIGHUP. Se o arquivo for editado enquanto o sistema estiver ativo, ser necessrio enviar um sinal para o postmaster (utilizando pg_ctl reload ou kill -HUP) para fazer com que o arquivo seja lido novamente. No Exemplo 19-1 so mostrados alguns exemplos de registros do arquivo pg_hba.conf. Para obter detalhes sobre os diferentes mtodos de autenticao deve ser consultada a prxima seo.
Exemplo de registros do arquivo pg_hba.conf

# Permitir qualquer usurio do sistema local se conectar a qualquer banco # de dados sob qualquer nome de usurio utilizando os soquetes do domnio # Unix (o padro para conexes locais). # # TYPE DATABASE USER CIDR-ADDRESS METHOD local all all trust # A mesma coisa utilizando conexes locais TCP/IP retornantes (loopback). # # TYPE DATABASE USER CIDR-ADDRESS METHOD host all all 127.0.0.1/32 trust # O mesmo que o exemplo anterior mas utilizando uma coluna em separado para # mscara de rede. # # TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD host all all 127.0.0.1 255.255.255.255 trust

86
Curso de PostgreSQL 2010

11.Princpios de administrao do banco de dados (backup e restaurao de dados) pg_dump: salva um banco de dados do PostgreSQL em um arquivo de script ou de outro tipo
Sinopse

pg_dump [opo...] [nome_do_banco_de_dados]


Descrio O pg_dump um utilitrio para fazer cpia de segurana de um banco de dados do PostgreSQL. So feitas cpias de segurana consistentes, mesmo que o banco de dados esteja sendo utilizado ao mesmo tempo. O pg_dump no bloqueia os outros usurios que esto acessando o banco de dados (leitura ou escrita). As cpias de segurana podem ser feitas no formato de script, personalizado ou tar. As cpias de segurana no formato de script so arquivos de texto puro, contendo os comandos SQL necessrios para reconstruir o banco de dados no estado em que este se encontrava quando foi salvo. Para restaurar a partir destes scripts, deve ser utilizado o psql. Os arquivos de script podem ser utilizados para reconstruir o banco de dados at em outras mquinas com outras arquiteturas; com algumas modificaes, at mesmo em outros produtos gerenciadores de banco de dados SQL. Os formatos personalizado e tar devem ser utilizados com o pg_restore para reconstruir o banco de dados. Estes formatos permitem que o pg_restore selecione o que ser restaurado, ou mesmo reordene os itens antes de restaurlos, e tambm permitem salvar e restaurar os "objetos grandes", o que no possvel com a cpia de segurana em arquivo de script. Os formatos personalizado e tar foram projetados para serem portveis entre arquiteturas diferentes. Quando usado com o formato personalizado ou tar, e combinado com o pg_restore, o pg_dump fornece um mecanismo flexvel para cpias de segurana e transferncia. O pg_dump pode ser usado para fazer a cpia de segurana de todo o banco de dados e, posteriormente, o pg_restore pode ser usado para examinar a cpia de segurana e/ou selecionar as partes do banco de dados a serem restauradas. O formato de arquivo de sada mais flexvel o "personalizado" (custom, -Fc); permite a seleo e a reordenao de todos os itens da cpia de segurana, e comprimido por padro. O formato tar (-Ft) no comprimido e no permite reordenar os dados ao restaurar, mas por outro lado bastante flexvel; alm disso, pode ser manipulado pelas ferramentas padro do Unix, como o tar. Ao executar o pg_dump a sada deve ser examinada procura de advertncias (escritas na sada de erro padro), com ateno especial s limitaes mostradas abaixo. Opes As seguintes opes de linha de comando controlam o contedo e o formato da sada:

nome_do_banco_de_dados
Especifica o nome do banco de dados a ser salvo. Se no for especificado, ser utilizada a varivel de ambiente PGDATABASE. Caso esta varivel no esteja definida, ser utilizado o nome do usurio especificado para a conexo.

-a --data-only
Salva somente os dados, no salva o esquema (definies dos dados).

87
Curso de PostgreSQL 2010

Esta opo s faz sentido para o formato texto-puro. Para os outros formatos esta opo pode ser especificada ao chamar o pg_restore.

-b --blobs
Inclui os objetos grandes na cpia de segurana. Deve ser selecionado um formato de sada no-texto.

-c --clean
Inclui comandos para remover (DROP) os objetos do banco de dados antes dos comandos para cri-los. Esta opo s faz sentido para o formato texto-puro. Para os outros formatos esta opo pode ser especificada ao chamar o pg_restore.

-C --create
Inicia a sada por comandos para criar o banco de dados e conectar ao banco de dados criado (Com um script assim no importa em qual banco de dados se est conectado antes de executar o script). Esta opo s faz sentido para o formato texto-puro. Para os outros formatos esta opo pode ser especificada ao chamar o pg_restore.

-d --inserts
Salva os dados como comandos INSERT, em vez de COPY. Torna a restaurao muito lenta; sua utilizao principal para fazer cpias de segurana que podem ser carregadas em outros bancos de dados que no o PostgreSQL. Deve ser observado que a restaurao pode falhar inteiramente se a ordem das colunas tiver sido modificada. A opo -D mais segura com relao modificao da ordem das colunas, mas ainda mais lenta.

-D --column-inserts --attribute-inserts
Salva os dados como comandos INSERT explicitando os nomes das colunas (INSERT INTO tabela (coluna, ...) VALUES ...). Torna a restaurao muito lenta; sua utilizao principal para fazer cpias de segurana que podem ser carregadas em outros bancos de dados que no o PostgreSQL.

-f arquivo --file=arquivo
Envia a sada para o arquivo especificado. Se for omitido ser utilizada a sada padro.

-F formato --format=formato 88
Curso de PostgreSQL 2010

Seleciona o formato da sada. O formato pode ser um dos seguintes:

p
Gera um arquivo de script SQL no formato texto-puro (o padro)

t
Gera um arquivo tar adequado para servir de entrada para o pg_restore. A utilizao deste formato de arquivo permite reordenar e/ou excluir objetos do banco de dados ao fazer a restaurao. Tambm possvel limitar os dados a serem recarregados ao fazer a restaurao.

c
Gera um arquivo personalizado adequado para servir de entrada para o pg_restore. Este o formato mais flexvel, porque permite a reordenao da restaurao dos dados, assim como das definies dos objetos. Alm disso, este formato comprimido por padro.

-i --ignore-version
Ignora a diferena de verso entre o pg_dump e o servidor de banco de dados. O pg_dump tratar bancos de dados do PostgreSQL com verses anteriores, mas as verses muito antigas no so mais suportadas (atualmente as anteriores a 7.0). Esta opo deve ser utilizada se for necessrio desconsiderar a verificao de verso (mas se o pg_dump no for bem-sucedido, no diga que no foi avisado).

-n esquema --schema=esquema
Salva apenas o contedo do esquema. Se esta opo no for especificada, todos os esquemas no banco de dados especificado (fora os do sistema) sero salvos. Nota: Neste modo, o pg_dump no tenta salvar os demais objetos de banco de dados que os objetos no esquema selecionado possam depender. Portanto, no existe nenhuma garantia que o resultado de salvar um nico esquema possa, por si prprio, ser bem-sucedido quando restaurado em um banco de dados vazio.

-o --oids
Salva os identificadores de objeto (OIDs) de todas as tabelas como parte dos dados. Esta opo dever ser utilizada se a coluna OID for referenciada por um aplicativo de alguma maneira (por exemplo, em uma restrio de chave estrangeira). Caso contrrio, esta opo no dever ser utilizada.

-O --no-owner
No gera comandos para definir o dono dos objetos correspondendo ao banco de dados original. Por padro, o pg_dump emite os comandos ALTER OWNER ou SET SESSION AUTHORIZATION para definir o dono dos

89
Curso de PostgreSQL 2010

objetos criados no bancos de dados. Estes comandos no sero bem-sucedidos quando o script for executado, a menos que o script seja iniciado por um superusurio (ou o mesmo usurio que possui todos os objetos presentes no script). Para gerar um script que pode ser restaurado por qualquer usurio, mas que tornar este usurio o dono de todos os objetos, deve ser especificada a opo -O. Esta opo s faz sentido para o formato texto-puro. Para os outros formatos esta opo pode ser especificada ao chamar o pg_restore.

-R --no-reconnect
Esta opo est obsoleta, mas ainda aceita para manter compatibilidade com as verses anteriores.

-s --schema-only
Salva somente as definies dos objetos (esquema), no os dados.

-S nome_do_usurio --superuser=nome_do_usurio
Especifica o nome de usurio do superusurio a ser usado para desativar os gatilhos. Somente relevante quando usada a opo --disable-triggers (Geralmente melhor no utilizar esta opo e, em vez disso, executar o script produzido como um superusurio).

-t tabela --table=tabela
Salva somente os dados da tabela. possvel existirem vrias tabelas com o mesmo nome em esquemas diferentes; se este for o caso, todas as tabelas correspondentes sero salvas. Deve ser especificado tanto -schema quanto --table para selecionar apenas uma tabela. Nota: Neste modo, o pg_dump no tenta salvar os demais objetos de banco de dados que a tabela selecionada possa depender. Portanto, no existe nenhuma garantia que o resultado de salvar uma nica tabela possa, por si prprio, ser bem-sucedido quando restaurado em um banco de dados vazio.

-v --verbose
Especifica o modo verboso, fazendo o pg_dump colocar comentrios detalhados sobre os objetos e os tempos de incio/fim no arquivo de cpia de segurana, e mensagens de progresso na sada de erro padro.

-x --no-privileges --no-acl
Impede salvar os privilgios de acessos (comandos GRANT/REVOKE).

-X disable-dollar-quoting --disable-dollar-quoting 90
Curso de PostgreSQL 2010

Esta opo desativa a utilizao do caractere cifro ($) para delimitar o corpo da funo, obrigando delimitar o corpo da funo utilizando a sintaxe para cadeia de caracteres do padro SQL.

-X disable-triggers --disable-triggers
Esta opo somente relevante ao criar um arquivo de cpia de segurana somente de dados. Esta opo faz o pg_dump incluir comandos para desativar, temporariamente, os gatilhos das tabelas de destino enquanto os dados so recarregados. Deve ser utilizada quando existem verificaes de integridade referencial, ou outros gatilhos nas tabelas, que no se deseja que sejam chamados durante a recarga dos dados. Atualmente, os comandos emitidos para a opo --disable-triggers devem ser executados por superusurios. Portanto, tambm deve ser especificado o nome de um superusurio com a opo -S ou, de preferncia, executar, com cuidado, o script produzido como um superusurio. Esta opo s faz sentido para o formato texto-puro. Para os outros formatos esta opo pode ser especificada ao chamar o pg_restore.

-X use-set-session-authorization --use-set-session-authorization
Gera comandos SET SESSION AUTHORIZATION do padro SQL em vez dos comandos OWNER TO para determinar o dono do objeto. Isto torna a cpia de segurana mais compatvel com o padro, mas dependendo da disposio dos objetos na cpia de segurana pode no restaurar de forma apropriada.

-Z 0..9 --compress=0..9
Especifica o nvel de compresso a ser usado nas cpias de segurana com formatos que suportam compresso (atualmente somente o formato personalizado suporta compresso). As seguintes opes de linha de comando controlam os parmetros de conexo com o servidor de banco de dados:

-h hospedeiro --host=hospedeiro
Especifica o nome de hospedeiro da mquina onde o servidor de banco de dados est executando. Se o nome iniciar por barra (/), ser utilizado como o diretrio do soquete do domnio Unix. O padro obter o nome a partir da varivel de ambiente PGHOST, se esta estiver definida, seno tentar uma conexo pelo soquete do domnio Unix.

-p porta --port=porta
Especifica a porta TCP, ou a extenso do arquivo de soquete do domnio Unix local, onde o servidor est atendendo as conexes. O padro obter o valor a partir da varivel de ambiente PGPORT, se esta estiver definida, seno usar o valor padro compilado.

-U nome_do_usurio 91
Curso de PostgreSQL 2010

Conectar como o usurio especificado.

-W
Fora a solicitao da senha, o que deve acontecer automaticamente quando o servidor requer autenticao por senha. Ambiente

PGDATABASE PGHOST PGPORT PGUSER


Parmetros de conexo padro. Diagnsticos O pg_dump executa internamente comandos SELECT. Se acontecerem problemas ao executar o pg_dump, deve-se ter certeza que possvel selecionar as informaes no banco de dados utilizando, por exemplo, o utilitrio psql. Observaes Se o agrupamento de bancos de dados tiver alguma adio local ao banco de dados template1, deve-se ter o cuidado de restaurar a sada do pg_dump em um banco de dados totalmente vazio; seno, podero acontecer erros devido a definies duplicadas dos objetos adicionados. Para criar um banco de dados vazio, sem nenhuma adio local, deve-se faz-lo a partir de template0, e no de template1 como, por exemplo:

CREATE DATABASE foo WITH TEMPLATE template0;

O pg_dump possui algumas poucas limitaes:

Ao salvar uma nica tabela, ou no formato texto-puro, o pg_dump no trata os objetos grandes. Os objetos grandes devem ser salvos juntamente com todo o banco de dados usando um dos formatos de cpia de segurana no-texto. Quando escolhida uma cpia de segurana apenas dos dados e utilizada a opo --disable-triggers, o pg_dump emite comandos para desativar os gatilhos nas tabelas do usurio antes de inserir os dados, e comandos para reativar os gatilhos aps os dados serem inseridos. Se a restaurao for interrompida antes do fim, os catlogos do sistema podero ser deixados em um estado errado.

Os membros de arquivos tar esto limitados a um tamanho inferior a 8 GB (esta limitao inerente ao formato dos arquivos tar). Portanto, este formato no pode ser utilizado se a representao textual de uma tabela exceder este tamanho. O tamanho total do arquivo tar, e dos outros formatos de sada, no possui limitao exceto, talvez, pelo sistema operacional. Os arquivos de cpia de segurana produzidos pelo pg_dump no contm as estatsticas utilizadas pelo otimizador para fazer as decises de planejamento dos comandos. Portanto, aconselhvel executar o ANALYZE aps restaurar de uma cpia de segurana para garantir um bom desempenho.

92
Curso de PostgreSQL 2010

Exemplos Para salvar um banco de dados:

$ pg_dump meu_bd > db.out

Para recarregar este banco de dados:

$ psql -d banco_de_dados -f db.out

Para salvar o banco de dados chamado meu_bd contendo objetos grandes em um arquivo tar:

$ pg_dump -Ft -b meu_bd > db.tar

Para recarregar este banco de dados (com os objetos grandes) em um banco de dados existente chamado novo_bd:

$ pg_restore -d novo_bd db.tar

pg_restore:
Sinopse

restaura um banco de dados do PostgreSQL a partir de um arquivo criado pelo pg_dump.

pg_restore [opo...] [nome_do_arquivo]


Descrio O pg_restore um utilitrio para restaurar um banco de dados do PostgreSQL, a partir de uma cpia de segurana criada pelo pg_dump em um dos formatos no-texto-puro. So submetidos os comandos necessrios para reconstruir o banco de dados no estado em que este se encontrava no momento em que foi salvo. Os arquivos de cpia de segurana tambm permitem ao pg_restore selecionar o que ser restaurado, ou mesmo reordenar os itens antes de serem restaurados. Os arquivos de cpia de segurana so projetados para serem portveis entre arquiteturas diferentes. O pg_restore pode operar de dois modos: Se o nome do banco de dados for especificado, a cpia de segurana ser restaurada diretamente no banco de dados (Os objetos grandes s podem ser restaurados utilizando uma conexo direta com o banco de dados como esta). Seno, ser criado um script (escrito em um arquivo ou na sada padro), contendo os comandos SQL necessrios para reconstruir o banco de dados. A sada em script equivalente ao formato de sada textopuro do pg_dump. Algumas das opes que controlam a sada so, portanto, anlogas s opes do pg_dump. Obviamente, o pg_restore no pode restaurar informaes que no esto presentes no arquivo de cpia de segurana. Por exemplo, se a cpia de segurana for gerada usando a opo "salvar os dados como comandos INSERT", o pg_restore no poder carregar os dados usando comandos COPY.

93
Curso de PostgreSQL 2010

Opes O pg_restore aceita os seguintes argumentos de linha de comando.

nome_do_arquivo
Especifica o local do arquivo de cpia de segurana a ser restaurado. Se no for especificado, ser utilizada a entrada padro.

-a --data-only
Restaura somente os dados, no restaura o esquema (definies dos dados).

-c --clean
Remove (DROP) os objetos do banco de dados antes de cri-los.

-C --create
Cria o banco de dados antes de restaur-lo (Quando esta opo utilizada, o banco de dados especificado na opo -d usado apenas para submeter o comando CREATE DATABASE inicial. Todos os dados so restaurados no banco de dados cujo nome aparece na cpia de segurana).

-d nome_do_banco_de_dados --dbname=nome_do_banco_de_dados
Conecta ao banco de dados nome_do_banco_de_dados e restaura diretamente neste banco de dados.

-e --exit-on-error
Termina se for encontrado um erro ao enviar os comandos SQL para o banco de dados. O padro continuar e mostrar um contador de erros ao trmino da restaurao.

-f arquivo_de_sada --file=arquivo_de_sada
Especifica o arquivo de sada para o script gerado, ou para conter a listagem quando for utilizada com a opo -l. Por padro a sada padro.

-F formato --format=formato
Especifica o formato do arquivo da cpia de segurana. No necessrio especificar o formato, porque o pg_restore determina o formato automaticamente. Se for especificado, poder ser um dos seguintes:

94
Curso de PostgreSQL 2010

t
A cpia de segurana um arquivo tar. Este formato de cpia de segurana permite reordenar e/ou excluir elementos do esquema ao restaurar o banco de dados. Tambm permite limitar quais dados sero recarregados na restaurao.

c
A cpia de segurana est no formato personalizado do pg_dump. Este o formato mais flexvel, porque permite reordenar a carga dos dados e dos elementos do esquema. Alm disso, este formato comprimido por padro.

-i --ignore-version
Ignora a verificao da verso do banco de dados.

-I nome_do_ndice --index=nome_do_ndice
Restaura apenas a definio do ndice especificado.

-l --list
Lista o contedo da cpia de segurana. A sada desta operao pode ser usada com a opo -L para restringir e reordenar os itens a serem restaurados.

-L arquivo_da_listagem --use-list=arquivo_da_listagem
Restaura apenas os elementos presentes no arquivo_da_listagem, e na ordem em que aparecem neste arquivo. As linhas podem ser movidas e, tambm, podem virar comentrio colocando ";" no seu incio (Veja os exemplos abaixo).

-O --no-owner
No gera comandos para definir os donos dos objetos correspondendo aos donos destes objetos no banco de dados de origem. Por padro, o pg_restore executa o comando ALTER OWNER ou SET SESSION AUTHORIZATION para definir os donos dos elementos criados no esquema. Estes comando no so bemsucedidos a menos que a conexo inicial com o banco de dados seja feita por um superusurio (ou o mesmo usurio que possui todos os objetos presentes no script). Usando a opo -O, pode ser utilizado qualquer nome de usurio na conexo inicial, e este usurio ser o dono de todos objetos criados.

-P nome_da_funo(tipo_do_argumento [, ...]) --function=nome_da_funo(tipo_do_argumento [, ...])


Restaura apenas a funo especificada. Tome cuidado para escrever o nome da funo e os argumentos exatamente como estes aparecem na tabela de contedo da cpia de segurana.

95
Curso de PostgreSQL 2010

-R --no-reconnect
Esta opo est obsoleta, mas ainda aceita para manter a compatibilidade com as verses anteriores.

-s --schema-only
Restaura somente o esquema (definies dos dados), no os dados (contedo das tabelas). Os valores das seqncias so reiniciados.

-S nome_de_usurio --superuser=nome_de_usurio
Especifica o nome de usurio do superusurio a ser usado para desativar os gatilhos. Somente relevante quando usada a opo --disable-triggers.

-t tabela --table=tabela
Restaura apenas a definio e/ou dados da tabela especificada.

-T gatilho --trigger=gatilho
Restaura apenas o gatilho especificado.

-v --verbose
Especifica o modo verboso.

-x --no-privileges --no-acl
Impede restaurar os privilgios de acessos (comandos GRANT/REVOKE).

-X use-set-session-authorization --use-set-session-authorization
Gera comandos SET SESSION AUTHORIZATION do padro SQL, em vez dos comandos OWNER TO. Isto torna a cpia de segurana mais compatvel com o padro, mas dependendo da disposio dos objetos na cpia de segurana pode no restaurar de forma apropriada.

-X disable-triggers --disable-triggers
Esta opo relevante apenas quando se restaura somente os dados. Faz com que o pg_restore execute comandos para desativar, temporariamente, os gatilhos das tabelas de destino enquanto os dados so

96
Curso de PostgreSQL 2010

recarregados. Deve ser utilizada quando existem verificaes de integridade referencial, ou outros gatilhos nas tabelas, que no se deseja que sejam chamados durante a recarga dos dados. Atualmente, os comandos emitidos para a opo --disable-triggers devem ser executados por superusurios. Portanto, tambm deve ser especificado o nome de um superusurio com a opo -S ou, de preferncia, executar, com cuidado, o script produzido como um superusurio. O pg_restore tambm aceita os seguintes argumentos de linha de comando para os parmetros de conexo:

-h hospedeiro --host=hospedeiro
Especifica o nome de hospedeiro da mquina onde o servidor de banco de dados est executando. Se o nome iniciar por barra (/), ser utilizado como o diretrio do soquete do domnio Unix. O padro obter o nome a partir da varivel de ambiente PGHOST, se esta estiver definida, seno tentar uma conexo pelo soquete do domnio Unix.

-p porta --port=porta
Especifica a porta TCP, ou a extenso do arquivo de soquete do domnio Unix local, onde o servidor est atendendo as conexes. O padro obter o valor a partir da varivel de ambiente PGPORT, se esta estiver definida, seno usar o valor padro compilado.

-U nome_de_usurio
Conectar como o usurio especificado.

-W
Fora a solicitao da senha, o que deve acontecer automaticamente quando o servidor requer autenticao por senha. Ambiente

PGHOST PGPORT PGUSER


Parmetros de conexo padro. Diagnsticos Quando especificada a conexo direta com o banco de dados usando a opo -d, o pg_restore executa internamente comandos SQL. Se acontecerem problemas ao executar o pg_restore, deve-se ter certeza que possvel selecionar informaes no banco de dados utilizando, por exemplo, o utilitrio psql. Observaes

97
Curso de PostgreSQL 2010

Se o agrupamento de bancos de dados tiver alguma adio local ao banco de dados template1, deve-se ter o cuidado de restaurar a sada do pg_restore em um banco de dados totalmente vazio; seno, podem acontecer erros devido duplicidade de definio dos objetos adicionados. Para criar um banco de dados vazio, sem nenhuma adio local, devese faz-lo partir de template0, e no de template1 como, por exemplo:

CREATE DATABASE foo WITH TEMPLATE template0;

As limitaes do pg_restore esto descritas abaixo.

Ao restaurar os dados em uma tabela pr-existente utilizando a opo --disable-triggers, o pg_restore emite comandos para desativar os gatilhos das tabelas do usurio antes de inserir os dados, e comandos para reativar os gatilhos aps os dados serem inseridos. Se a restaurao for interrompida antes do fim, os catlogos do sistema podero ser deixados em um estado errado. O pg_restore no restaura objetos grandes para uma nica tabela. Se a cpia de segurana contiver objetos grandes, ento todos os objetos grandes sero restaurados.

Consulte tambm a documentao do pg_dump para obter os detalhes de suas limitaes. Uma vez restaurado, aconselhvel executar o comando ANALYZE em todas as tabelas restauradas para que o otimizador possua estatsticas teis. Exemplos Para gerar uma cpia de segurana do banco de dados meu_bd, que contm objetos grandes, em um arquivo tar:

$ pg_dump -Ft -b meu_bd > db.tar

Para restaurar este banco de dados (com os objetos grandes) no banco de dados chamado novo_bd:

$ pg_restore -d novo_bd db.tar

Para reordenar os itens do banco de dados, primeiro necessrio criar um arquivo contendo a tabela de contedo (ndice) da cpia de segurana:

$ pg_restore -l copia_de_seguranca.arquivo > copia_de_seguranca.list

98
Curso de PostgreSQL 2010

12. Referncias Bibliogrficas Date, C J. Introduo a sistemas de banco de dados- Editora Campus; Documentao PostgreSQL 8.0.0 Grupo de Desenvolvimento Global do PostgreSQL; www.postgresql.org.br. COMANDOS DE DDL CREATE DATABASE nome [ [ WITH ] [ OWNER [=] dono_do_banco_de_dados ] [ TEMPLATE [=] modelo ] [ ENCODING [=] codificao ] [ TABLESPACE [=] espao_de_tabelas ] ] ; ALTER DATABASE nome SET parmetro { TO | = } { valor | DEFAULT }; ALTER DATABASE nome RESET parmetro; ALTER DATABASE nome RENAME TO novo_nome; ALTER DATABASE nome OWNER TO novo_dono ; DROP DATABASE nome ; CREATE SCHEMA nome_esquema; ALTER SCHEMA nome_esquema RENAME TO novo_nome; ALTER SCHEMA nome OWNER TO novo_dono; DROP SCHEMA nome_esquema [CASCADE | RESTRICT]; CREATE TABLE nome_da_tabela ( coluna1 tipo_de_dado , coluna2 tipo_de_dado [NOT NULL | NULL] [ DEFAULT valor_padro ] [, CONSTRAINT nome_da_restrio ADD CONSTRAINT regra_da_restrio ] ); ALTER TABLE nome_tabela RENAME TO novo_nome_tabela; ALTER TABLE nome_tabela RENAME COLUMN nome_coluna TO novo_nome_da_coluna; ALTER TABLE nome_tabela ADD COLUMN nome_coluna tipo_dado [restrio_coluna]; ALTER TABLE nome_tabela DROP COLUMN nome_coluna [RESTRICT | CASCADE]; ALTER TABLE nome_tabela ALTER COLUMN nome_coluna TYPE tipo_dado; ALTER TABLE nome_tabela ALTER COLUMN nome_coluna SET DEFAULT valor_padro; ALTER TABLE nome_tabela ALTER COLUMN nome_coluna {SET | DROP} NOT NULL; ALTER TABLE nome_tabela ADD CONSTRAINT pk_nome_restrio PRIMARY KEY (nome_coluna_chave); ALTER TABLE nome_tabela ADD CONSTRAINT unq_nome_restrio UNIQUE (nome_coluna_nica); ALTER TABLE nome_tabela ADD CONSTRAINT chk_nome_restrio CHECK (expresso); ALTER TABLE nome_tabela ADD CONSTRAINT fk_nome_restrio FOREIGN KEY (coluna_da_chave_estrangeira) REFERENCES nome_tabela_referenciada (nome_coluna_chave_primria);

ALTER TABLE nome_tabela DROP CONSTRAINT nome_restrio [RESTRICT | CASCADE]; ALTER TABLE nome_tabela OWNER TO novo_dono; ALTER TABLE nome_tabela SET TABLESPACE nome_espao_de_tabelas;

99
Curso de PostgreSQL 2010

COMANDOS DE DML INSERT INTO nome_tabela ( coluna1, coluna2, coluna3 .... ) VALUES ( valor1, valor2, valor3 .... ); UPDATE [ONLY] nome_tabela SET coluna = novo_valo , coluna2 = novo_valor2 [WHERE condio]; DELETE FROM [ONLY] nome_tabela [WHERE condio];

LISTA DE TIPOS DE DADOS Nome SMALLINT Descrio ou faixa de valores -32.768 a +32.767

INTEGER BIGINT DECIMAL NUMERIC REAL DOUBLE PRECISION SERIAL BIGSERIAL CHARACTER VARYING(N), VARCHAR(N)

-2.147.483.648 a +2.147.483.647 -9.223.372.036.854.775.808 9.223.372.036.854.775.807 sem limite sem limite preciso de 6 dgitos decimais preciso de 15 dgitos decimais 1 a 2.147.483.647 1 a 9.223.372.036.854.775.807 comprimento varivel com limite a

CHARACTER(N), CHAR(N)

comprimento fixo, completado com brancos

TEXT TIMESTAMP INTERVAL DATE TIME CIDR INET MACADDR BOOLEANO

Comprimento no limitado Data e hora Intervalo de tempo Data Hora IPV4 ou IPV6 IPV4 ou IPV6 com mascara Numero MAC TRUE ou FALSE (VERDADEIRO ou FALSO)

100
Curso de PostgreSQL 2010

You might also like