<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tudo sobre PostgreSQL  e Software Livre - PostgreSQL Center &#187; Dúvidas frequentes</title>
	<atom:link href="http://postgrecenter.pgopen.com.br/categorias/feed/" rel="self" type="application/rss+xml" />
	<link>http://postgrecenter.pgopen.com.br</link>
	<description>Tudo sobre o Banco de Dados Open Source mais avançado do mundo</description>
	<lastBuildDate>Wed, 03 Mar 2010 15:07:40 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Aplicando Rules, Functions e Triggers no PostgreSQL</title>
		<link>http://postgrecenter.pgopen.com.br/aplicando-rules-functions-e-triggers-no-postgresql/</link>
		<comments>http://postgrecenter.pgopen.com.br/aplicando-rules-functions-e-triggers-no-postgresql/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 19:19:23 +0000</pubDate>
		<dc:creator>ravi</dc:creator>
				<category><![CDATA[Dúvidas frequentes]]></category>

		<guid isPermaLink="false">http://softwarelivre.pgopen.com.br/?p=111</guid>
		<description><![CDATA[Quando temos um sistema comercial, independentemente do que ele faça sempre nos vem uma palavra à cabeça: “desempenho”.]]></description>
			<content:encoded><![CDATA[<p>Quando temos um sistema comercial, independentemente do que ele faça sempre nos vem uma palavra à cabeça: “desempenho”. Imagine um sistema que é distribuído em muitas estações através de VPN ou TS, em um horário critico, o quanto de tempo poderia levar para inserir ou apagar um simples registro em uma tabela.</p>
<p style="margin-bottom: 0cm;">Como garantir a integridade dos dados em nossa base e ao mesmo tempo deixar o banco rápido, sem precisar colocar no sistema inúmeras verificações para validar os dados? Fácil, podemos utilizar alguns dos recursos que o banco de dados nos oferece como os que vou mostrar durante este artigo.</p>
<p style="margin-bottom: 0cm;">Neste artigo, vou falar um pouco sobre rule, trigger e function e o quanto eles podem ajudar no sentido de manter um bom desempenho e a integridade dos dados, inclusive deixando o código fonte do sistema menor e de fácil manutenção.</p>
<h3>Para o exemplo</h3>
<p style="margin-bottom: 0cm;">Para este artigo vamos imaginar a seguinte situação: uma empresa que trabalha com entrega de correspondência e produtos, uma espécie de “door to door”. Essa empresa usa um sistema de leitura para manter o controle da correspondência até seu destino final.</p>
<p style="margin-bottom: 0cm;">Exemplo: Um produto sai da filial de São Paulo, com destino ao Espírito Santo, só que antes de ir para ES, ele passa pelo Rio de Janeiro. Ou seja, o produto antes de chegar ao seu destino final vai ser registrado três vezes como mostram a <strong>figura 1.</strong></p>
<p style="margin-bottom: 0cm;"><strong><img src="http://postgrecenter.pgopen.com.br/wp-content/uploads/2009/06/imagem01.png" alt="imagem01" width="600" height="400" /></strong></p>
<p style="margin-top: 0.14cm; widows: 2; orphans: 2;" lang="pt-BR"><span style="color: #000000;"><span style="font-family: Arial Narrow,sans-serif;"><span style="font-size: x-small;"><strong>Figura 1</strong>. Diagrama do processo de leitura de correspondência.</span></span></span></p>
<p style="margin-bottom: 0cm;">
<p style="margin-bottom: 0cm;">Imagine também que em cada passagem do produto, é tirado um relatório de romaneio, que é entregue ao motorista que leva o produto para seu destino final. Esse relatório de romaneio é tirado a partir de um número de lote que o próprio sistema gera.</p>
<p style="margin-bottom: 0cm;">A partir dessas informações, será criado uma espécie de “rastreamento” desse produto. Para fazer isto, imagine duas tabelas, uma tabela principal, onde vai ser registrada a primeira passagem do produto, e uma tabela de passagens, onde entrarão as demais passagens até o seu destino final.</p>
<p style="margin-bottom: 0cm;">Agora vem a questão: Como fazer para saber quando é a primeira passagem do produto e quando são as demais?</p>
<p style="margin-bottom: 0cm;">Para esta pergunta existem duas sugestões:</p>
<p style="margin-bottom: 0cm;">1. Colocar comandos SQL dentro do sistema, checando se o produto existe ou não na tabela principal. Se existir, gravar na tabela de passagem, se não existir, gravar na tabela principal e depois na de passagem (Optei por gravar a primeira passagem na tabela de passagens também, pois ai deixa minha tabela principal somente para gerar os relatórios de romaneios).</p>
<p style="margin-bottom: 0cm;">2. Criar regras no banco de dados para verificar se o produto existe ou não, e na própria regra fazer com que os dados sejam distribuídos nas tabelas.</p>
<p style="margin-bottom: 0cm;">
<p style="margin-bottom: 0cm;">Entre as duas sugestões, pela lógica, vamos optar pela segunda, pois assim vai haver um desempenho maior tanto no banco de dados como no sistema. E futuramente, mudando a plataforma do sistema, não vai ser preciso mexer no banco de dados.</p>
<p style="text-align: left;"><strong>Estrutura do banco</strong><br />
O banco de dados possui tabelas de:<br />
LOTE, todos os produtos são lidos a partir de um número de lote.<br />
EMPRESA, a empresa que esta lendo o malote (caso haja mais de uma empresa usando o mesmo sistema).<br />
ORIGEM e DESTINO, ex: 2100 – SP CAPITAL para 2399 – RJ CAPITAL (Uso a mesma tabela para origem e destino).<br />
LEITURA, onde fica registrada a passagem do malote.</p>
<p>Para o exemplo, vou usar esta estrutura, alterando o nome dos campos para nomes mais apropriados.<br />
Para o primeiro tópico, vou falar sobre rule.</p>
<p style="text-align: left;"><strong>Rule</strong><br />
O comando CREATE RULE cria uma regra para ser aplicada a uma tabela ou visão específica. O comando CREATE OR REPLACE RULE cria ou substitui uma regra existente com o mesmo nome para a mesma tabela.<br />
As RULES (regras) permitem executar uma ação alternativa em: inclusão, alteração, exclusão e seleção (somente em caso de visões).<br />
Em outras palavras, uma regra faz com que sejam executados comandos adicionais quando é executado um determinado comando em uma tabela.<br />
As regras são executadas antes do início da execução de um comando. Se em alguma situação você desejar uma operação que dispare um evento de forma independente para cada linha da tabela, estamos falando de um gatilho e não de uma regra.<br />
É importante saber que as regras não fazem parte do SQL padrão, mas são implementadas pelo Postgresql.<br />
Para o exemplo, vou criar duas tabelas, que vou chamar de tb_main e tb_hist. A tb_main será responsável pelo registro da primeira passagem do malote e a tb_hist será responsável pelas demais passagens do malote ate o destino final, como mostra a Listagem 1.</p>
<p style="text-align: left;"><strong>Listagem 1</strong>. Script das tabelas tb_main e tb_hist<br />
CREATE TABLE tb_main (<br />
codtbmain    integer not null,    &#8211; código da tabela<br />
codtblote    integer not null,    &#8211; código do lote<br />
codtbprod    integer not null,    &#8211; código do produto<br />
codorigem    integer not null,    &#8211; código origem do produto<br />
coddestno    integer not null,     &#8211; código do destino do produto<br />
codbarras    varchar (30) not null,&#8211; código de barras<br />
dtatbmain    date,            &#8211; data da entrada</p>
<p>CONSTRAINT codtbmain_pkey PRIMARY KEY (codtbmain) –- chave primaria<br />
);</p>
<p>CREATE TABLE tb_hist (<br />
codtbhist    integer not null,    &#8211; código da tabela<br />
codtblote    integer not null,    &#8211; código do lote<br />
codtbprod    integer not null,     &#8211; código do produto<br />
codorigem     integer not null,    &#8211; código origem do produto<br />
coddestno    integer not null,     &#8211; código do destino do produto<br />
codbarras     varchar (30) not null,&#8211; código de barras<br />
dtatbhist    date,            &#8211; data da passagem do produto<br />
hratbhist     time,            &#8211; hora da passagem</p>
<p>CONSTRAINT codtbhist_pkey PRIMARY KEY (codtbhist) –- chave primaria<br />
);</p>
<p>Para garantir que o produto só seja registrado uma única vez na tabela principal, é necessário criar uma unique na tabela principal (tb_main), que vai ser: código do produto (codtbprod) e o código de barras do produto (codbarras), de acordo com o código abaixo:</p>
<p>CREATE UNIQUE INDEX unqtb_main ON tb_main (codtbprod,codbarras);</p>
<p>Ou seja, o produto só será gravado na tabela principal uma única vez, as demais passagens serão registradas na tabela de histórico.<br />
Agora vem o ponto onde quero chegar: Para não termos que fazer o sistema verificar se o produto já existe ou não na tabela principal, antes de inserirmos o registro (o que causaria perda de desempenho), podemos criar uma regra (RULE) para fazer esta verificação no próprio banco, como mostra Listagem 2.</p>
<p><strong>Listagem 2</strong>. Estrutura da rule rtb_main<br />
CREATE RULE rtb_main AS ON INSERT TO tb_main    WHERE (EXISTS<br />
(SELECT codtbprod, codbarras FROM tb_main<br />
WHERE codtbprod = NEW.codtbprod AND codbarras = NEW.codbarras)<br />
) DO INSTEAD (<br />
INSERT INTO tb_hist (<br />
codtbhist,<br />
codtblote,<br />
codtbprod,<br />
codorigem,<br />
coddestno,<br />
codbarras,<br />
dtatbhist,<br />
hratbhist<br />
) VALUES (<br />
SELECT NEXTVAL(‘sequence’),    &#8211; cahave (pode ser um SEQUENCE)<br />
NEW.codtblote,            &#8211; número do lote<br />
NEW.codtbprod,            &#8211; código do produto<br />
NEW.codorigem,            &#8211; código da origem<br />
NEW.coddestno,            &#8211; código do destino<br />
NEW.codbarras,            &#8211; código de barras<br />
(SELECT CURRENT_DATE),        &#8211; seleciona data do banco<br />
(SELECT CURRENT_TIME)        &#8211; seleciona hora do banco<br />
)<br />
);</p>
<p>Agora, sempre que ocorrer o evento INSERT na tabela principal (tb_main), a RULE rtb_main, vai verificar se o mesmo registro já existe nesta tabela. Se existir, então vai ser executado o bloco de comando INSTEAD, o comando anterior é ignorado (inserir na tabela principal “tb_main”) e então o registro vai para a tabela de histórico (tb_hist). Se não existir, o registro será gravado na tabela principal (tb_main) e também na tabela de histórico (tb_hist), para conseguir ter um controle total do rastreamento do produto.<br />
Quando acionamos funções em PL/pgSQL, para tratamento de dados, algumas variáveis são criadas automaticamente, como é o caso do NEW e do OLD, que veremos a seguir. Essas duas variáveis guardam os parâmetros de comandos SQL ex: INSERT INTO tabela VALUES (parametro1, parametro2&#8230;).</p>
<p>NEW<br />
Usa o tipo de dado RECORD, contem o parâmetro de uma nova linha para o banco de dados, é usado somente em casos de INSERT e UPDATE.</p>
<p>OLD<br />
Também é do tipo RECORD, mas contem o parâmetro de uma linha antiga do banco de dados, e é usada somente em UPDATE e DELETE.</p>
<p>Existem muitas outras variáveis que o Postgresql cria em funções, mas para o exemplo, vou usar apenas NEW e OLD, veja abaixo algumas variáveis.</p>
<p>VARIAVEIS EM POSTGRESQL<br />
TG_WHEN Tipo de dado text; uma cadeia de caracteres contendo BEFORE ou AFTER dependendo da definição do gatilho.</p>
<p>TG_LEVEL Tipo de dado text; uma cadeia de caracteres contendo ROW ou STATEMENT dependendo da definição do gatilho.</p>
<p>TG_OP Tipo de dado text; uma cadeia de caracteres contendo INSERT, UPDATE, ou DELETE informando para qual operação o gatilho foi disparado.</p>
<p>TG_RELID Tipo de dado oid; o ID de objeto da tabela que causou o disparo do gatilho.<br />
TG_NAME Tipo de dado name; variável contendo o nome do gatilho realmente disparado.</p>
<p>Em ambas as tabelas, existe um campo chamado codtblote, que nada mais é do que um número que identifica o lote em que o produto é inserido. Isso é para ter um controle interno (gerar relatórios, pesquisar os produtos que estão em determinado lote, etc.).<br />
Então, já que o numero de um lote será variável (para cada passagem do produto, o sistema vai gerar um numero de lote diferente), vamos criar mais uma regra, que agora vai atualizar o numero do lote codtblote, da tabela principal tb_main.<br />
Pois assim, conseguiremos tirar os relatórios e pesquisas com um ganho maior em desempenho, devido à quantidade menor de registros que vão existir na tabela principal, como mostra a criação da regra na Listagem 3.</p>
<p><strong>Listagem 3</strong>. Estrutura da rule rtb_hist<br />
CREATE RULE rtb_hist AS ON INSERT TO tb_hist<br />
DO UPDATE tb_main SET codtblote = NEW.codtblote<br />
WHERE codtbprod = NEW.codtbprod AND codbarras = NEW.codbarras</p>
<p>Sempre que uma nova linha for inclusa na tabela de histórico, essa RULE vai fazer com que seja atualizado o número do lote (codtblote) na tabela principal (tb_main).<br />
Para finalizar esta parte de RULE, vamos criar uma regra para o evento DELETE, que sempre que por algum motivo, um registro precise ser apagado durante o processo de rastreamento, o registro não saia da tabela principal (tb_main), para não perder sua referencia, mas sim da tabela de histórico.<br />
Para este exemplo, vou usar como parâmetro o lote codtblote, para deletar somente o registro que foi lido naquele lote especifico. (ver Listagem 4).</p>
<p><strong>Listagem 4</strong>. Estrutura da rule rtb_hist no evento ON DELETE.<br />
CREATE RULE rtb_hist AS ON DELETE TO tb_main<br />
DO INSTEAD<br />
(DELETE FROM tb_hist WHERE codtbprod = OLD.codtbprod AND codbarras = OLD.codbarras AND codtblote = OLD.codtblote);</p>
<p>Nesta regra, esta sendo usada a variável OLD, pois estamos usando o evento DELETE. Podemos ler mais sobre essas variáveis na documentação oficial do Postgresql, na seção Links.</p>
<p><strong>TRIGGER</strong><br />
As Triggers (gatilhos) são recursos dos bancos de dados que, executam funções no banco, quando um determinado evento ocorrer na tabela em que a trigger estiver associada. Diferentemente das regras, os gatilhos podem ser acionados antes (before) ou depois (after) de alguma ação de insert, update e delete.<br />
Veja a sintaxe abaixo:</p>
<p>CREATE TRIGGER (nome_trigger) (AFTER ou BEFORE) (ação INSERT, UPDATE ou DELETE)<br />
ON (nome_tabela)FOR EACH ROW EXECUTE PROCEDURE (nome_da_function())</p>
<p>Quando um gatilho esta marcado FOR EACH ROW, o mesmo é chamado uma vez para cada linha que a operação modificar. Por exemplo: imagine que você precise inserir dez registros em uma tabela. Isso vai fazer com que todos os gatilhos ON INSERT sejam chamados dez vezes, uma vez para cada linha.</p>
<p>Se por ventura existir vários gatilhos do mesmo tipo, para o mesmo evento, eles serão disparados em ordem alfabética.</p>
<p>Os gatilhos são muito usados para tratamento de dados ou para efetuar alguma operação em tabelas, por exemplo: imagine que você tenha um sistema, que em uma determinada rotina, para deletar um registro, seja preciso gravar o mesmo em uma tabela de histórico.<br />
Para resolver este problema, basta criar uma função para gravar este registro na tabela de histórico, e criar um gatilho para que sempre que o evento DELETE ocorra nesta tabela, o registro seja gravado no histórico.<br />
Ou por exemplo, você precisa fazer uma validação em certa coluna da tabela para ver se o dado é um integer ou uma string para evitar que o banco gere uma mensagem de erro durante o processo. Para este caso, crie uma função que verifica se o dado é integer ou string e depois criar uma trigger chamando esta função no evento BEFORE INSERT.<br />
Um gatilho é uma espécie de procedimento armazenado (stored procedures), mas não o chamamos como exemplo “SELECT minha_funcao ()”, mas sim sempre que um evento de insert, update e delete ocorrer na tabela.<br />
Como vamos ver no próximo tópico, o que vai distinguir uma function de uma stored procedure, vai ser o tipo de dado que ela vai retornar que especificamos no momento que criamos a function, que no caso vai ser uma trigger.</p>
<p><strong>FUNCTION</strong><br />
O comando CREATE FUNCTION cria uma função e o comando CREATE OR REPLACE FUNCTION, cria ou substitui uma função já existente.<br />
Sempre que uma função é removida e recriada, essa função não será mais a mesma entidade que era antes. Nesse caso, vai ser necessário remover as regras, visões e gatilhos que fazem referência à função antiga. Sempre que por algum motivo, precisarmos modificar uma função, é aconselhável utilizar o comando CREATE OR REPLACE FUNCTION, pois, com isso, apenas a definição da função é modificada, sem invalidar os objetos que fazem referência à mesma.</p>
<p>Devido à grande flexibilidade do Postgresql, ele permite escrever funções em SQL, C ou outra linguagem procedural definida pelo usuário.<br />
Agora vamos imaginar que antes de inserir na tabela principal do exemplo tb_main, temos que checar se o código de barras (codbarras) tem exatas 30 posições e que o número do lote (codtblote) não esta NULL.<br />
Para fazer isto, vou criar uma função que vai fazer esta verificação, e se houver inconsistência nos dados, ela vai retornar com uma mensagem e cancelar a gravação de uma nova linha na tabela “tb_main”, como pode ser visto na Listagem 5.</p>
<p>Listagem 5. Função para verificar código de barras e lote<br />
CREATE OR REPLACE FUNCTION ftb_main() RETURNS trigger<br />
AS<br />
$$<br />
BEGIN<br />
IF length(NEW.codbarras) &lt; 30 THEN<br />
RAISE EXCEPTION ‘CAMPO DEVE TER 30 POSIÇÕES!!’;<br />
END IF;<br />
IF NEW.codtblote IS NULL THEN<br />
RAISE EXCEPTION ‘O LOTE ESTA VAZIO!!’;<br />
END IF;<br />
END;<br />
$$<br />
LANGUAGE ‘plpgsql’;</p>
<p>&#8211; para chamar esta função vou criar um gatilho</p>
<p>CREATE TRIGGER tg_tbmain BEFORE INSERT ON tb_main<br />
FOR EACH ROW EXECUTE PROCEDURE ftb_main();</p>
<p>As funções também podem ser usadas para tratamento de exceções, por exemplo: imagine que por algum motivo, não podemos usar a primeira regra, definida na Listagem 3. Então vamos lembrar que no início do artigo criamos uma unique (Listagem 2) que define o código do produto (codtbprod) e o código de barras (codbarras) como único.<br />
A partir desta unique, vou criar uma função que vai fazer um processo similar ao que nossa primeira regra fazia. A nova função vai “tentar” inserir uma nova linha na tabela principal, mas se essa nova linha tiver o mesmo código de produto e código de barras, o Postgresql vai gerar uma exceção de unique e vai interromper a ação.<br />
Com o tratamento de erros vou conseguir “pegar” este erro gerado pelo Postgresql e gerar uma ação do tipo INSTEAD similar ao da regra, de acordo com a Listagem 6.</p>
<p><strong>Listagem 6</strong>. Tratamento de exceção usando uma função<br />
CREATE OR REPLACE FUNCTION func_tbmain(integer,integer,integer,integer,varchar(30)) RETURNS text<br />
AS<br />
$$<br />
DECLARE<br />
codlote ALIAS FOR $1;<br />
codprod ALIAS FOR $2;<br />
codorig ALIAS FOR $3;<br />
coddstn ALIAS FOR $4;<br />
codbras ALIAS FOR $5;<br />
BEGIN<br />
INSERT INTO tb_main (codtbmain,codtblote,codtbprod,codorigem,<br />
coddestno,codbarras,dtatbmain)<br />
VALUES ((SELECTSEXTVAL(&#8217;sequencial&#8217;)),codlote,codprod,<br />
codorig,coddstn,codbras,(SELECT CURRENT_DATE));</p>
<p>INSERT INTO tb_hist (codtbhist,codtblote,codtbprod,codorigem,<br />
coddestno,codbarras,dtatbhist,hratbhist)<br />
VALUES ((SELECT NEXTVAL(&#8217;seqtb000&#8242;)),codlote,codprod,<br />
codorig,coddstn,codbras,(SELECT CURRENT_DATE),(SELECT CURRENT_TIME));</p>
<p>RETURN codbras;</p>
<p>EXCEPTION<br />
WHEN unique_violation THEN<br />
INSERT INTO tb_hist (codtbhist,codtblote,codtbprod,codorigem,<br />
coddestno,codbarras,dtatbhist,hratbhist)<br />
VALUES ((SELECT NEXTVAL(&#8217;sequencial&#8217;)),codlote,codprod,<br />
codorig,coddstn,codbras,(SELECT CURRENT_DATE),(SELECT CURRENT_TIME));</p>
<p>UPDATE tb_main SET codtblote = codlote WHERE codtbprod = codprod AND codbarras =    codbras;<br />
RETURN codbras;<br />
END;<br />
$$<br />
LANGUAGE &#8216;plpgsql&#8217;;</p>
<p>&#8211; para chamar esta função, vou usar o SELECT nome(passando os parametros)</p>
<p>SELECT func_tbmain(parametro1,parametro2,parametro3&#8230;)</p>
<p>Se durante o processo de inclusão não ocorrer nenhum erro de unique_violation, a função vai simplesmente gravar uma nova linha na tabela tb_main e depois na tb_hist e vai passar direto para a instrução END, ignorando assim tudo que vem depois do EXCEPTION da função.<br />
Mas se ocorrer exceção, o primeiro bloco da função é ignorado e o controle passa para a lista de EXCEPTION, executando todo o bloco até o fim.</p>
<p>Se dentro de um bloco de comando de uma função, não existir o EXCEPTION e um erro fosse capturado, a função seria interrompida.<br />
Com o EXCEPTION na função, esse mesmo erro seria capturado, o bloco de comandos acima do EXCEPTION seria ignorado e o bloco de comando logo abaixo do EXCEPTION seria executado, evitando assim que a função fosse interrompida.</p>
<p><strong>CONCLUSÃO</strong><br />
Neste artigo vimos uma pequena introdução para regras, funções e gatilhos no Postgresql. Claro que há muito mais coisas para serem vistas a esse respeito, mas fica o registro para as pessoas que iniciam nesta área, e também para os que querem migrar ou desenvolver aplicações.</p>
<p>Links<br />
Documentação do Postgresql<br />
http://pgdocptbr.sourceforge.net/pg82/index.html<br />
Tutorial<br />
http://pgdocptbr.sourceforge.net/pg82/tutorial.html<br />
Referencias<br />
<a href="http://pgdocptbr.sourceforge.net/pg82/reference.html">http://pgdocptbr.sourceforge.net/pg82/reference.html</a></p>
<p>Rodrigo Ibraim</p>
<p>PGOpen Consultoria</p>
]]></content:encoded>
			<wfw:commentRss>http://postgrecenter.pgopen.com.br/aplicando-rules-functions-e-triggers-no-postgresql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Automatizando Rotinas de Backup e Vacuum no PostgreSQL (crontab)</title>
		<link>http://postgrecenter.pgopen.com.br/automatizando-rotinas-de-backup-e-vacuum-no-postgresql-crontab/</link>
		<comments>http://postgrecenter.pgopen.com.br/automatizando-rotinas-de-backup-e-vacuum-no-postgresql-crontab/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 19:18:07 +0000</pubDate>
		<dc:creator>ravi</dc:creator>
				<category><![CDATA[Dúvidas frequentes]]></category>

		<guid isPermaLink="false">http://softwarelivre.pgopen.com.br/?p=109</guid>
		<description><![CDATA[um script(Shell) simples, mas funcional de automatização da rotina de Backup e Vacuum no PostgreSQL.]]></description>
			<content:encoded><![CDATA[<p>Pessoal,</p>
<p>Segue abaixo um script(Shell) simples, mas funcional de automatização da rotina de Backup e Vacuum no PostgreSQL.</p>
<p>passos:</p>
<p>1 – Vamos criar o arquivo abaixo e dar a ele o nome de Backup.sh</p>
<p>________________________________________________________________________________</p>
<p>#!/bin/bash<br />
clear<br />
echo “#################################”<br />
echo “# Bem Vindo a Sistema de Backup              #”<br />
echo “# Versao 1.0                                                    #”<br />
echo “# Qui Jun 09 04:01:18 BRT 2009                   #”<br />
echo “#################################”<br />
SUDO=’sudo -u postgres’<br />
BANCO=`$SUDO psql -l | grep .’db’ | cut -f1 -d ‘|’`<br />
DIRDEST=’/mnt/bkbanco/’<br />
for DATABASE in $BANCO; do<br />
echo “Iniciando Backup do Banco “$DATABASE<br />
$SUDO pg_dump -Fc $DATABASE &gt; ${DIRDEST}${DATABASE}`date +%d-%m_%H%M`’.sql’<br />
done<br />
echo “Fim do Backup”<br />
SUDO vacuumdb -a -z -f</p>
<p>________________________________________________________________________________</p>
<p>2 – Vamos tornar nosso script um arquivo executável digitando o comando;</p>
<p><strong>chmod +x  backup.sh</strong></p>
<p>3 – Deixaremos nosso backup automático usando a ferramenta de agendamento de tarefas <strong>CRON</strong></p>
<p>Digitamos:</p>
<p><strong>crontab -e</strong></p>
<p>Dentro do arquivo basta adicionar a seguinte regra:</p>
<p><strong>0 23  * * 1-6 /mnt/backup.sh  # aqui determinamos que o backup será executado as 23 horas de segunda à sábado.</strong></p>
<p>Pronto, agora temos uma rotina de backup agendada com o cron, os arquivos serão gerados de forma compacta pois utilizamos a sintaxe -Fc, para finalizar vamos mostrar a forma de restaurar o backup gerado:</p>
<p><strong>pg_restore -d [banco] [arquivo_de_backup].sql | psql -e [banco]</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://postgrecenter.pgopen.com.br/automatizando-rotinas-de-backup-e-vacuum-no-postgresql-crontab/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quais as vantagens de utilizar PostgreSQL?</title>
		<link>http://postgrecenter.pgopen.com.br/quais-as-vantagens-de-utilizar-postgresql/</link>
		<comments>http://postgrecenter.pgopen.com.br/quais-as-vantagens-de-utilizar-postgresql/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 19:15:39 +0000</pubDate>
		<dc:creator>ravi</dc:creator>
				<category><![CDATA[Dúvidas frequentes]]></category>
		<category><![CDATA[Postgresql]]></category>

		<guid isPermaLink="false">http://softwarelivre.pgopen.com.br/?p=103</guid>
		<description><![CDATA[Acredita-se que a maior vantagem do Software de código aberto como o PostgreSql é o fato que pequenas empresas tem condição de atingir qualidade admirável no seu software]]></description>
			<content:encoded><![CDATA[<p>Acredita-se que a maior vantagem do Software de código aberto como o PostgreSql é o fato que pequenas empresas tem condição de atingir qualidade admirável no seu software com relativamente baixo custo. Um exemplo prático foi a Jynx onde todas as informações são armazenadas num banco de dados relacional PostgreSql.<br />
As principais vantagens do PostgreSQL são:<br />
o Imunidade ao fato de não ter que pagar por uma licença, muito menos para várias.<br />
o Performance bastante admirável.<br />
o Multi-plataforma.<br />
o Altamente escalável.</p>
<p>O PostgreSQL tem algumas vantagens com relação ao MySQL, como integridade referencial e suporte a transações NATIVO. O MySQL também oferece esses recursos, mas não é NATIVO, mas usando as tabelas do tipo InnoDB que não é da equipe MySQL AB. Fora que para tirar proveito desse tipo de tabela o MySQL precisa ser mais bem configurado, para reservar espaço para as tabelas, entre<br />
outras providências.<br />
Fonte: <a href="http://listas.softwarelivre.org/pipermail/psl-go/2004-December/000325.html">http://listas.softwarelivre.org/pipermail/psl-go/2004-December/000325.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://postgrecenter.pgopen.com.br/quais-as-vantagens-de-utilizar-postgresql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quem usa PostgreSQL?</title>
		<link>http://postgrecenter.pgopen.com.br/quem-usa-postgresql/</link>
		<comments>http://postgrecenter.pgopen.com.br/quem-usa-postgresql/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 19:14:19 +0000</pubDate>
		<dc:creator>ravi</dc:creator>
				<category><![CDATA[Dúvidas frequentes]]></category>
		<category><![CDATA[Postgresql]]></category>

		<guid isPermaLink="false">http://softwarelivre.pgopen.com.br/?p=101</guid>
		<description><![CDATA[Algumas empresas que patrocinam o PostgreSQL: InterpriseDB, Fijitsu, RedHat, Skype, Sun.
]]></description>
			<content:encoded><![CDATA[<p><strong>Algumas Empresas que Patrocinam o PostgreSQL<br />
</strong>-  InterpriseDB<br />
- Fijitsu<br />
- RedHat<br />
- Skype<br />
- Sun</p>
<p>Lista completa  – <a href="http://www.postgresql.org/about/sponsors" target="_blank">http://www.postgresql.org/about/sponsors<br />
</a> <strong>Algumas Empresas que usam o PostgreSQL  (internacionais)</strong><br />
- Apple<br />
- BASF<br />
- Cisco<br />
- OMS (Organização  Mundial de Saúde)</p>
<p><strong>Algumas Empresas que usam o PostgreSQL  (nacionais)</strong><br />
- FAB (Força Aérea Brasileira)<br />
- Prefeitura Municipal  de Sobral<br />
- Vivo<br />
- DNOCS<br />
- DETRAN do Ceará</p>
]]></content:encoded>
			<wfw:commentRss>http://postgrecenter.pgopen.com.br/quem-usa-postgresql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Para que serve o PostgreSQL?</title>
		<link>http://postgrecenter.pgopen.com.br/para-que-serve-o-postgresql/</link>
		<comments>http://postgrecenter.pgopen.com.br/para-que-serve-o-postgresql/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 19:13:15 +0000</pubDate>
		<dc:creator>ravi</dc:creator>
				<category><![CDATA[Dúvidas frequentes]]></category>
		<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[Postgresql]]></category>

		<guid isPermaLink="false">http://softwarelivre.pgopen.com.br/?p=99</guid>
		<description><![CDATA[Como um banco de dados de nível corporativo, o PostgreSQL possui funcionalidades sofisticadas como o controle de concorrência multiversionado (MVCC, em inglês), recuperação em um ponto no tempo (PITR em inglês) e muito mais.]]></description>
			<content:encoded><![CDATA[<p>Como um banco de dados de nível corporativo, o PostgreSQL  possui funcionalidades sofisticadas como o controle de concorrência multiversionado (MVCC, em inglês), recuperação em um ponto no tempo (PITR em inglês), tablespaces, replicação assíncrona, transações agrupadas (savepoints), cópias de segurança a quente (online/hot backup), um sofisticado planejador de consultas (otimizador) e registrador de transações sequencial (WAL) para tolerância a falhas.</p>
<p>Suporta conjuntos de caracteres internacionais, codificação de caracteres multibyte, Unicode e sua ordenação por localização, sensibilidade a caixa (maiúsculas e minúsculas) e formatação.</p>
<p>É altamente escalável, tanto na quantidade enorme de dados que pode gerenciar, quanto no número de usuários concorrentes que pode acomodar. Existem sistemas ativos com o PostgreSQL em ambiente de produção que gerenciam mais de 4TB de dados.  Alguns limites do PostgreSQL estão incluídos na tabela abaixo.</p>
]]></content:encoded>
			<wfw:commentRss>http://postgrecenter.pgopen.com.br/para-que-serve-o-postgresql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>O que é PostgreSQL?</title>
		<link>http://postgrecenter.pgopen.com.br/o-que-e-postgresql/</link>
		<comments>http://postgrecenter.pgopen.com.br/o-que-e-postgresql/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 19:11:57 +0000</pubDate>
		<dc:creator>ravi</dc:creator>
				<category><![CDATA[Dúvidas frequentes]]></category>

		<guid isPermaLink="false">http://softwarelivre.pgopen.com.br/?p=96</guid>
		<description><![CDATA[O PostgreSQL é um poderoso sistema gerenciador de banco de dados objeto-relacional de código aberto.]]></description>
			<content:encoded><![CDATA[<p>O PostgreSQL é um poderoso sistema gerenciador de banco de dados objeto-relacional de código aberto.  Tem mais de 15 anos de desenvolvimento ativo e uma arquitetura que comprovadamente ganhou forte reputação de confiabilidade, integridade de dados e conformidade a padrões.</p>
<p>Roda em todos os grandes sistemas operacionais, incluindo GNU/Linux, Unix (AIX, BSD, HP-UX, SGI IRIX, Mac OS X, Solaris, Tru64), e MS Windows. É totalmente compatível com ACID, tem suporte completo a chaves estrangeiras, junções (JOINs), visões, gatilhos e procedimentos armazenados (em múltiplas linguagens).</p>
<p>Inclui a maior parte dos tipos de dados do ISO SQL:1999, incluindo INTEGER, NUMERIC, BOOLEAN, CHAR, VARCHAR, DATE, INTERVAL, e TIMESTAMP.  Suporta também o armazenamento de objetos binários, incluindo figuras, sons ou vídeos.  Possui interfaces nativas de programação para C/C++, Java, .Net, Perl, Python, Ruby, Tcl, ODBC, entre outros.</p>
]]></content:encoded>
			<wfw:commentRss>http://postgrecenter.pgopen.com.br/o-que-e-postgresql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Principais diferenças: PostgreSQL x MySQL</title>
		<link>http://postgrecenter.pgopen.com.br/duvidas-frequentes/</link>
		<comments>http://postgrecenter.pgopen.com.br/duvidas-frequentes/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 14:52:01 +0000</pubDate>
		<dc:creator>ravi</dc:creator>
				<category><![CDATA[Dúvidas frequentes]]></category>
		<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Postgresql]]></category>

		<guid isPermaLink="false">http://softwarelivre.pgopen.com.br/?p=75</guid>
		<description><![CDATA[É muito fácil encontrar serviços de hospedagem de sites que oferecem em seus planos os Sistemas Gerenciadores de Banco de Dados (SGDB) MySQL e PostgreSQL, embora isso seja mais comum com o primeiro.]]></description>
			<content:encoded><![CDATA[<p><strong>Introdução<br />
</strong></p>
<p>É muito fácil encontrar serviços de hospedagem de sites que oferecem em seus planos os Sistemas Gerenciadores de Banco de Dados (SGDB) MySQL e PostgreSQL, embora isso seja mais comum com o primeiro. Como esses SGBD não são usados apenas na internet, talvez seja de seu interesse utilizá-los em seus projetos de software, uma vez que cada um é dotado de vantagens interessantes, como a gratuidade de uso. Para ajudá-lo a escolher o melhor para sua aplicação, este artigo apresenta as principais características de ambos, começando com o MySQL. Para tanto, é recomendável que você tenha algum conhecimento sobre os conceitos de bancos de dados.</p>
<p><strong>Alguns termos</strong></p>
<p>Mesmo aquelas pessoas que já trabalham com banco de dados podem ficar “perdidas” no meio de tantos nomes de recursos. Assim, para facilitar a compreensão, segue uma lista com uma breve explicação sobre os recursos mais importantes:</p>
<p>- Referential integrity: também conhecido como “integridade referencial”, esse recurso consiste em restrições ou regras existentes para uma correta inserção de dados, por exemplo, para impedir que uma tabela seja preenchida sem que isso ocorra em outra;</p>
<p>- Schemas: recurso que permite cruzar informações em um mesmo banco de dados, mas em estruturas diferentes;</p>
<p>- SQL: sigla para Structured Query Language, é uma linguagem utilizada em bancos de dados relacionais;</p>
<p>- SSL: sigla para Secure Sockets Layer, consiste em um protocolo para a troca segura de informações;</p>
<p>- Stored procedures: esse recurso consiste em comandos SQL “guardados” no servidor para, por exemplo, executar tarefas repetitivas, evitando que um cliente tenha que executá-las constantemente;</p>
<p>- Transactions: também conhecidas como transações, as transactions são instruções executadas em um bloco designado por parâmetros que indicam seu início e seu fim;</p>
<p>- Triggers: também chamados de gatilhos, os triggers são recursos que permitem o acionamento de uma seqüência de comandos logo em seguida ou logo após um evento;</p>
<p>- Views: os views consistem em um tipo de tabela virtual formada por campos extraídos de uma tabela “verdadeira”, facilitando o controle sob os dados acessados.</p>
<p><strong>O banco de dados MySQL</strong></p>
<p>MySQL é um dos sistemas de gerenciamento de banco de dados mais populares que existe e, por ser otimizado para aplicações Web, é amplamente utilizado na internet (inclusive aqui no InfoWester). É muito comum encontrar serviços de hospedagem de sites que oferecem o MySQL e a linguagem PHP, justamente porque ambos trabalham muito bem em conjunto.</p>
<p>Outro fator que ajuda na popularidade do MySQL é sua disponibilidade para praticamente qualquer sistema operacional, como Linux, FreeBSD (e outros sistemas baseados em Unix), Windows e Mac OS X. Além disso, o MySQL é um software livre (sob licença GPL), o que significa que qualquer um pode estudá-lo ou alterá-lo conforme a necessidade.</p>
<p><em>Entre as características técnicas do SGBD MySQL, estão:</em></p>
<p>- Alta compatibilidade com linguagens como PHP, Java, Python, C#, Ruby e C/C++;</p>
<p>- Baixa exigência de processamento (em comparação como outros SGBD);</p>
<p>- Vários sistemas de armazenamento de dados (batabase engine), como MyISAM, MySQL Cluster, CSV, Merge, InnoDB, entre outros;</p>
<p>- Recursos como transactions (transações), conectividade segura, indexação de campos de texto, replicação, etc;</p>
<p>- Instruções em SQL, como indica o nome.</p>
<p>Até o momento em que este artigo era escrito, o MySQL estava na versão 5.0 (mais precisamente, 5.0.26). Em relação à versão 4.0, houve acréscimo de vários recursos e melhorias importantes, como:</p>
<p>- Triggers;</p>
<p>- Stored procedures;</p>
<p>- Sub-selects;</p>
<p>- Suporte total ao Unicode;</p>
<p>- INFORMATION_SCHEMA (para armazenamento do dicionário de dados);</p>
<p>- Server side cursors;</p>
<p>- Suporte a SSL;</p>
<p>- Melhoria no tratamento de erros.</p>
<p>O MySQL surgiu na Suécia pelas mãos de três colegas: Allan Larsson, David Axmark e Michael Monty Widenius. Trabalhando com base de dados, eles sentiram a necessidade de fazer determinadas conexões entre tabelas e usaram o mSQL para isso. Porém, não demorou para perceberem que essa ferramenta não lhes atendia conforme o necessário e passaram a trabalhar em uma solução própria. Surgia então o MySQL, cuja primeira versão foi lançada no ano de 1996.</p>
<p>Um fato importante a ser destacado sobre o MySQL é que esse SGBD também possui uma licença comercial, isto é, paga. Neste caso, é possível obter suporte diferenciado dos desenvolvedores.</p>
<p>Vale ressaltar também que, em fevereiro de 2008, o MySQL foi comprado pela Sun Microsystems, que pagou a quantia de 1 bilhão de dólares pela aquisição. Mais informações sobre essa transação neste link (em inglês).</p>
<p><strong>O banco de dados PostgreSQL</strong></p>
<p>PostgreSQLO sistema gerenciador de banco de dados PostgreSQL teve seu início na Universidade de Berkeley, na Califórnia, em 1986. À época, um programador chamado Michael Stonebraker liderou um projeto para a criação de um servidor de banco de dados relacionais chamado Postgres, oriundo de um outro projeto da mesma instituição denominado Ingres. Essa tecnologia foi então comprada pela Illustra, empresa posteriormente adquirida pela Informix. Porém, mesmo diante disso, dois estudantes de Berkeley (Jolly Chen e Andrew Yu) compatibilizaram o Postgres à linguagem SQL. Este projeto recebeu o nome de Postgres95.</p>
<p>Em 1996, quando o projeto estava estável, o banco de dados recebeu o nome de PostgreSQL. No entanto, enquanto ainda possuía o nome Postgres95, o banco de dados teve várias mudanças. O seu código foi totalmente revisado e a linguagem SQL foi definida como padrão.<br />
Tecnicamente falando, o PostgreSQL é um banco de dados relacional e orientado a objetos. Um de seus atrativos é possuir recursos comuns a banco de dados de grande porte, o que o deixa apto a trabalhar, inclusive, com operações de missão crítica. Além disso, trata-se de um banco de dados versátil, seguro, gratuito e de código aberto (disponível sob uma licença BSD).</p>
<p><em>Entre suas características, tem-se:</em></p>
<p>- Compatibilidade multi-plataforma, ou seja, executa em vários sistema operacionais, como Windows, Mac OS X, Linux e outras variantes de Unix;</p>
<p>- Compatibilidade com várias linguagens, entre elas, Java, PHP, Python, Ruby, e C/C++;</p>
<p>- Base de dados de tamanho ilimitado;</p>
<p>- Tabelas com tamanho de até 32 TB;</p>
<p>- Quantidade de linhas de até 1.6 TB ilimitada;</p>
<p>- Campos de até 1 GB;</p>
<p>- Suporte a recursos como triggers, views, stored procedures, SSL, MVCC, schemas, transactions, savepoints, referential integrity e expressões regulares;</p>
<p>- Instruções em SQL, como indica o nome.</p>
<p>No momento em que este artigo era escrito, o PostgreSQL estava na versão 8.1.</p>
<p><strong>MySQL x PostgreSQL</strong></p>
<p>MySQL ou PostgreSQL, qual usar? Ambos são muito bons e não fazem feio diante das alternativas pagas. Além disso, possuem recursos e vantagens em comum, o que significa que, para a maioria das aplicações, ambos podem ser usados. Na verdade, o correto não é tentar descobrir qual é o melhor, mas em que situação um ou outro deve ser utilizado.</p>
<p>O PostgreSQL é otimizado para aplicações complexas, isto é, que envolvem grandes volumes de dados ou que tratam de informações críticas. Assim, para um sistema de comércio eletrônico de porte médio/alto, por exemplo, o PostGreSQL é mais interessante, já que esse SGBD é capaz de lidar de maneira satisfatória com o volume de dados gerado pelas operações de consulta e venda.</p>
<p>O MySQL, por sua vez, é focado na agilidade. Assim, se sua aplicação necessita de retornos rápidos e não envolve operações complexas, o MySQL é a opção mais adequada, pois é otimizado para proporcionar processamento rápido dos dados e tempo curto de resposta sem exigir muito do hardware. Se você precisa, por exemplo, de um banco de dados para armazenar o conteúdo do seu site, de seu fórum ou necessita manter um cadastro de usuários de um portal, o MySQL “serve como uma luva”, pois tais aplicações não necessitam dos recursos avançados que o PostgreSQL oferece.</p>
<p>Para escolher um destes dois SGBD, procure entender bem quais recursos sua aplicação precisa. Tente estimar o volume de dados, avalie o hardware disponível, certifique-se das funcionalidades necessárias e, posteriormente, procure por informações mais detalhadas do MySQL e do PostGreSQL. Se sua aplicação for simples – principalmente se for algo ligado à internet -, não é preciso pensar muito: o MySQL é uma escolha satisfatória, pois é facilmente encontrado em serviços de hospedagem.</p>
<p>Todavia, há situações em que tanto o MySQL quanto o PostgreSQL serão boas escolhas. Nesses casos, é recomendável fazer testes com ambos e avaliar qual oferece mais vantagens à aplicação.</p>
<p><strong>Finalizando</strong></p>
<p>Um banco de dados pode ser a diferença entre ter e não ter um negócio, seja ele de qualquer porte. Por isso, a escolha deve ser bem feita e aspectos como desempenho, recursos, documentação e suporte devem ser considerados. Em todos esses pontos o MySQL e o PostgreSQL são excelentes, por isso, a escolha entre um deles só depende de sua aplicação.</p>
]]></content:encoded>
			<wfw:commentRss>http://postgrecenter.pgopen.com.br/duvidas-frequentes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
