No ar desde 2007! Blog com informações e notícias sobre o banco de dados PostgreSQL, aquele que todos adoramos usar. Trata-se de uma ferramenta livre e de código aberto, mantida por uma comunidade ativa de usuários da qual você é convidado fazer parte. Textos, ideias e outras contribuições podem ser enviadas para Cláudio Bezerra Leopoldino: claudiob_br@yahoo.com.br
quarta-feira, 29 de dezembro de 2010
Uma Leitura Diferente: Teses e Dissertações Sobre PostgreSQL
Sua base de dados possui um acervo de pesquisas que engloba áreas como administração, medicina, psicologia e ciência da computação. Fiz uma busca e encontrei 16 documentos relacionados sobre o Postgres e o número tende a crescer.
Nos textos referentes ao Postgres a qualidade dos textos é relativamente boa e a ferramenta é extendida pela implementação de complementos, explorada como ferramenta de desenvolvimento e comparada com outras ferramentas. Os textos apresentam sugestões de novas pesquisas nas suas considerações finais. RECOMENDO!
quarta-feira, 22 de dezembro de 2010
PgDay 2011 em Cuba: Chamada de Trabalhos
Existem muitas curiosidades sobre a comunidade cubana de Postgres que tornam este evento atraente e peculiar. Por ser um país socialista, as decisões são tomadas por consenso em comitês. A necessidade de adotar tecnologias mais acessíveis fez com que o Postgres nos últimos anos se tornasse um dos bancos de dados mais adotados no país, e o google insights mostra que a terra de Fidel atualmente é o país que mais faz buscas sobre o Postgres no mundo todo (o Brasil está em décimo lugar no mesmo levantamento).
O PgDay cubano é mais formal que o da maioria dos países e tem forte presença estatal. A chamada de trabalhos é bem detalhada, pedindo artigos escritos com rigor para registro nos anais do evento. Os melhores textos para uma edição especial da "Revista Cubana de Ciencias Informáticas".
Os interessados devem se apressar, pois o prazo é bem curto!
quinta-feira, 16 de dezembro de 2010
Tenha os Manuais de Referência do PostgreSQL!
A gráfica britânica "Network Theory LTS" é uma empresa especializada em editoração e impressão de manuais de software livre como Python e CVS e está disponibilizando a documentação do Postgres 9.0.1 na forma de quatro livros. Os preços são relativamente baixos e parte do valor arrecadado vai para a comunidade de desenvolvimento do PostgreSQL (1 dolar por livro).
Abaixo coloco as referências:
- The PostgreSQL 9.0 Reference Manual - Volume 1A - The SQL Language
by The PostgreSQL Global Development Group
ISBN 978-1-906966-04-1, Price $19.95 (£14.95)
-The PostgreSQL 9.0 Reference Manual - Volume 1B - SQL Command Reference
by The PostgreSQL Global Development Group
ISBN 978-1-906966-05-8, Price $19.95 (£14.95)
- The PostgreSQL 9.0 Reference Manual - Volume 2 - Programming Guide
by The PostgreSQL Global Development Group
ISBN 978-1-906966-06-5, Price $19.95 (£14.95)
- The PostgreSQL 9.0 Reference Manual - Volume 3 - Server Administration Guide
by The PostgreSQL Global Development Group
ISBN 978-1-906966-07-2, Price $14.95 (£9.95)
Acesse o site aqui e não se esqueça de avaliar também o custo do frete do material antes de fazer qualquer compra!
segunda-feira, 8 de novembro de 2010
Postgresql 9.1 em pleno desenvolvimento!
Conheça as funcionalidade aqui: http://developer.postgresql.org/pgdocs/postgres/release-9-1-alpha.html
Participe dos testes clicando aqui!
quarta-feira, 6 de outubro de 2010
Catálogo do Postgres: uma imagem vale por mil palavras!
A imagem abaixo sintetiza o catálogo do Postgres em sua versão 8.3, apresentando uma visão geral das relações entre as tabelas de metadados. O diagrama não está compĺeto, por terem sido omitidos alguns dos atributos das relações e faltam visões de sistema como PG_TABLES e PG_LOCKS, mas me parece uma iniciativa pioneira para abrir estas informações para um público maior.
A imagem foi encontrada neste site peruano. Caso alguém conheça mais sobre a origem desta imagem e seu(s) autor(es) ou saiba de outra que englobe mais informação ou versões mais novas do Postgres, não deixe de me avisar!!!
segunda-feira, 4 de outubro de 2010
A Cláusula CASE
A cláusula CASE permite que os valores retornados pelas consultas possam ser modificados caso sejam compatíveis com determinadas expressões de forma relativamente simples:
CASE WHEN condition THEN result
[WHEN ...]
[ELSE result]
END
A cláusula CASE aceita uma condição consiste em uma expressão simples e retorna o valor que consta após a cláusula THEN, caso a condição seja satisfeita. Podem ser utilizados opcionalmente mais de um WHEN no comando e a cláusula ELSE que é disparada quando nenhuma das condições do case seja satisfeita.
Abaixo, os comandos de criação de duas tabelas e a inserção de dados que serão utilizados para os exemplos de sintaxe:
CREATE TABLE VALORES (val INTEGER);
INSERT INTO VALORES VALUES (1);
INSERT INTO VALORES VALUES (2);
CREATE TABLE SIGNOS (val CHAR(1));
INSERT INTO SIGNOS VALUES ('A');
INSERT INTO SIGNOS VALUES ('T');
INSERT INTO SIGNOS VALUES ('G');
INSERT INTO SIGNOS VALUES ('X');
Sintaxe 1: Caso o valor numérico corresponda à condição, retorna uma string explicativa.
SELECT val,
CASE
WHEN val=1 THEN 'Primeiro'
WHEN val=2 THEN 'Segundo'
ELSE 'Não Classificado'
END
FROM VALORES;
val | case
-----+----------
1 | Primeiro
2 | Segundo
(2 registros)
Sintaxe 2: Testa se o valor numérico é par ou ímpar e retorna uma string explicativa.
SELECT val,
CASE
WHEN val%2=1 THEN 'Ímpar'
WHEN val%2=0 THEN 'Par'
END
FROM VALORES;
val | case
-----+-------
1 | Ímpar
2 | Par
(2 registros)
Sintaxe 3: O valor reTesta se o valor numérico é par ou ímpar e retorna uma string explicativa.
SELECT val,
CASE
WHEN val='A' THEN 'Primeiro'
WHEN val='T' THEN 'Segundo'
WHEN val='G' THEN 'Terceiro'
ELSE 'Não Classificado'
END
FROM SIGNOS;
val | case
-----+------------------
A | Primeiro
T | Segundo
G | Terceiro
X | Não Classificado
(4 registros)
Nota: para condições mais complexas e que tomem muito tempo de processamento, pode ser criada uma função armazenada, que realiza as verificações de um case.
segunda-feira, 20 de setembro de 2010
Habemus Postgresql 9.0!!!
Boa oportunidade para quem deseja estudar banco de dados e para quem já trabalha com a ferramenta de fazer uma atualização no servidor!
Abaixo, coloco o texto do lançamento, toscamente traduzido do inglês:
O PostgreSQL 9.0 chegou! O Grupo de Desenvolvimento Global do ostgreSQLanuncia a disponibilidade do nosso lançamento mais aguardado.
PostgreSQL 9.0 inclui replicação binária "built-in" e mais de uma dúziaoutras características importantes voltadas a todos os desenvolvedores, de web hackers a administradores de banco de dados.
A versão 9.0 inclui funcionalidades mais importantes do que qualquer liberação antes dela, incluindo:* Hot standby* Streaming Replication* Atualizações In-Place* Versões para Windows 64-bit * Fácil gerenciamento de permissões em massa* Blocos anônimos de código e nomeação de chamadas de parâmetros para procedimentos armazenados
* Novas "Window Functions" e ordenação de agregados
... e muito mais alterações. Para mais detalhes sobre as mais de 200 adições emelhorias nesta versão, desenvolvida por mais de uma centena de colaboradores, consulte as notas de lançamento.
segunda-feira, 30 de agosto de 2010
PostgreSQL Beta 4 Lançado!
Coloque o PostgreSQL no seu Navegador!
Esse é uma dica para quem gosta de personalizar o seu computador com temas e papéis de parede.
O Personas é um complemento do navegador Firefox que permite a fácil instalação de temas. Também é possível criar a sua própria skin para o firefox, de uma forma relativamente fácil, embora demore alguns dias para a mesma passar pelo processo de aprovação. É uma oportunidade para exercer toda a sua criatividade e personalizar sua máquina!
Existem temas sobre filmes, personagens de anime, artistas e sobre softwares e é muito fácil escolher e aplicar novas opções sem afetar o desempenho do navegador. O linux, por exemplo, tem dezenas de opções!
Até a semana passada, não havia nenhum sobre o Postgres e criei o primeiro, penando muito no uso do Gimp: "PostgreSQL Simple", que aparece na imagem que ilustra este post. Espero que apareçam em breve outras opções mais criativas :)
Problemas:
- Preferível para o Firefor 3.6.* em diante, não estando disponível para outros navegadores como IE.
quarta-feira, 14 de julho de 2010
Boa Apostila de Introdução ao Postgres
Não consegui maiores informações sobre a autora, Vanessa Rocha Solgate.
Você sabe de alguma outra apostila que possa ser referenciada?
Atualização: Fecharam o acesso à apostila. :(
Tentativas de acesso geram a mensagem: "You don't have permission to access /gs/treinamento/graduacao/apostilaPostgre.pdf on this server.".
Colocarei em breve mais links para outros materiais que não sejam privados à medida em que for descobrindo.
quarta-feira, 7 de julho de 2010
PostgreSQL Feature Matrix!
Atualmente a matriz de funcionalidades oficial do postgres apresenta as mudanças originadas nas versões 7.48 até 9.0, beta 2.
segunda-feira, 31 de maio de 2010
PostgreSQL 9.0: Quais são as novidades? A visão das "funcionalidades da semana" - Parte 2!
O PostgreSQL está em sua quarta versão alfa, e começam a aparecer indicações das novas funcionalidades e alterações que foram introduzidas. O informe semanal "PostgreSQL Weekly News", organizado por David Fetter apresenta uma seção chamada "Feature of the Week", ou funcionalidade da semana, descrevendo uma alteração em desenvolvimento. Os informes originais podem ser consultados aqui.
Abaixo listo as últimas funcionalidades citadas, agregando algum comentário quando pertinente:
31/05/2010 - Esta semana não teve "funcionalidade da semana". Nas colunas anteriores a coluna era escrita por David Fetter e Devrim GUNDUZ, mas o segundo não participou da coluna desta semana. Pode ser que a feature of the week volte, ou não...
23/05/2010 - Objetos grandes (lo_ *) agora possuem controles de acesso, como os demais objetos do banco de dados. É mais um fator positivo para a utilização de LOBs em geral.
16/05/2010 - O utilitário pg_ctl agora tem uma opçao initdb. Esta opção inicializa um servidor postgres. Mais informações aqui.
09/05/2010 - Você pode criar triggers por coluna, ou seja, que são disparads somente na modificação das colunas especificadas. Recurso utilíssimo!!!
A sintaxe, como descrita no SQL: 2008, é: CREATE TRIGGER trigger_name (BEFORE | AFTER) UPDATE OF col1 [,] ... ON col2 coln tablename FOR EACH ROW trigger_function PROCESSO EXECUTE ();
02/05/2010 - Agora você pode chamar funções com parâmetros nomeados, por exemplo, parameter_bar foo ('valor' AS parameter_foo, o valor 'outro' AS).
Recurso muito prático se você lembra o nome dos os parâmetros, mas não a ordem em que estão na declaração da função.
25/04/2010 - Funções podem agora ter valores padrão para parâmetros. Ótima e simples idéia!!!
18/04/2010 - GUCs agora são reguláveis por função e por banco de dados.
Você sabe o que é GUC? Global User Configuration (GUC) são configurações de servidor do arquivo postgresql.conf. Poder definir parâmetros de servidor para cada função é ter mais flexibilidade. Mas a forma como isso será implementado não parece clara ainda.
11/04/2010 - "You can now GRANT and REVOKE on objects schema-wide in a single command".
Mais recursos para configurar permissões de acesso, desta vez afetando todo o esquema do banco com apenas um comando. Faltam mais detalhes.
04/04/2010 - Existe agora um comando chamado ALTER DEFAULT PRIVILEGES, o qual permite o ajuste de privilégios que serão aplicados a objetos a serem criados no futuro.
É uma opção boa para préconfigurar os objetos do banco de dados utilzando grant e revoke para tabelas, sequências e funções.
01/04/2010 - "Distributed map-reduce functions in Erlang". Desconsiderem todo anúncio da equipe do Postgres feito no primeiro de abril!!!
sexta-feira, 28 de maio de 2010
terça-feira, 20 de abril de 2010
Erros de "Permission Denied na Criação de Tablespaces"
Tablespaces permitem um maior controle sobre a localização física dos dados, metadados, índices e estatísticas do banco. Informações sobre criação de tables paces podem ser obtidas aqui. O postgresql utiliza o sistema de arquivos fornecido pelo sistema operacional, o que muitas vezes gera problemas de autorização de acesso que impedem a sua criação, o clássico erro "permission denied".
Neste post vamos mostrar como definir corretamente as permissões para criação de tablespaces em ambiente windows.
Passo 1: Criar pasta do tablespace.
Crie uma pasta sem arquivos dentro para a definição do novo tablespace.
Passo 2: Abrir tela de configuração
Entre no Windows Explorer e acione o menu "Ferramentas/ Opções de Pasta...".
O sistema apresentará uma tela com as opções de pasta.
Desmarque a opção "Usar Compartilhamento Simples de Arquivo (Recomendado)" e confirme a operação. Isso habilitará a aba de segurança das pastas, que serrá utilizada para definir as permissões para a criação do tablespace.
Passo 3: Configuração da segurança da pasta
Na pasta criada para o tablespace, clique com o botão direito e acione o menu “Propriedades”.
Em seguida, clique na aba segurança.
Na tela apresentada, clique em “Adicionar”. Aparecerá uma tela como a que aparece abaixo. Defina o local (no botão "Locais") e, no nome do objeto, coloque o usuário do banco que vai ter acesso ao tablespace. Confirme com o botão “OK”.
Na aba de segurança aparecerá o novo usuário. Marque a opção de “Controle Total”, o que fará com que o banco de dados possa efetivamente acessar o tablespace.
Passo 4: Criação do tablespace.
Utilize para isso o comando CREATE TABLESPACE.
Este post teve contribuição de Jeferson Gallina.
segunda-feira, 8 de março de 2010
PostgreSQL 9.0: Quais são as novidades? A visão das "funcionalidades da semana" - Parte 1!!!
O PostgreSQL está em sua quarta versão alfa, e começam a aparecer indicações das novas funcionalidades e alterações que foram introduzidas. O informe semanal "PostgreSQL Weekly News", organizado por David Fetter apresenta uma seção chamada "Feature of the Week", ou funcionalidade da semana, descrevendo uma alteração em desenvolvimento. Os informes originais podem ser consultados aqui.
Abaixo listo as últimas funcionalidades citadas, agregando algum comentário quando pertinente:
28/03/2010 - Implementação do conceito de blocos anônimos de código (anonymous code blocks) através do comando DO nas linguagens PL/pgsql, PL/Perl, e PL/LOLCODE.
Estes blocos compreendem comandos que podem ser executados em um bloco de código sem um nome, utilizando as poderosas linguagens procedurais do PostgreSQL. Desta forma podem ser executados blocos de código sem que se precise criar funções dentro do banco. Parece uma ótima forma de se criar scripts.
O exemplo abaixo eu peguei aqui:
DO $$DECLARE r record;
BEGIN
FOR r IN SELECT table_schema, table_name FROM information_schema.tables
WHERE table_type = 'VIEW' AND table_schema = 'public'
LOOP
EXECUTE 'GRANT ALL ON ' || quote_ident(r.table_schema) || '.' || quote_ident(r.table_name) || ' TO webuser';
END LOOP;
END$$;
21/03/2010 - Campos do tipo Hstore não tem mais o limite de 64kB para o limite de chaves e suportam árvore B e classes de operadores hash, permitindo GROUP BY, DISTINCT, etc.
Obs: Você sabe por acaso o que é HSTORE? Eu também não sabia, mas é um módulo que implementa um tipo de dados chamado HSTORE que agrega ao mesmo tempo uma chave e um valor, ambos strings. Este novo tipo de dado é útil para uma série de cenários. Mais informações podem ser obtidas aqui.
14/03/2010 - Em PL/pgsql, o comando MOVE agora funciona de forma compreensível com Cursores.
Obs: Não deu para entender o problema que havia antes, mas este comando reposiciona o cursor sem recuperar dados (NEXT, PRIOR, FIRST, LAST, ABSOLUTE count, RELATIVE count, FORWARD, ou BACKWARD).
07/03/2010 - A saída do EXPLAIN pode ser formatada como XML, JSON, YAML e o mecanismo de análise está muito mais simples. O formato tradicional de texto ainda é o formato padrão.
Obs: Os novos formatos permitem a definição de relatórios e ferramentas de análise dos resultados do comando Explain, facilitando a otimização de consultas.
28/02/2010 - A suíte pgbench agora é multi-threaded, o que lhe permite tirar partido de múltiplos núcleos de CPU.
Obs: O pgbench é um utilitário que faz o benchmark de desempenho do servidor. Pode ser utilizada para testes de estresse, carga e performance. O uso de múltiplas threads faz com que os resultados sejam mais confiáveis e obtidos em menor tempo.
21/02/2010 - Agora você pode controlar o comportamento de valores distintos para cada coluna com ALTER TABLE ALTER COLUMN ... ... SET (parâmetro = valor ,...) onde parâmetro pode ser uma das n_distinct e n_distinct_inherited. Valores positivos são assumidos como sendo o número de valores distintos aceitos, 0 diz que o planejador da consulta deve utilizar os resultados do comando ANALYZE, e os números negativos (que devem estar entre -1 e 0) fazem com que o planejador estime o número de valores distintos como o número de linhas multiplicado pelo valor absoluto do número.
Obs: Funcionalidade de performance, para consultas específicas.
14/02/2010 - Violações de restrição de unicidade de valor agora geram mensagens de erro mais detalhadas.
Obs: Agora fica mais fácil encontrar a causa de exceções de valores repetidos e como resolvê-las.
31/01/2010 - A checagem de constraints de não repetição de valores pode agora ser adiada até a hora do commit.
Obs: Funcionalidade de performance, para consultas específicas.
24/01/2010 - A sintaxe DROP IF EXISTS agora trabalha em colunas e restrições.
Obs: Sintaxe interessante para os desenvolvedores de ferramentas de banco de dados.
17/01/2010 - O Vacuum full foi alterado para gerar novos arquivos para tabelas e índices por padrão. Esta implementação é baseada no antigo comando CLUSTER e mais eficiente e efetiva. A funcionalidade antiga do VACUUM FULL ainda pode ser acessada através do comando VACUUM FULL INPLACE, mas será incompatível com o Hot Standby.
Obs: O Vacuum Full Implace só parece ser vantajoso para sistemas com pouco espaço em disco. A nova Implementação promete ganho de tempo nas manutenções de banco.
10/01/2010 - Agora você pode armazenar em log o estado de consultas SQL, erros, etc, usando "%e" na sua log_line_prefix.
03/01/2010 - No psql o uso de "\d" agora mostra quantas tabelas herdadas uma tabela-mãe tem, e "\d+" lista os nomes das tabelas herdadas.
Obs: Alteração de pouco impacto para quem não utiliza recursos objeto-relacionais.
27/12/2009 - Hot Standby. Após 1,5 anos de desenvolvimento, você pode finalmente executar consultas somente leitura PITR contra os escravos. Graças ao Simon Riggs, Heikki Linnakangas, qualquer muitos outros esforços incessantes.
Obs: O melhor uso de hardware promete ganho de desempenho e redução de custos para grandes sistemas escaláveis e resistentes a falhas. Esta é uma das funcionalidaes que merecerá bastante atenção dos DBAs.
20/12/2009 - Cláusulas WHEN sobre Triggers. Na versão 8.5 Alpha3 você será capaz de criar triggers com uma cláusula WHEN para que as mesmas executem apenas se os valores ou condições específicas ocorrerem. Graças Itagaki Takahiro e a equipe da NTT.
Obs: Esta alteração permite triggers mais específicas com menos validações internas, possivelmente impactando positivamente seu desempenho.
13/12/2009 - Constraints de exclusão (por Jeff Davis) permitem que você especifique como únicos "dados" que abranjam um intervalo, como uma área geométrica, um período de tempo, ou um array.
Obs: Função importante para quem trabalha com lógicas de negócios no banco de dados.
Abaixo, a redação oficial da coluna:
07/03/2010 - EXPLAIN output can be formatted as XML, JSON, and YAML, making machine parsing much simpler. The traditional text format is still the default format.
28/02/2010 - The pgbench suite is now multi-threaded, allowing you to take advantage of multiple CPU cores.
21/02/2010 - You can now control the behavior of distinct values per column using ALTER TABLE...ALTER COLUMN...SET (parameter=value,...) where parameter can be one of n_distinct and n_distinct_inherited. Positive numbers are assumed to be the number of distinct values, 0 tells the planner to use the results from ANALYZE, and negative numbers (which should be between -1 and 0, cause the planner to estimate the number of distinct values as the estimated number of rows multiplied by the absolute value of the number.
14/02/2010 - Uniqueness violations now raise more detailed error messages.
31/01/2010 - Uniqueness constraints can now be deferred until commit time.
24/01/2010 - The DROP IF EXISTS syntax now works on columns and constraints.
17/01/2010 - VACUUM FULL has been changed to now generate all-new files for the vacuumed table and indexes. This is based on the old CLUSTER command, and is both more efficient and more effective. The old functionality of VACUUM FULL can still be accessed via VACUUM FULL INPLACE, but will be incompatible with Hot Standby.
10/01/2010 - You can now log SQL state for queries, errors, etc., using %e in your log_line_prefix.
03/01/2010 - In psql, \d now shows how many inherited tables a parent has, and \d+ lists them.
27/12/2009 - Hot Standby. After 1.5 years of development, you can at last run read-only queries against PITR slaves. Thanks to Simon Riggs, Heikki Linnakangas, any many others for unceasing efforts.
20/12/2009 - WHEN clauses on Triggers. In 8.5Alpha3, you will be able to create triggers with a WHEN clause so that they will only execute if specific values or conditions occur. Thanks Itagaki Takahiro and the NTT team.
13/12/2009 - Exclusion Constraints (by Jeff Davis) allow you to specify as "unique" data which covers a range, such as a geometric area, a period of time, or an array.
O que acharam destas novas funcionalidades?
Elas impactarão o seu trabalho atual?
quinta-feira, 4 de março de 2010
Acompanhe o Status do Servidor no PgAdmin III
segunda-feira, 1 de março de 2010
DreamCoder for PostgreSQL: Ferramenta Visual
As opções abertas contribuem para reduzir este problema, mas ainda apresentam deficiências e lacunas de importantes funcionalidades que restringem sua utilização e difusão. Ao mesmo tempo, versões freeware de softwares comerciais podem ser úteis em virtude de suas funcionalidades, apesar de não terem seu código disponibilizado.
O DreamCoder for PostgreSQL é uma opção freeware que promete facilitar o trabalho com este banco de dados uma rápida análise da ferramenta mostrou pontos fortes e deficiências importantes. O software pode ser baixado aqui.
Abaixo, uma tela com a interface da ferramenta.
O editor de plpgsql apresenta bons recursos de formatação que promovem a produtividade.
Vide imagem abaixo.
Pontos Fortes:
- Versão Freeware (a Enterprise pode ser baixada com )
- Atualização Recente (02 de 2010)
- Bom editor de Pl/ PgSQL
- Bons recursos visuais para visualização e navegação nos objetos do banco, mostrando propriedades e dependências.
- Configuração de autosubstituição de caracteres.
Pontos Fracos:
- Não apresenta funções de engenharia reversa e importação.
- Não apresenta assistentes para a criação de tabelas, índices e outros objetos do banco, que devem ser manuseados via DDL, função básica em qualquer ferramenta visual de desenvolvimento.
- Ausência de versão para Linux
- Falta de recursos mais avançados, restritos à versão entreprise.
Resultado geral:
É uma ferramenta boa para os usuários da plataforma Windows que utilizem muito código Pl/ PgSQL. As futuras versões podem trazer avanços mais significativos. Só deve ser utilizada após testes criteriosos. A versão entreprise não foi avaliada neste post.
Versão Alfa do PostgreSQL 9.0 Lançada!
sexta-feira, 19 de fevereiro de 2010
Select - Cláusulas FOR UPDATE, FOR SHARE e NOWAIT
A existência de bloqueios sobre os dados acessados durante o acesso concorrente não pode ser ignorada em sistemas com grande número de transações concorrentes mesmo no Postgres que utiliza o protocolo de bloqueios multiversão (MVCC - MultiVersion Concurrency Control).
O PostgreSQL oferece algumas cláusulas relativamente simples que permitem este tipo de controle no caso de consultas no banco de dados: FOR UPDATE, FOR SHARE e NOWAIT.
O uso de consultas com a cláusula FOR UPDATE obriga o servidor a bloquear os registros consultados para leitura e escrita durante o transcorrer da transação. Desta forma se garante que o que está sendo visualizado corresponde ao que está armazenado no banco de dados.
Por sua vez, a cláusula FOR SHARE efetua bloqueio de escrita, mas permite que leituras sejam feitas aos dados consultados.
Em resumo, a cláusula FOR UPDATE restringe os acessos aos dados consultados, enquanto que a FOR SHARE explicitamente autoriza acessos de leitura aos dados consultados. O tipo de transação é que determina se e quando utilizar estas cláusulas.
É importante salientar que ambas as cláusulas se referem apenas os dados que são recuperados na consulta.
Adicionalmente, a cláusula NOWAIT pode ser utilizada tanto com FOR UPDATE quanto com FOR SHARE, e força a ocorrência de erro caso o servidor tenha de esperar para a obtenção de bloqueios nos dados consultados. Desta forma, sacrifica-se a transação para que não se perca tempo na fila de espera por bloqueios.
As cláusulas UNION, INTERSECT e EXCEPT até o momento não são compatíveis com FOR UPDATE e FOR SHARE.
Para os próximos exemplo, serão utilizadas as seguintes tabelas:
CREATE TABLE pai (codpai integer,nomepai varchar(50));
CREATE TABLE filho (codpai integer,codfilho integer,nomefilho varchar(50));
Exemplos:
1 - Sintaxe simples com FOR UPDATE.
SELECT * FROM pai FOR UPDATE;
2 - Sintaxe simples com FOR SHARE.
EXPLAIN SELECT * FROM pai FOR SHARE;
3 - Uso de FOR SHARE em consulta com junção.
SELECT *
FROM pai p, filho f
WHERE p.codpai = f.codpai
FOR SHARE;
4 - Uso de NOWAIT.
SELECT * FROM pai FOR UPDATE NOWAIT;
5 - Uso de FOR UPDATE em transação de atualização.
BEGIN;
SELECT * FROM pai FOR UPDATE;
UPDATE pai SET nomepai = nomepai ' Father';
COMMIT;
quarta-feira, 27 de janeiro de 2010
Algoritmos: Caixa de Banco Simulado no PostgreSQL
Abaixo coloco uma função que recebe uma solicitação de dinheiro e calcula quantas notas de 100, 50, 10, 5 e 1 serão retornadas ao solicitante:
--Retornando notas do caixa eletrônico
--Notas de 1, 5, 10, 50 e 100
CREATE OR REPLACE FUNCTION caixa_elet (pvalor integer) RETURNS text AS $$
DECLARE
sretorno text;
qnota1 integer;
qnota5 integer;
qnota10 integer;
qnota50 integer;
qnota100 integer;
BEGIN
sretorno := '';
qnota100 := (pvalor - (pvalor % 100))/100;
qnota50 := ((pvalor % 100) - (pvalor % 50)) /50;
qnota10 := ((pvalor % 50) - (pvalor % 10)) /10;
qnota5 := ((pvalor % 10) - (pvalor % 5)) /5;
qnota1 := ((pvalor % 5) - (pvalor % 1)) /1;
sretorno := 'Total: ' || pvalor || chr(10) || 'Notas de 100:' || qnota100 || chr(10) || 'Notas de 50:' || qnota50 || chr(10) || 'Notas de 10:' || qnota10 || chr(10) || 'Notas de 5:' || qnota5 || chr(10) || 'Notas de 1:' || qnota1;
RETURN sretorno; -- Retorna as linhas
END;
$$ LANGUAGE plpgsql;
Chamada da função e resultado apresentado:
SELECT caixa_elet(1078);
"Total: 1078
Notas de 100:10
Notas de 50:1
Notas de 10:2
Notas de 5:1
Notas de 1:3"
SELECT caixa_elet(2189);
"Total: 2189
Notas de 100:21
Notas de 50:1
Notas de 10:3
Notas de 5:1
Notas de 1:4"
Agora, gostaria de fazer algumas perguntas para os programadores de plantão:
- O código da função caixa_elet está correto?
- O código da função caixa_elet pode ser melhorado de que formas?
- Que alterações seriam necessárias para acrescentar notas de 20?
Aguardo suas contribuições nos comentários!
quinta-feira, 21 de janeiro de 2010
8.5 sai de cena antes de ser lançado: nova versão do Postgres será a 9.0!
As razões envolvendo a mudança compreendem o aumento das funcionalidades da nova versão e da abrangência das alterações no código, o grande tempo desde a primeira versão 8.* e um benefício em termos de marketing, pela insinuação de uma mudança mais substancial refletida na alteração de 8.4 para 9.0.
Você concorda com essa atitude?
terça-feira, 5 de janeiro de 2010
PostgreSQL e JDBC: Ótimo exemplo de código!
O link abaixo apresenta um ótimo exemplo introdutório de código java para acesso ao Postgres via JDBC. Confira aqui.