<?xml version="1.0"?>
<rdf:RDF
	xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:foaf="http://xmlns.com/foaf/0.1/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns="http://purl.org/rss/1.0/"
>
<channel rdf:about="http://planeta.postgresql.org.br">
	<title>Planeta PostgreSQL-BR</title>
	<link>http://planeta.postgresql.org.br</link>
	<description>Planeta PostgreSQL-BR - http://planeta.postgresql.org.br</description>

	<items>
		<rdf:Seq>
			<rdf:li rdf:resource="http://tas.eti.br/blog/?p=676" />
			<rdf:li rdf:resource="http://andrecf.kinghost.net/freebsd/?p=285" />
			<rdf:li rdf:resource="http://tas.eti.br/blog/?p=100" />
			<rdf:li rdf:resource="http://www.midstorm.org/~fike/weblog/?p=1120" />
			<rdf:li rdf:resource="http://tas.eti.br/blog/?p=692" />
			<rdf:li rdf:resource="http://andrecf.kinghost.net/freebsd/?p=278" />
			<rdf:li rdf:resource="http://www.midstorm.org/~fike/weblog/?p=1101" />
			<rdf:li rdf:resource="http://www.midstorm.org/~telles/?p=819" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-3371915898459901668.post-5892626199986025464" />
			<rdf:li rdf:resource="http://www.postgresql.org.br/16915 at http://www.postgresql.org.br" />
			<rdf:li rdf:resource="http://www.midstorm.org/~fike/weblog/?p=1105" />
			<rdf:li rdf:resource="http://www.midstorm.org/~fike/weblog/?p=1097" />
			<rdf:li rdf:resource="http://www.midstorm.org/~telles/?p=816" />
			<rdf:li rdf:resource="http://jotacomm.wordpress.com/?p=156" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-6838506.post-567399567689290762" />
			<rdf:li rdf:resource="http://jotacomm.wordpress.com/?p=148" />
			<rdf:li rdf:resource="http://andrecf.kinghost.net/freebsd/?p=262" />
			<rdf:li rdf:resource="http://www.midstorm.org/~fike/weblog/?p=1071" />
			<rdf:li rdf:resource="http://www.midstorm.org/~fike/weblog/?p=1074" />
			<rdf:li rdf:resource="http://guedesoft.net/blog/?p=547" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-3371915898459901668.post-220886676945714251" />
			<rdf:li rdf:resource="http://www.postgresql.org.br/16904 at http://www.postgresql.org.br" />
			<rdf:li rdf:resource="http://guedesoft.net/blog/?p=540" />
			<rdf:li rdf:resource="http://www.midstorm.org/~telles/?p=809" />
			<rdf:li rdf:resource="http://guedesoft.net/blog/?p=522" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-578610887231886448.post-6892222031194940548" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-578610887231886448.post-6500553344076967028" />
			<rdf:li rdf:resource="http://www.midstorm.org/~fike/weblog/?p=1043" />
			<rdf:li rdf:resource="http://www.midstorm.org/~fike/weblog/?p=1024" />
			<rdf:li rdf:resource="http://guedesoft.net/blog/?p=513" />
			<rdf:li rdf:resource="http://guedesoft.net/blog/?p=506" />
			<rdf:li rdf:resource="http://guedesoft.net/blog/?p=504" />
			<rdf:li rdf:resource="http://www.postgresql.org.br/16903 at http://www.postgresql.org.br" />
			<rdf:li rdf:resource="http://guedesoft.net/blog/?p=477" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-8625426919745210336.post-6389023070440079316" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-6838506.post-1770466136072337828" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-3371915898459901668.post-1691220424041542799" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-3371915898459901668.post-7909675147169877230" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-8625426919745210336.post-6300399704501277329" />
			<rdf:li rdf:resource="http://www.midstorm.org/~telles/?p=795" />
			<rdf:li rdf:resource="http://www.postgresql.org.br/16898 at http://www.postgresql.org.br" />
			<rdf:li rdf:resource="http://www.midstorm.org/~fike/weblog/?p=1007" />
			<rdf:li rdf:resource="http://ribafs.wordpress.com/2006/12/22/podutividade-no-desenvolvimento-web/" />
			<rdf:li rdf:resource="http://www.midstorm.org/~telles/?p=791" />
			<rdf:li rdf:resource="http://www.midstorm.org/~telles/?p=784" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-3371915898459901668.post-8492480916716847889" />
			<rdf:li rdf:resource="http://andrecf.kinghost.net/freebsd/?p=222" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-3371915898459901668.post-5550266604358404414" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-3371915898459901668.post-6865408034305358545" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-3371915898459901668.post-8776039077049815454" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-3371915898459901668.post-3046021978836504028" />
			<rdf:li rdf:resource="http://www.postgresql.org.br/13049 at http://www.postgresql.org.br" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-3371915898459901668.post-4714814243894759910" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-3371915898459901668.post-7573788938958589060" />
			<rdf:li rdf:resource="http://andrecf.kinghost.net/freebsd/?p=201" />
			<rdf:li rdf:resource="http://www.postgresql.org.br/12977 at http://www.postgresql.org.br" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-3371915898459901668.post-4405999470421158432" />
			<rdf:li rdf:resource="http://www.midstorm.org/~telles/?p=737" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-3371915898459901668.post-2511484191727932454" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-3371915898459901668.post-4601113007530330001" />
		</rdf:Seq>
	</items>
</channel>

<item rdf:about="http://tas.eti.br/blog/?p=676">
	<title>Tiago Silva: Calculando previsão de vendas com PHP e PostgreSQL</title>
	<link>http://tas.eti.br/blog/2012/01/calculando-previsao-de-vendas-com-php-e-postgresql/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=calculando-previsao-de-vendas-com-php-e-postgresql</link>
	<content:encoded>&lt;p&gt;Olá Amigos!&lt;/p&gt;
&lt;p&gt;Hoje eu vou tratar de um assunto da época da &lt;a title=&quot;Veja o post sobre a Fatec Mococa&quot; href=&quot;http://tas.eti.br/blog/2011/11/fatec-mococa-12-melhor-faculdade-publica-do-pais/&quot; target=&quot;_blank&quot;&gt;faculdade&lt;/a&gt;, o cálculo da previsão de vendas de um determinado produto, com base nas vendas anteriores, para tal iremos utilizar o &lt;a title=&quot;Mais posts sobre PostgreSQL&quot; href=&quot;http://tas.eti.br/blog/category/postgresql/&quot; target=&quot;_blank&quot;&gt;PostgreSQL&lt;/a&gt; e &lt;a title=&quot;Mais posts sobre PHP&quot; href=&quot;http://tas.eti.br/blog/category/php/&quot; target=&quot;_blank&quot;&gt;PHP&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://tas.eti.br/blog/wp-content/uploads/2012/01/postgres-php.jpg&quot;&gt;&lt;img class=&quot;size-full wp-image-956 aligncenter&quot; title=&quot;postgres-php&quot; src=&quot;http://tas.eti.br/blog/wp-content/uploads/2012/01/postgres-php.jpg&quot; alt=&quot;&quot; width=&quot;254&quot; height=&quot;147&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Mas antes de mais nada, estou disponibilizando um &lt;a title=&quot;Faça o donwload do exemplo aqui!&quot; href=&quot;http://tas.eti.br/blog/wp-content/uploads/2012/01/Modelo-de-Previsão-de-Vendas.xls&quot; target=&quot;_blank&quot;&gt;documento do Excel&lt;/a&gt; com os mesmos dados da figura abaixo, juntamente com um gráfico contendo os resultados e informações importantes como o valor do r² e a equação do nosso modelo. Também achei importante disponibilizar os &lt;a title=&quot;Download dos slides&quot; href=&quot;http://tas.eti.br/blog/wp-content/uploads/2012/01/Análise-de-Regressão-aplicação-a-custos.ppt&quot; target=&quot;_blank&quot;&gt;slides utilizados&lt;/a&gt; pelo Prof. Darlan quando este assunto foi ministrado, lá você irá encontrar mais conteúdo e uma bagagem teórica solida e enxuta.&lt;/p&gt;
&lt;p&gt;Primeiramente vamos ao nosso problema:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Quanto eu devo investir em publicidade para ter um determinado ganho em vendas?&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Quando nós chegarmos ao ponto de extrair os dados do Postgres perceberemos que na modelagem do banco estes dados (investimento e vendas) não tem nenhuma correlação, veja bem, do ponto de vista da modelagem. Por isso é muito importante que você compreenda bem nosso problema, e para simplificar na tabela abaixo temos os investimentos (ou gastos) com publicidade representado pela&lt;strong&gt; variável x&lt;/strong&gt;, e as vendas representadas pela &lt;strong&gt;variável y&lt;/strong&gt;. Note que além desses dados temos outros como &lt;strong&gt;x²&lt;/strong&gt;, &lt;strong&gt;y²&lt;/strong&gt; e&lt;strong&gt; xy&lt;/strong&gt;, que iremos utilizar posteriormente.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://tas.eti.br/blog/wp-content/uploads/2012/01/previsao_vendas_formula_tabela.jpg&quot;&gt;&lt;img class=&quot;aligncenter size-full wp-image-943&quot; title=&quot;previsao_vendas_formula_tabela&quot; src=&quot;http://tas.eti.br/blog/wp-content/uploads/2012/01/previsao_vendas_formula_tabela.jpg&quot; alt=&quot;&quot; width=&quot;439&quot; height=&quot;136&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Veremos estes mesmos dados a seguir quando estivermos trabalhando no banco de dados, coloquei a tabela de ante-mão para abstrair melhor nosso trabalho, e  na seção seguinte do post iremos abordar os conceitos matemáticos envolvidos e os nomes das colunas (as variáveis) irão aparecer nas fórmulas, e como já vimos estruturadamente, ficará mais fácil.&lt;/p&gt;
&lt;p&gt;O objetivo então é que possamos construir uma aplicação que nos informe qual será o valor que iremos vender, baseando-se no valor que iremos investir em publicidade.&lt;/p&gt;
&lt;p&gt;Ahh, antes que os mais críticos se envolvam, gostaria de dizer que este é um exemplo simples, se você quiser pode melhora-lo de acordo com a sua necessidade &lt;img src=&quot;http://tas.eti.br/blog/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A matemática por traz do cálculo&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Antes que muitos torçam o nariz ou pulem essa parte, já vou adiantando que nossa matemática será breve e simples. É fundamental que você entenda essas fórmulas (além de ler os slides que falei acima) para entender como funciona o nosso modelo.&lt;/p&gt;
&lt;p&gt;E por falar em modelo, aqui temos um estatístico probabilístico, de &lt;strong&gt;regressão linear simples&lt;/strong&gt;. Veja a representação do nosso modelo de equação abaixo:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://tas.eti.br/blog/wp-content/uploads/2012/01/previsao_vendas_modelo_regressao_simples.jpg&quot;&gt;&lt;img class=&quot;size-full wp-image-944 aligncenter&quot; title=&quot;previsao_vendas_modelo_regressao_simples&quot; src=&quot;http://tas.eti.br/blog/wp-content/uploads/2012/01/previsao_vendas_modelo_regressao_simples.jpg&quot; alt=&quot;&quot; width=&quot;221&quot; height=&quot;64&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Aqui temos que a variável y é &lt;strong&gt;explicada&lt;/strong&gt; pela variável x, que por sua vez é &lt;strong&gt;explicativa&lt;/strong&gt;. Então veja que, se estamos representando os gastos com publicidade por x, e as vendas por y, temos que os gastos com publicidade é que vão &lt;strong&gt;determinar&lt;/strong&gt; o valor das vendas.&lt;/p&gt;
&lt;p&gt;Note também que temos dois coeficientes, chamados de &lt;strong&gt;a&lt;/strong&gt; e &lt;strong&gt;b&lt;/strong&gt;. As duas fórmulas a seguir irão utilizar os nossos dados que estão na tabela (conforme a figura da primeira seção), que na  verdade iremos regastar do Postgres. Veja que abaixo temos a representação da fórmula onde iremos encontrar o &lt;strong&gt;valor de a&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://tas.eti.br/blog/wp-content/uploads/2012/01/previsao_vendas_formula_a.jpg&quot;&gt;&lt;img class=&quot;size-full wp-image-941 aligncenter&quot; title=&quot;previsao_vendas_formula_a&quot; src=&quot;http://tas.eti.br/blog/wp-content/uploads/2012/01/previsao_vendas_formula_a.jpg&quot; alt=&quot;&quot; width=&quot;166&quot; height=&quot;70&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://tas.eti.br/blog/wp-content/uploads/2012/01/previsao_vendas_formula_b.jpg&quot;&gt;&lt;br /&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Você deve ter percebido que para calcular o valor de a, antes é necessário obter o valor de b, pois bem, abaixo está a fórmula para o cálculo, veja um detalhe importante: o valor de &lt;strong&gt;n&lt;/strong&gt; é exatamente o número de linhas da nossa tabela (ou o número de registros no banco de dados).&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://tas.eti.br/blog/wp-content/uploads/2012/01/previsao_vendas_formula_b.jpg&quot;&gt;&lt;img class=&quot;size-full wp-image-942 aligncenter&quot; title=&quot;previsao_vendas_formula_b&quot; src=&quot;http://tas.eti.br/blog/wp-content/uploads/2012/01/previsao_vendas_formula_b.jpg&quot; alt=&quot;&quot; width=&quot;252&quot; height=&quot;76&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div&gt;&lt;/div&gt;
&lt;p&gt;Agora que você já tem as duas fórmulas poderá chegar na equeção linear do nosso modelo, que será parecida com esta:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt; y = 2,0754 + 2,0884.x&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Como saber se o modelo é confiável?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Para sabermos se o nosso modelo é confiável contaremos com o &lt;a href=&quot;http://pt.wikipedia.org/wiki/Coeficiente_de_correla%C3%A7%C3%A3o_de_Pearson&quot; target=&quot;_blank&quot;&gt;Coeficiente de Correlação de Person&lt;/a&gt;, ou o famoso &lt;strong&gt;r²&lt;/strong&gt;. Podemos calcular o valor do nosso coeficiente com a singela fórmula abaixo:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://tas.eti.br/blog/wp-content/uploads/2012/01/previsao_vendas_formula_r_quadrado.jpg&quot;&gt;&lt;img class=&quot;size-full wp-image-940 aligncenter&quot; title=&quot;previsao_vendas_formula_r_quadrado&quot; src=&quot;http://tas.eti.br/blog/wp-content/uploads/2012/01/previsao_vendas_formula_r_quadrado.jpg&quot; alt=&quot;&quot; width=&quot;381&quot; height=&quot;64&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;O resultado de r², irá variar entre -1 e 1, de forma que dependendo da variação, ela terá estes significados:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;r² = -1&lt;/strong&gt; : Existe uma correlação inversa entra as variáveis, ou seja, quando uma aumenta a outra diminui.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;r² = 0&lt;/strong&gt; : Modelo ruim, quanto mais próximo de 0, menos acertivo será seu modelo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;r² = 1&lt;/strong&gt; : Significa que seu modelo é muito bom! Ou seja, quanto mais próximo de 1, melhor!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No nosso exemplo, r² é de aproximadamente &lt;strong&gt;0,93&lt;/strong&gt; e observe que ele está bem próximo de 1, o que nos indica que nosso&lt;strong&gt; modelo é consistente&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Construção das tabelas, queries, e dados no &lt;a title=&quot;Veja mais posts sobre o PostgreSQL&quot; href=&quot;http://tas.eti.br/blog/category/postgresql/&quot; target=&quot;_blank&quot;&gt;PostgreSQL&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Este é o ponto mais importante do trabalho, aqui é onde iremos armazenar os dados que servirão de base para construírmos o modelo estatístico de previsão, para isso tome como base as duas tabelas a seguir conforme o modelo mostrado anteriormente:&lt;/p&gt;
&lt;pre class=&quot;brush: sql; gutter: true; first-line: 1&quot;&gt;CREATE TABLE investimento_publicidade (
	cod_investimento SERIAL,
	valor_investimento DOUBLE PRECISION NOT NULL,
	data_realizacao TIMESTAMP NOT NULL DEFAULT NOW(),
	PRIMARY KEY (cod_investimento)
);&lt;/pre&gt;
&lt;pre class=&quot;brush: sql; gutter: true; first-line: 1&quot;&gt;CREATE TABLE vendas (
	id_produto SERIAL,
	nome VARCHAR(100) NOT NULL,
	preco_unitario DOUBLE PRECISION NOT NULL,
	quantidade_vendida INTEGER NOT NULL,
	PRIMARY KEY (id_produto)
);&lt;/pre&gt;
&lt;p&gt;Agora iremos abastacer o nosso modelo com os mesmos dados que utilizamos acima. Para agilizar e para podermos testar depois, disponibilizei o script SQL com as instruções INSERT abaixo:&lt;/p&gt;
&lt;pre class=&quot;brush: sql; gutter: true; first-line: 1&quot;&gt;INSERT INTO investimento_publicidade (valor_investimento) VALUES (3);
INSERT INTO investimento_publicidade (valor_investimento) VALUES (4);
INSERT INTO investimento_publicidade (valor_investimento) VALUES (8);
INSERT INTO investimento_publicidade (valor_investimento) VALUES (12);
INSERT INTO investimento_publicidade (valor_investimento) VALUES (14);

INSERT INTO vendas (nome, preco_unitario, quantidade_vendida) VALUES ('Produto A', 7 , 1);
INSERT INTO vendas (nome, preco_unitario, quantidade_vendida) VALUES ('Produto B', 14, 1);
INSERT INTO vendas (nome, preco_unitario, quantidade_vendida) VALUES ('Produto A', 15, 1);
INSERT INTO vendas (nome, preco_unitario, quantidade_vendida) VALUES ('Produto C', 28, 1);
INSERT INTO vendas (nome, preco_unitario, quantidade_vendida) VALUES ('Produto C', 32, 1);&lt;/pre&gt;
&lt;p&gt;Muito bem! Agora temos os nossos dados, e neste ponto vamos extaí-los do banco para elaborarmos a equação do nosso modelo de previsão com o PHP!&lt;/p&gt;
&lt;p&gt;Então, considere as duas queries abaixo, primeiramente a query que nos retornará os valores investidos em publicidade:&lt;/p&gt;
&lt;pre class=&quot;brush: sql; gutter: true; first-line: 1&quot;&gt;SELECT SUM(valor_inestimento) AS x_somatoria_invest_publicidade, SUM(valor_inestimento^2) AS x_quadrado
FROM investimento_publicidade&lt;/pre&gt;
&lt;p&gt;Veja o que estamos retornando nesta query: a nossa &lt;strong&gt;variável x&lt;/strong&gt;, que é a somatória dos valores investidos em publicidade e o &lt;strong&gt;x²&lt;/strong&gt;, que iremos utilizar nas fórmulas.&lt;/p&gt;
&lt;p&gt;E agora a query com os valores das vendas:&lt;/p&gt;
&lt;pre class=&quot;brush: sql; gutter: true; first-line: 1&quot;&gt;SELECT SUM((preco_unitario*quantidade_vendida)) AS y_somatoria_vendas, SUM((preco_unitario*quantidade_vendida)^2) AS y_quadrado
FROM vendas&lt;/pre&gt;
&lt;p&gt;Ok, temos retorno das &lt;strong&gt;variáveis y e y²&lt;/strong&gt;, repare que eu fiz umas brincadeirinhas, como a multiplicação do valor vendido pelo preço unitário, se você quiser pode brincar um pouco com os modelos depois alterando estes valores diretamente na tabela vendas.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;NOTA:&lt;/strong&gt; Eu poderia realizar toda a previsão de vendas somente dentro do Postgres, mas aqui quero utilizar o máximo de ferramentas possíveis, a previsão de vendas somente no PostgreSQL fica para um próximo post ok? =)&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Exibição do modelo e simulação de dados com &lt;a title=&quot;Veja mais posts sobre o PostgreSQL&quot; href=&quot;http://tas.eti.br/blog/category/php/&quot; target=&quot;_blank&quot;&gt;PHP&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Veja abaixo o código de uma classe que irá realizar tanto os cálculos quanto as queries no Postgres, os comentários no código já explicam o que está acontecendo:&lt;/p&gt;
&lt;pre class=&quot;brush: php; gutter: true; first-line: 1&quot;&gt;class PrevisaoVendas
{
	/**
	 * Atributo estático onde armazenaremos nosso objeto PDO para nossa comunicação com o banco de dados.
	 */
	private static $conn;

	/**
	 * Construtor da classe onde criamos e armazenamos nosso objeto PDO.
	 */
	public function __construct()
	{
		$opcoes_conexao = array(PDO::ATTR_ERRMODE    =&amp;gt; PDO::ERRMODE_EXCEPTION,
								PDO::ATTR_PERSISTENT =&amp;gt; true);

		self::$conn = new PDO(&quot;pgsql:host=127.0.0.1 dbname=PREVISAO_VENDAS&quot;, &quot;postgres&quot;, &quot;senha&quot;, $opcoes_conexao);
	}

	/**
	 * Método responsável por retornar um objeto (stdClass) com os valores do x e x quadrado (investimento em publicidade)
	 */
	private function getValoresInvestimentosX()
	{
		$sql = &quot;SELECT SUM(valor_inestimento) AS x_somatoria_invest_publicidade, SUM(valor_inestimento^2) AS x_quadrado &quot;
		     . &quot;FROM investimento_publicidade&quot;;

		$stmt = self::$conn-&amp;gt;prepare($sql);
		$stmt-&amp;gt;execute();

		return $stmt-&amp;gt;fetchObject();
	}

	/**
	 * Método responsável por retornar um objeto (stdClass) com os valores do y e y quadrado (vendas)
	 */
	private function getValoresVendasY()
	{
		$sql = &quot;SELECT SUM((preco_unitario*quantidade_vendida)) AS y_somatoria_vendas, SUM((preco_unitario*quantidade_vendida)^2) AS y_quadrado &quot;
			 . &quot;FROM vendas&quot;;

		$stmt = self::$conn-&amp;gt;prepare($sql);
		$stmt-&amp;gt;execute();

		return $stmt-&amp;gt;fetchObject();
	}

	/**
	 * Método que calcula o valor de xy, a dica é você olha no manual do PHP as funções array_combine e array_sum
	 */
	private function getValorXY()
	{
		/**
		 * Obtendo os valores de x;
		 */
		$stmt = self::$conn-&amp;gt;prepare(&quot;SELECT valor_inestimento AS x FROM investimento_publicidade LIMIT 5&quot;);
		$stmt-&amp;gt;execute();

		$x = array();

		while($rows = $stmt-&amp;gt;fetchObject())
			$x[] = $rows-&amp;gt;x;

		/**
		 * Obtendo os valores de y;
		 */
		$stmt = self::$conn-&amp;gt;prepare(&quot;SELECT preco_unitario*quantidade_vendida AS y FROM vendas LIMIT 5&quot;);
		$stmt-&amp;gt;execute();

		$y = array();

		while($rows = $stmt-&amp;gt;fetchObject())
			$y[] = $rows-&amp;gt;y;

		/**
		 * Calculando o valor da soma de xy
		 */
		$xy_aux = array_combine($x, $y);

		$xy = array();

		foreach($xy_aux as $key =&amp;gt; $value)
			$xy[] = $key * $value;

		return array_sum($xy);
	}

	/**
	 * Obtem o número de registros de vendas, o &quot;n&quot; utilizado nas equações, observe que o número de vendas poderá não ser igual ao número de
	 * investimentos, caberá a você criar um mecanismo para definir que sempre os dados analizados estarão na mesma proporção e consistentes,
	 * uma dica é a utilização de LIMIT e OFFSET.
	 */
	private function getNumVendas()
	{
		$sql = &quot;SELECT COUNT(*) FROM vendas&quot;;

		$stmt = self::$conn-&amp;gt;prepare($sql);
		$stmt-&amp;gt;execute();

		return $stmt-&amp;gt;fetchColumn();
	}

	/**
	 * Método onde estamos resolvendo a equação para encontrar o valor de &quot;a&quot;.
	 */
	private function getValorEquacaoA()
	{
		$x = $this-&amp;gt;getValoresInvestimentosX();
		$y = $this-&amp;gt;getValoresVendasY();
		$n = $this-&amp;gt;getNumVendas();
		$b = $this-&amp;gt;getValorEquacaoB();	

		$a = ($y-&amp;gt;y_somatoria_vendas - ($b * $x-&amp;gt;x_somatoria_invest_publicidade)) / $n;

		return $a;
	}

	/**
	 * Método onde estamos resolvendo a equação para encontrar o valor de &quot;b&quot;.
	 */
	private function getValorEquacaoB()
	{
		$x  = $this-&amp;gt;getValoresInvestimentosX();
		$y  = $this-&amp;gt;getValoresVendasY();
		$n  = $this-&amp;gt;getNumVendas();
		$xy = $this-&amp;gt;getValorXY();		

		$b = (($n * $xy) - ($x-&amp;gt;x_somatoria_invest_publicidade * $y-&amp;gt;y_somatoria_vendas)) / (($n * $x-&amp;gt;x_quadrado) - pow($x-&amp;gt;x_somatoria_invest_publicidade, 2));

		return $b;
	}

	/**
	 * Método para a identificação do valor de r quadrado, onde veremos que conforme o valor do índice teremos o nível de confiabilidade do modelo.
	 */
	public function getValorRQuadrado()
	{
		$x  = $this-&amp;gt;getValoresInvestimentosX();
		$y  = $this-&amp;gt;getValoresVendasY();
		$n  = $this-&amp;gt;getNumVendas();
		$xy = $this-&amp;gt;getValorXY();	

		$r = (($n * $xy) - ($x-&amp;gt;x_somatoria_invest_publicidade * $y-&amp;gt;y_somatoria_vendas)) / (sqrt(($n * $x-&amp;gt;x_quadrado) - pow($x-&amp;gt;x_somatoria_invest_publicidade, 2)) * sqrt(($n * $y-&amp;gt;y_quadrado) - pow($y-&amp;gt;y_somatoria_vendas, 2)));

		$r_quadrado = pow($r, 2);

		return $r_quadrado;
	}

	/**
	 * Método para obteção de uma string contendo a fórmula do modelo.
	 */
	public function getStringFormulaModeloPrevisor()
	{
		$a = $this-&amp;gt;getValorEquacaoA();
		$b = $this-&amp;gt;getValorEquacaoB();

		$string = &quot;y = &quot; . number_format($a, 4, &quot;,&quot;, &quot;&quot;) . &quot; + &quot; . number_format($b, 4, &quot;,&quot;, &quot;&quot;) . &quot;.x&quot;;

		return $string;
	}

	/**
	 * Método que capta um dado valor em investimento de publicidade, e por meio do nosso modelo, retorna a previsão das vendas.
	 */
	public function getValorSimuladoVendas($valor_invest_publicidade)
	{
		$a = $this-&amp;gt;getValorEquacaoA();
		$b = $this-&amp;gt;getValorEquacaoB();

		$y = $a + ($b * $valor_invest_publicidade);		

		return $y; // Nosso valor estimado das vendas.
	}
}&lt;/pre&gt;
&lt;p&gt;Veja um exemplo de utilização da classe:&lt;/p&gt;
&lt;pre class=&quot;brush: php; gutter: true; first-line: 1&quot;&gt;$preview = new PrevisaoVendas();

$preview-&amp;gt;getStringFormulaModeloPrevisor(); // Irá nos retornar a fórmula.
$preview-&amp;gt;getValorRQuadrado();              // Valor do r quarado com a precisão do nosso modelo.
$preview-&amp;gt;getValorSimuladoVendas(10.0);     // Retorna o valor das vendas, se no caso, invesrtirmos $ 10,00 em propaganda.&lt;/pre&gt;
&lt;p&gt;Então amigos, é isso ai, espero que vocês tenham gostado da simplória abordagem. Eu gostaria muito de saber das experiências de vocês, então fiquem a vontade para comentar!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Referências:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://tas.eti.br/blog/wp-content/uploads/2012/01/Análise-de-Regressão-aplicação-a-custos.ppt&quot; target=&quot;_blank&quot;&gt;Análise de Regressão &amp;#8211; Slides&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://pt.wikipedia.org/wiki/Coeficiente_de_correla%C3%A7%C3%A3o_de_Pearson&quot; target=&quot;_blank&quot;&gt;Wikipedia &amp;#8211; Coeficiente de Correlação de Person&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.php.net/manual/pt_BR/function.pow.php&quot; target=&quot;_blank&quot;&gt;PHP Documentation &amp;#8211; Função pow()&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.php.net/manual/pt_BR/function.sqrt.php&quot; target=&quot;_blank&quot;&gt;PHP Documentation &amp;#8211; Função sqrt()&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://php.net/manual/pt_BR/function.array-combine.php&quot; target=&quot;_blank&quot;&gt;PHP Documentation &amp;#8211; Função array_combine()&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.php.net/manual/pt_BR/function.array-sum.php&quot; target=&quot;_blank&quot;&gt;PHP Documentation &amp;#8211; Função array_sum()&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Abraços,&lt;/p&gt;
&lt;p&gt;&lt;a title=&quot;Quem é o autor desse blog?&quot; href=&quot;http://tas.eti.br/blog/sobre/&quot; target=&quot;_blank&quot;&gt;Tiago&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;linkedin_share_container&quot;&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;http://twitter.com/share?url=http://tas.eti.br/blog/2012/01/calculando-previsao-de-vendas-com-php-e-postgresql/&amp;amp;via=tiagotas&amp;amp;text=Calculando previsão de vendas com PHP e PostgreSQL&amp;amp;related=:&amp;amp;lang=en&amp;amp;count=horizontal&quot; class=&quot;twitter-share-button&quot;&gt;Tweet&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;http://twitter.com/share?url=http://tas.eti.br/blog/2012/01/calculando-previsao-de-vendas-com-php-e-postgresql/&amp;amp;via=tiagotas&amp;amp;text=Calculando previsão de vendas com PHP e PostgreSQL&amp;amp;related=:&amp;amp;lang=en&amp;amp;count=horizontal&quot; class=&quot;twitter-share-button&quot;&gt;Tweet&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;AWD_like_button &quot;&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2012-01-13T03:44:49+00:00</dc:date>
</item>
<item rdf:about="http://andrecf.kinghost.net/freebsd/?p=285">
	<title>André Fernandes: Vale a pena manter a especialização em Postgresql?</title>
	<link>http://andrecf.kinghost.net/freebsd/2012/01/10/postgresql/</link>
	<content:encoded>Comecei com o postgresql de uma forma muito particular, nem desejava ser DBA na época. Hoje não somente trabalho com postgresql, como também adoro o que faço, não têm banco.de dados que me agrade mais de que postgresql; Oracle, Sql Server, DB2, firebird, nenhum deles tem o &amp;#8220;sabor&amp;#8221; do postgresql. Quando observo o mercado, preocupo-me [...]</content:encoded>
	<dc:date>2012-01-10T18:18:43+00:00</dc:date>
</item>
<item rdf:about="http://tas.eti.br/blog/?p=100">
	<title>Tiago Silva: Manipulando Triggers no PostgreSQL</title>
	<link>http://tas.eti.br/blog/2011/12/manipulando-triggers-no-postgresql/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=manipulando-triggers-no-postgresql</link>
	<content:encoded>&lt;p&gt;&lt;span&gt; &lt;!--
google_ad_client = &quot;ca-pub-7113648014835203&quot;;
/* ad-post-top */
google_ad_slot = &quot;2716329990&quot;;
google_ad_width = 468;
google_ad_height = 60;
//--&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Olá novamente caros leitores!&lt;/p&gt;
&lt;p&gt;Primeiramente me desculpem pela demora para liberar uma nova &lt;a title=&quot;Veja mais posts sobre o PostgreSQL&quot; href=&quot;http://tas.eti.br/blog/category/postgresql/&quot; target=&quot;_blank&quot;&gt;postagem sobre o Postgres&lt;/a&gt;, é que as últimas semanas foram muito movimentadas, realizei minha entrevista na UFSCar para o ingresso no programa de &lt;a title=&quot;Veja meu post sobre a entrada no mestrado&quot; href=&quot;http://tas.eti.br/blog/2011/12/mestrado-na-ufscar-to-dentro/&quot; target=&quot;_blank&quot;&gt;mestrado&lt;/a&gt; do Departamento de Computação e ainda na semana retrasada recebi a notícia da minha aprovação, então imaginem o tamanho da felicidade e a correria com as festas de fim de ano.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://tas.eti.br/blog/wp-content/uploads/2011/11/logo_w_elephant.png&quot;&gt;&lt;img class=&quot;aligncenter&quot; title=&quot;logo_w_elephant&quot; src=&quot;http://tas.eti.br/blog/wp-content/uploads/2011/11/logo_w_elephant.png&quot; alt=&quot;&quot; width=&quot;250&quot; height=&quot;198&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bom, mas vamos ao que interessa, hoje irei falar sobre as triggers, ou funções de gatilho, como você queria chamar. Uma das coisas mais interessantes da implementação das funções no &lt;a title=&quot;Aqui você pode encontrar mais conteúdo!&quot; href=&quot;http://tas.eti.br/blog/category/postgresql/&quot; target=&quot;_blank&quot;&gt;Postgres&lt;/a&gt; é que você pode escolher qual linguagem vai usar para programar sua trigger! Isso mesmo, então antes de mais nada, eu separei abaixo a lista de algumas linguagens, e o link para mais informações sobre elas, veja:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title=&quot;Manual da Linguagem em Português&quot; href=&quot;http://pgdocptbr.sourceforge.net/pg80/plpgsql.html&quot; target=&quot;_blank&quot;&gt;PL/PGSQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title=&quot;Mais informações sobre a PL/TCL (in english)&quot; href=&quot;http://www.postgresql.org/docs/devel/static/pltcl.html&quot; target=&quot;_blank&quot;&gt;PL/Tcl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title=&quot;Mais informações sobre a PL/Perl (in english)&quot; href=&quot;http://www.postgresql.org/docs/9.1/interactive/plperl.html&quot; target=&quot;_blank&quot;&gt;PL/Perl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title=&quot;Mais informações sobre a PL/Python (in english)&quot; href=&quot;http://www.postgresql.org/docs/current/static/plpython.html&quot; target=&quot;_blank&quot;&gt;PL/Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title=&quot;Veja mais neste link&quot; href=&quot;http://pgfoundry.org/projects/pljava/&quot; target=&quot;_blank&quot;&gt;PL/Java&lt;/a&gt; (veja &lt;a title=&quot;Na versão 8.3 do PostgreSQL&quot; href=&quot;http://marcelocosta.wordpress.com/2008/02/19/pljava-postgresql-83/&quot; target=&quot;_blank&quot;&gt;aqui&lt;/a&gt; ou &lt;a href=&quot;http://seiti.eti.br/blog/2009/instalando-pljava-no-postgresql&quot; target=&quot;_blank&quot;&gt;aqui&lt;/a&gt; como instalar a &lt;a title=&quot;Download do pacote de instalação aqui!&quot; href=&quot;http://pgfoundry.org/projects/pljava/&quot; target=&quot;_blank&quot;&gt;PL/Java&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Agora que você já sabe dessa maravilha do Postgres irei dizer que aqui, iremos exemplificar as triggers &lt;strong&gt;utilizando a PL/pgSQL&lt;/strong&gt;. Mas antes da prática no código fonte, iremos trabalhar um pouco sobre a definição e funcionamento das triggers no PostgreSQL.&lt;/p&gt;
&lt;p&gt;Você deve saber que os nossos gatilhos funcionam baseados em eventos, dois: &lt;strong&gt;before&lt;/strong&gt; (antes de alguma coisa) e &lt;strong&gt;after&lt;/strong&gt; (depois de alguma coisa). Explicando: você pode determinar que uma trigger dispare após (after) a inserção em determinada tabela do banco ou antes (before) da tal inserção, por exemplo.&lt;/p&gt;
&lt;p&gt;É muito importante que você dê uma olhada abaixo na lista de variáveis que podem ser utilizadas dentro da estrutura da função da sua trigger, vale a pena dar uma lida, no entanto existem duas que a leitura é obrigatoria, que são a &lt;strong&gt;new&lt;/strong&gt; e a &lt;strong&gt;old&lt;/strong&gt;. Elas são usadas da seguinte maneira:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;NEW&lt;/strong&gt;: No caso da trigger ser disparada por um INSERT a variável NEW irá abrigar os valores a ser inseridos, e caso seja um evento do tipo UPDATE, NEW irá conter a nova versão dos valores a serem atualizados (veja o exemplo no código abaixo).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OLD&lt;/strong&gt;: Esta variável é utilizada no caso do evento DELETE armazena os dados que estão sendo excluídos, e no caso do UPDATE a versão antiga dos dados.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;O acesso dos dados se dá em ambas as variáveis dessa maneira: NEW.COD_CLIENTE, por exmplo. Abaixo você verá o exemplo de uma trigger.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Outras variáveis especiais que você pode usar:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;TG_NAME&lt;/strong&gt;: Contém o nome do trigger que foi disparado.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TG_WHEN&lt;/strong&gt;: Contem quando o evento foi disparado, sendo BEFORE ou AFTER.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TG_LEVEL&lt;/strong&gt;: Diz em qual ponto da trigger.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TG_OP&lt;/strong&gt;: Tipo de operção que está sendo executada: INSERT, UPDATE ou DELETE.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TG_RELID&lt;/strong&gt;: Contém a ID do objeto que está disparando o gatilho.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TG_RELNAME&lt;/strong&gt;: Nome da tabela que disparou o gatilho (obsoleto).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TG_TABLE_NAME&lt;/strong&gt;: Nome da tabela que disparou o gatilho.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TG_NAME_SCHEMA&lt;/strong&gt;: Nome do &lt;a title=&quot;Veja meu post sobre Schemas!&quot; href=&quot;http://tas.eti.br/blog/2011/09/utilizando-schemas-no-postgresql/&quot; target=&quot;_blank&quot;&gt;schema&lt;/a&gt; onde está a tabela que disparou a trigger.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TG_NARGS&lt;/strong&gt;: Número de argumentos fornecidos para a Stored Function do trigger.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TG_ARGV[]&lt;/strong&gt;: Os argumentos que foram fornecidos.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Perguntas (quase) nunca feitas sobre triggers:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Sabe-se que pode atrelar mais de uma trigger por tabela, então qual a ordem de execução das triggers?&lt;/em&gt;&lt;br /&gt;
R: A ordem de execução é alfabética.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Triggers podem ser recursivas?&lt;/em&gt;&lt;br /&gt;
R: Sim! Os gatilhos podem executar comandos SQL, e os mesmos podem disparar outras triggers. Este cenário é conhecido como &lt;strong&gt;cascateamento de triggers&lt;/strong&gt;, assim pode ser que a trigger passe a se &amp;#8220;auto disparar&amp;#8221;, ou seja, chamadas recursivas da própria trigger, &lt;strong&gt;fique atento a recursões infinitas!&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Triggers na Prática&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Agora vamos a parte pática irei realizar um único exemplo, &lt;a title=&quot;Mais exemplos do funcionamento das triggers&quot; href=&quot;http://ecoapre.blogspot.com/2011/12/disparadores-triggers-en-postgresql.html&quot; target=&quot;_blank&quot;&gt;neste link&lt;/a&gt; você e encontrar mais exemplos de triggers. No nosso, considere as duas tabelas abaixo:&lt;/p&gt;
&lt;pre class=&quot;brush: sql; gutter: true; first-line: 1&quot;&gt;CREATE TABLE funcionarios (
	ID_FUNCIONARIO SERIAL,
	NOME VARCHAR(255),
	IDADE INTEGER,
	FUNCAO VARCHAR(150),
	PRIMARY KEY(ID_FUNCIONARIO)
);

CREATE TABLE FUNCIONARIOS_LOG (
	COD_ALTERACAO SERIAL,
	USUARIO VARCHAR(150) NOT NULL,
	TIPO_ACAO VARCHAR(25) NOT NULL,
	DATA_ALTERACAO TIMESTAMP NOT NULL,
	PRIMARY KEY (COD_ALTERACAO)
);&lt;/pre&gt;
&lt;p&gt;Repare que na construção da tabela&lt;strong&gt; funcionarios&lt;/strong&gt; eu não coloquei nenhuma regra de validação, como por exemplo not null, foi de propósito! Nossa trigger irá realizar a (simples) validação da entrada de dados na tabela e em seguida guardar que tipo de operação foi feita, por quem e a data na tabela &lt;strong&gt;funcionarios_log&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Agora a construção da &lt;strong&gt;stored function&lt;/strong&gt; que será &amp;#8220;chamada&amp;#8221; pela trigger e sua agregação como trigger:&lt;/p&gt;
&lt;pre class=&quot;brush: sql; gutter: true; first-line: 1&quot;&gt;CREATE FUNCTION valida_dados_funcionario() RETURNS TRIGGER AS $valida_dados_funcionario$
BEGIN
	IF NEW.NOME IS NULL THEN
		RAISE EXCEPTION 'Por Favor, digite o nome do funcionario!';
	END IF;

	IF NEW.IDADE IS NULL THEN
		RAISE EXCEPTION 'Por favor, informe a idade!';
	END IF;

	IF NEW.IDADE &amp;lt; 0 THEN
		RAISE EXCEPTION 'Desculpe, o funcionario não pode ter % anos', NEW.IDADE;
	END IF;

	IF NEW.FUNCAO IS NULL THEN
		RAISE EXCEPTION 'Por favor, informe qual a função do funcinário!';
	END IF;

	-- Aqui iremos gravar no log o tipo de ação que foi realizada
	INSERT INTO FUNCIONARIOS_LOG (USUARIO, TIPO_ACAO, DATA_ALTERACAO) VALUES (CURRENT_USER, TG_OP, CURRENT_TIMESTAMP);

	RETURN NEW;
END;
$valida_dados_funcionario$
LANGUAGE plpgsql;&lt;/pre&gt;
&lt;p&gt;Note que realizei as devidas validações utilizando o operador NEW, porque agora iremos atrelar a trigger a tabela dizendo que ela será executada durante um insert ou update. Observe também que o declaramos um return &amp;#8220;trigger&amp;#8221; e especificamos os delimitadores $$, você pode encontrar mais informações sobre a estruturação de procedures de triggers na &lt;a title=&quot;Como construir trigger procedures&quot; href=&quot;http://www.postgresql.org/docs/8.0/static/plpgsql-trigger.html&quot; target=&quot;_blank&quot;&gt;documentação do PostgreSQL&lt;/a&gt;, e por fim note que especificamos qual&lt;strong&gt; linguagem é utilizad&lt;/strong&gt;a para a construção da trigger, no caso &lt;strong&gt;plpgsql&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Veja abaixo como definimos a trigger, chamando a procedure que construímos anteriormente:&lt;/p&gt;
&lt;pre class=&quot;brush: sql; gutter: true; first-line: 1&quot;&gt;CREATE TRIGGER validacao_insert BEFORE INSERT OR UPDATE ON funcionarios
FOR EACH ROW EXECUTE PROCEDURE valida_dados_funcionario();&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Pronto&lt;/strong&gt;! Agora sua trigger já está funcionando nos eventos INSERT e UPDATE na tabela funcionario, faça os testes!&lt;/p&gt;
&lt;p&gt;Agora para ilustrar ainda mais nosso exemplo irei alterar o nome da trigger, veja:&lt;/p&gt;
&lt;pre class=&quot;brush: sql; gutter: true; first-line: 1&quot;&gt;ALTER TRIGGER validacao_insert ON funcionarios RENAME TO a_validacao_insert&lt;/pre&gt;
&lt;p&gt;Para desabilitar (para habilitar troque o DISABLE por ENABLE) uma determinada trigger:&lt;/p&gt;
&lt;pre class=&quot;brush: sql; gutter: true; first-line: 1&quot;&gt;ALTER TABLE  funcionarios DISABLE TRIGGER a_validacao_insert&lt;/pre&gt;
&lt;p&gt;Ou para &lt;strong&gt;desabilitar todas&lt;/strong&gt; as triggers de uma tabela:&lt;/p&gt;
&lt;pre class=&quot;brush: sql; gutter: true; first-line: 1&quot;&gt;ALTER TABLE  funcionarios DISABLE TRIGGER ALL&lt;/pre&gt;
&lt;p&gt;Agora, se eu desejar remover a trigger:&lt;/p&gt;
&lt;pre class=&quot;brush: sql; gutter: true; first-line: 1&quot;&gt;DROP TRIGGER a_validacao_insert ON funcionarios&lt;/pre&gt;
&lt;p&gt;Repare que não postei a imagem dos resultados para induzir &lt;strong&gt;você a testar o código&lt;/strong&gt;! Faça os scripts de insert e update e veja as saídas produzidas pelo SGBD, acredito que você irá se divertir muito com os resultados!&lt;/p&gt;
&lt;p&gt;Se você quiser saber mais sobre os triggers e sobre o &lt;a title=&quot;Existem muito mais posts para você ler aqui!&quot; href=&quot;http://tas.eti.br/blog/category/postgresql/&quot; target=&quot;_blank&quot;&gt;PostgreSQL&lt;/a&gt; eu recomendo um livro (se você também for chegado a papel) que utilizei na minha &lt;a title=&quot;Neste post você pode fazer o download dela!&quot; href=&quot;http://tas.eti.br/blog/2011/12/download-da-minha-monografia/&quot; target=&quot;_blank&quot;&gt;monografia&lt;/a&gt;, intitulado &lt;em&gt;PostgreSQL: Guia do Desenvolvedor&lt;/em&gt;, de André Milani.&lt;/p&gt;
&lt;p&gt;Como você que leu (conseguiu chegar até aqui) triggers são um assunto muito extenso para se tratar aqui no blog, &lt;strong&gt;recomendo que você leia as referências&lt;/strong&gt; e pesquisa mais sobre o assunto, é um tema muito interessante e útil para o dia a dia!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Referências:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.postgresql.org/docs/8.1/static/triggers.html&quot; target=&quot;_blank&quot;&gt;PostgreSQL Documentation &amp;#8211; Triggers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title=&quot;Manual em Inglês&quot; href=&quot;http://www.postgresql.org/docs/8.0/static/plpgsql-trigger.html&quot; target=&quot;_blank&quot;&gt;PostgreSQL Documentation &amp;#8211; Trigger Procedures&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/Fun%C3%A7%C3%B5es_Definidas_pelo_Usu%C3%A1rio_e_Triggers/Triggers&quot; target=&quot;_blank&quot;&gt;Wikibooks &amp;#8211; PostgreSQL &amp;#8211; Triggers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://imasters.com.br/artigo/10644/postgresql/triggers_no_postgresql/&quot; target=&quot;_blank&quot;&gt;iMasters &amp;#8211; Triggers no PostgreSQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://ecoapre.blogspot.com/2011/12/disparadores-triggers-en-postgresql.html&quot; target=&quot;_blank&quot;&gt;Ecoapre &amp;#8211; Disparadores triggers en PostgreSQL (en espanhol)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Abraços,&lt;/p&gt;
&lt;p&gt;&lt;a title=&quot;Quem é o autor desse blog?&quot; href=&quot;http://tas.eti.br/blog/sobre/&quot; target=&quot;_blank&quot;&gt;Tiago&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span&gt; &lt;!--
google_ad_client = &quot;ca-pub-7113648014835203&quot;;
/* ad-post-button */
google_ad_slot = &quot;5761791599&quot;;
google_ad_width = 468;
google_ad_height = 60;
//--&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;linkedin_share_container&quot;&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;http://twitter.com/share?url=http://tas.eti.br/blog/2011/12/manipulando-triggers-no-postgresql/&amp;amp;via=tiagotas&amp;amp;text=Manipulando Triggers no PostgreSQL&amp;amp;related=:&amp;amp;lang=en&amp;amp;count=horizontal&quot; class=&quot;twitter-share-button&quot;&gt;Tweet&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;http://twitter.com/share?url=http://tas.eti.br/blog/2011/12/manipulando-triggers-no-postgresql/&amp;amp;via=tiagotas&amp;amp;text=Manipulando Triggers no PostgreSQL&amp;amp;related=:&amp;amp;lang=en&amp;amp;count=horizontal&quot; class=&quot;twitter-share-button&quot;&gt;Tweet&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;AWD_like_button &quot;&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2011-12-28T03:01:53+00:00</dc:date>
</item>
<item rdf:about="http://www.midstorm.org/~fike/weblog/?p=1120">
	<title>Fernando Ike: Debian, Sysctl e postgresql</title>
	<link>http://www.midstorm.org/~fike/weblog/2011/12/19/debian-sysctl-e-postgresql/</link>
	<content:encoded>&lt;p&gt;&amp;nbsp; &amp;nbsp; Na maioria dos casos de uma instala&amp;ccedil;&amp;atilde;o do &lt;a href=&quot;http://postgresql.org&quot; target=&quot;_blank&quot;&gt;PostgreSQL&lt;/a&gt; &amp;eacute; modificado o &lt;strong&gt;sysctl&lt;/strong&gt; para usar melhor (&lt;strong&gt;tuning&lt;/strong&gt;) os recursos dispon&amp;iacute;veis num servidor. O Debian tem um diret&amp;oacute;rio chamado &lt;strong&gt;/etc/sysctl.d&lt;/strong&gt; para configura&amp;ccedil;&amp;otilde;es personalizadas em pacotes espec&amp;iacute;ficos como o pacote do PostgreSQL.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; Para fazer a modifica&amp;ccedil;&amp;atilde;o (tuning) do sysctl no modo &lt;a href=&quot;http://debian.org&quot; target=&quot;_blank&quot;&gt;Debian&lt;/a&gt; (&lt;strong&gt;Debian-like&lt;/strong&gt;), o arquivo para fazer modifica&amp;ccedil;&amp;atilde;o &amp;eacute; &lt;span&gt;&lt;code&gt;/etc/sysctl.d/30-postgresql-shm.conf&lt;span&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; Efetivar a modifica&amp;ccedil;&amp;atilde;o sem reiniciar o servidor, &amp;eacute;:&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;strong&gt;sysctl -p /etc/sysctl.d/30-postgresql-shm.conf&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;twttr_button&quot;&gt;
				&lt;a href=&quot;http://twitter.com/share?url=http://www.midstorm.org/~fike/weblog/2011/12/19/debian-sysctl-e-postgresql/&amp;amp;text=Debian, Sysctl e postgresql&quot; target=&quot;_blank&quot; title=&quot;Click here if you liked this article&quot;&gt;
					&lt;img src=&quot;http://www.midstorm.org/~fike/weblog/wp-content/plugins/twitter-plugin/images/twitt.gif&quot; alt=&quot;Twitt&quot; /&gt;
				&lt;/a&gt;
			&lt;/div&gt;</content:encoded>
	<dc:date>2011-12-20T01:01:20+00:00</dc:date>
	<dc:creator>Fernando Ike</dc:creator>
</item>
<item rdf:about="http://tas.eti.br/blog/?p=692">
	<title>Tiago Silva: PostgreSQL: O que são tablespaces?</title>
	<link>http://tas.eti.br/blog/2011/12/postgresql-o-que-sao-tablespaces/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=postgresql-o-que-sao-tablespaces</link>
	<content:encoded>&lt;p&gt;&lt;span&gt; &lt;!--
google_ad_client = &quot;ca-pub-7113648014835203&quot;;
/* ad-post-top */
google_ad_slot = &quot;2716329990&quot;;
google_ad_width = 468;
google_ad_height = 60;
//--&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Olá meus queridos!&lt;/p&gt;
&lt;p&gt;Na semana passada eu abordei a questão dos&lt;a title=&quot;Veja o post sobre índices, vale a pena!&quot; href=&quot;http://tas.eti.br/blog/2011/11/postgresql-manipulando-indices/&quot; target=&quot;_blank&quot;&gt; índices no PostgreSQL&lt;/a&gt;, onde citei que eles podem estar dentro de um dado &lt;strong&gt;tablespace&lt;/strong&gt;, pois bem, neste artigo irei abordar como funciona e para que você pode utilizar esse fantástico recurso do nosso querido Sistema Gerenciador de Banco de Dados &amp;#8211; Postgres.&lt;/p&gt;
&lt;p&gt;Você se lembra dos &lt;a title=&quot;Veja o post que fiz sobre Schemas&quot; href=&quot;http://tas.eti.br/blog/2011/09/utilizando-schemas-no-postgresql/&quot; target=&quot;_blank&quot;&gt;Schemas&lt;/a&gt;, que fazem a divisão lógica do banco? Pois bem, um tablespace faz a divisão física, isto é, podemos determinar onde os elementos do banco de dados &amp;#8211; leia-se tabelas e índices &amp;#8211; irão ficar. Mas como assim &amp;#8220;irão ficar&amp;#8221;? Simples: você pode definir um dado lugar no disco rígido, ou até mesmo outro disco!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://tas.eti.br/blog/wp-content/uploads/2011/11/logo_w_elephant.png&quot;&gt;&lt;img class=&quot;aligncenter&quot; title=&quot;logo_w_elephant&quot; src=&quot;http://tas.eti.br/blog/wp-content/uploads/2011/11/logo_w_elephant.png&quot; alt=&quot;&quot; width=&quot;250&quot; height=&quot;198&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Imagine que você tem um índice que é muito acessado e uma tabela que muito raramente é acessada, pois bem, você pode colocar esse índice em um disco SCSI e a tal tabela em um HD SATA comum, tendo em vista que o adaptador SCSI é muito veloz em comparação com o SATA. Fazendo isso você terá um ganho de desempenho muito significativo.&lt;/p&gt;
&lt;p&gt;Veja abaixo as instruções SQL para a manipulação dos tablespaces.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sintaxe para a criação de um tablespace:&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;brush: sql; gutter: true; first-line: 1&quot;&gt;CREATE TABLESPACE “hd_scsi” LOCATION '/mnt/seu_scsi'&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Criar tabela dentro de um dado tablespace:&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;brush: sql; gutter: true; first-line: 1&quot;&gt;CREATE TABLE foo (
    id integer,
    nome varchar(150),
    primary key(id)
) TABLESPACE hd_scsi;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Veja como alterar um índice de tablespace:&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;brush: sql; gutter: true; first-line: 1; highlight: [1]&quot;&gt;SELECT ‘ALTER INDEX’, n.nspname AS schemaname , ‘.’ ,c.relname AS tablename, ‘SET TABLESPACE hd_scsi;’
FROM pg_class c
LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
LEFT JOIN pg_tablespace t ON t.oid = c.reltablespace
LEFT JOIN pg_index x ON x.indexrelid = c.oid
WHERE c.relkind = ‘i’::”char”
AND x.indisprimary != ‘t’
AND x.indisunique != ‘t’
AND nspname NOT IN
(‘dbateste’,'information_schema’,'pg_catalog’,'pg_temp_1′,’pg_toast’,'postgres’,'publico’,'public’)
ORDER BY n.nspname&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Veja como alterar uma tabela de tablespace:&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;brush: sql; gutter: true; first-line: 1; highlight: [1]&quot;&gt;SELECT 'ALTER TABLE' ,n.nspname AS schemaname,’.', c.relname AS tablename, ‘SET TABLESPACE hd_scsi;’
FROM pg_class c
LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
LEFT JOIN pg_tablespace t ON t.oid = c.reltablespace
WHERE c.relkind = ‘r’::”char”
AND nspname NOT IN
(‘dbateste’,'information_schema’,'pg_catalog’,'pg_temp_1′,’pg_toast’,'postgres’,'publico’,'public’)
ORDER BY n.nspname&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Referências:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://keniamilene.wordpress.com/2008/03/14/alterando-tablespace-de-tabelas-e-indices-no-postgresql/&quot; target=&quot;_blank&quot;&gt;Kenia Milene G.’s Blog - Alterando Tablespace de Tabelas e Indices no PostgreSQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.postgresql.org/docs/8.1/static/manage-ag-tablespaces.html&quot; target=&quot;_blank&quot;&gt;PostgreSQL Manuals &amp;#8211; Tablespaces&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://postgresqlbr.blogspot.com/2007/06/tablespaces-no-postgresql.html&quot; target=&quot;_blank&quot;&gt;PostgreSQL BR &amp;#8211; Tablespaces no PostgreSQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.devmedia.com.br/post-1818-Tablespace.html&quot; target=&quot;_blank&quot;&gt;Devmedia &amp;#8211; Tablespace&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Semana que vem irei abordar o funcionamento das &lt;strong&gt;triggers&lt;/strong&gt;!&lt;/p&gt;
&lt;p&gt;Abraços,&lt;/p&gt;
&lt;p&gt;&lt;a title=&quot;Quem é o autor desse blog?&quot; href=&quot;http://tas.eti.br/blog/sobre/&quot; target=&quot;_blank&quot;&gt;Tiago&lt;/a&gt;.&lt;br /&gt;
&lt;span&gt; &lt;!--
google_ad_client = &quot;ca-pub-7113648014835203&quot;;
/* ad-post-button */
google_ad_slot = &quot;5761791599&quot;;
google_ad_width = 468;
google_ad_height = 60;
//--&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;linkedin_share_container&quot;&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;http://twitter.com/share?url=http://tas.eti.br/blog/2011/12/postgresql-o-que-sao-tablespaces/&amp;amp;via=tiagotas&amp;amp;text=PostgreSQL: O que são tablespaces?&amp;amp;related=:&amp;amp;lang=en&amp;amp;count=horizontal&quot; class=&quot;twitter-share-button&quot;&gt;Tweet&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;http://twitter.com/share?url=http://tas.eti.br/blog/2011/12/postgresql-o-que-sao-tablespaces/&amp;amp;via=tiagotas&amp;amp;text=PostgreSQL: O que são tablespaces?&amp;amp;related=:&amp;amp;lang=en&amp;amp;count=horizontal&quot; class=&quot;twitter-share-button&quot;&gt;Tweet&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;AWD_like_button &quot;&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2011-12-07T03:00:29+00:00</dc:date>
</item>
<item rdf:about="http://andrecf.kinghost.net/freebsd/?p=278">
	<title>André Fernandes: SQL para obter a descrição de uma função em PostgreSQL – Parte 2</title>
	<link>http://andrecf.kinghost.net/freebsd/2011/12/06/sql-para-obter-a-descricao-de-uma-funcao-em-postgresql-parte-2/</link>
	<content:encoded>Outra forma de mostrar a descrição de uma função em postgreSQL é SELECT pg_get_functiondef&amp;#40;oid&amp;#41; FROM pg_proc WHERE proname ilike 'nome_funcao'; Nota: trocar nome_funcao pelo nome da função desejada. Abraços!</content:encoded>
	<dc:date>2011-12-06T18:01:23+00:00</dc:date>
</item>
<item rdf:about="http://www.midstorm.org/~fike/weblog/?p=1101">
	<title>Fernando Ike: Parabéns! Excelente PGBR 2011</title>
	<link>http://www.midstorm.org/~fike/weblog/2011/11/10/parabens-excelente-pgbr-2011/</link>
	<content:encoded>&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; height=&quot;90&quot; src=&quot;http://pgbr.postgresql.org.br/2011/imgs/divulgue_logo_data.jpg&quot; width=&quot;327&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Participei de um excelente evento, provavelmente melhor evento PostgreSQL realizado no Brasil. Palestras de excelente n&amp;iacute;vel t&amp;eacute;cnico, boa organiza&amp;ccedil;&amp;atilde;o de stand, coffe break, happy hour, etc. Tudo andou muito bem, os dois Kahuna (Telles e Fl&amp;aacute;vio) est&amp;atilde;o de parab&amp;eacute;ns!!!&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;N&amp;atilde;o pude ficar at&amp;eacute; o fim pois tinha um outro evento importante (Rubyconf era nos mesmo dias e gostaria de ir mas n&amp;atilde;o era esse evento). &lt;img src=&quot;http://www.midstorm.org/~fike/weblog/wp-includes/images/smilies/icon_razz.gif&quot; alt=&quot;:P&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;img alt=&quot;&quot; height=&quot;232&quot; src=&quot;http://1.bp.blogspot.com/-vMHEv4sDoJM/TbwXGI37z4I/AAAAAAAAACo/su5-87FC4SQ/s1600/pearl-jam.jpg&quot; width=&quot;300&quot; /&gt; &amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; Sobre Pearl Jam fica para outro post&amp;#8230;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; Voltando, o evento foi extraordin&amp;aacute;rio por&amp;eacute;m alguma coisa mudou e n&amp;atilde;o foi o evento. Acho que eu mudei, n&amp;atilde;o tenho a mesma pegada (empolga&amp;ccedil;&amp;atilde;o) por coisas ligadas &amp;agrave; Infraestrutura.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; Antes que digam que sou o maior defensor do mundo NoSQL, n&amp;atilde;o sou defensor de uma tecnologia. A minha quest&amp;atilde;o, talvez, esteja ligada aos desafios em desenvolvimento de sistemas (principalmente programa&amp;ccedil;&amp;atilde;o paralela e/ou funcional) e arquitetura distribu&amp;iacute;das. Meu tempo de pegar um carro e passar horas/dias mexendo nele para conseguir o melhor desempenho poss&amp;iacute;vel j&amp;aacute; passou.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; Nada contra para quem continua fazendo, o mundo precisa muito de profissionais assim. Talvez parte da minha &amp;quot;frustra&amp;ccedil;&amp;atilde;o&amp;quot; seja pelo debate que teve na mesa redonda &amp;quot;O mercado de servi&amp;ccedil;os em PostgreSQL no Brasil&amp;quot;, esperava um pouco mais dos &amp;quot;empres&amp;aacute;rios&amp;quot;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;Acho que a quest&amp;atilde;o &amp;eacute; que infraestrutura &amp;eacute; commodity, como banco de dados &amp;eacute; parte da infraestrutura e ser&amp;aacute; cada vez um nicho segmentado.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;Vamos ver daqui tr&amp;ecirc;s meses se eu fiquei pirado na batatinha ou n&amp;atilde;o. &lt;img src=&quot;http://www.midstorm.org/~fike/weblog/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; height=&quot;545&quot; src=&quot;http://1.bp.blogspot.com/_1Ac2sgf50jM/TVLDZL5gQ5I/AAAAAAAAATk/D5z9TyST8I0/s1600/o+pensador+rodin.jpg&quot; width=&quot;400&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;PS. Alias, minha apresenta&amp;ccedil;&amp;atilde;o n&amp;atilde;o teve pergunta. Ent&amp;atilde;o, foi um sucesso total ou fracasso retumbante. Comenta a&amp;iacute;&amp;#8230;&lt;/p&gt;
&lt;div class=&quot;twttr_button&quot;&gt;
				&lt;a href=&quot;http://twitter.com/share?url=http://www.midstorm.org/~fike/weblog/2011/11/10/parabens-excelente-pgbr-2011/&amp;amp;text=Parabéns! Excelente PGBR 2011&quot; target=&quot;_blank&quot; title=&quot;Click here if you liked this article&quot;&gt;
					&lt;img src=&quot;http://www.midstorm.org/~fike/weblog/wp-content/plugins/twitter-plugin/images/twitt.gif&quot; alt=&quot;Twitt&quot; /&gt;
				&lt;/a&gt;
			&lt;/div&gt;</content:encoded>
	<dc:date>2011-12-02T14:10:38+00:00</dc:date>
	<dc:creator>Fernando Ike</dc:creator>
</item>
<item rdf:about="http://www.midstorm.org/~telles/?p=819">
	<title>Fabio Telles: Postgres, PGBR2011, Timbira e o universo.</title>
	<link>http://www.midstorm.org/~telles/2011/12/02/postgres-pgbr2011-timbira-e-o-universo/</link>
	<content:encoded>&lt;p&gt;Agora que o PGBR2011 está quase acabando, que as últimas prestações de contas estão terminando, os fornecedores sendo pagos e as últimas palestras sendo publicadas no site, eu me deparei com mais uma &lt;a href=&quot;http://www.midstorm.org/~fike/weblog/2011/11/10/parabens-excelente-pgbr-2011/&quot;&gt;boa provocação&lt;/a&gt; do Fernando Ike. Ok, o post é do dia 10/11, mas eu só vi hoje. Ainda estou bem atrasado com um monte de coisas e hoje de manhã comecei a passar varias coisas em revista. Então deu aquela vontade de escrever&amp;#8230;.&lt;/p&gt;
&lt;p&gt;O #PGBR2011 foi um marco para mim. Morreu aquele jeito moleque de juntar a turma e ficou claro que a &amp;#8220;pegada&amp;#8221; da comunidade mudou. A turminha que se conheceu há 10 anos atrás nos FISLs da vida cresceu e tem desafios para lá de cabeludos na mão. Eu mesmo jamais imaginaria que estaria trabalhando com um dos cases mais importantes de Postgres do Brasil há 10 anos atrás. Acho que eu nem imaginava que daria para fazer o que a gente faz com o Postgres hoje naquele tempo. Mas a gente apostou, eu consegui abandonar a minha vida de DBA Oracle e estou feliz da vida me matando de trabalhar com Postgres quase em tempo integral (aka 24/7).&lt;/p&gt;
&lt;p&gt;O evento foi num hotel. Não foi numa universidade, não foi num lugar barato. E para a nossa surpresa: fomos nós mesmos que pagamos boa parte da conta: Eu, o Euler, Fabrízio, o Charly, o Coutinho, etc. Nós patrocinamos o evento. Nós pudemos tirar $$ do bolso para fazer o evento acontecer. Para quem não sabe, eu e o Euler Taveira, somos Sócios da &lt;a href=&quot;http://www.timbira.com.br/timbira&quot;&gt;Timbira&lt;/a&gt;, que está já há uns 2 anos na estrada. A gente nunca teve muita pressa de crescer. Nem no nosso site a gente investiu muito. Na verdade a gente está tendo de expandir para dar conta da demanda. Não, ninguém está ganhando muito dinheiro. Talvez empresas maiores como a Dextra e a 4Linux estejam melhor. Certamente a VMware vai bem. Mas estamos vivendo disso. No caso da Timbira, vivendo &lt;strong&gt;só&lt;/strong&gt; disso. E temos encontrado bons parceiros no caminho. Direta ou indiretamente, estivemos presentes em várias palestras comigo, com o Euler Taveira, com o Dickson Guedes, com o Roberto Mello, com o Fabrízio Mello e tem mais um que logo logo deve estar finalmente assumindo seu lugar junto a Timbira. E tem mais, eu, o Euler e o Guedes (os 3 dos 4 fundadores da Timbira) ganharam prêmios pela nossa atuação na comunidade durante o evento. Não, nenhum de nós fez parte da comissão que elegeu os premiados. Acho que dificilmente vamos encontrar alguém que respira mais Postgres no Brasil do que o Euler Taveira. Não foi por acaso que ele foi nomeado para 4 das 5 categorias do &amp;#8220;Prêmio PGBR2011&amp;#8243;. É realmente uma honra ter estes caras como colegas de trabalho. Mas eu também estou finalmente dando meus pulinhos. Hoje eu teria tanta coisa para escrever aqui no blog que eu nem sei por onde começar. Preciso de um pouco de tempo para voltar a escrever para valer.&lt;/p&gt;
&lt;p&gt;Não é pouca coisa né? Mas este ano foi a primeira vez que mandamos fazer um folder da Timbira. A gente passa tanto tempo trabalhando com Postgres que não tivemos tempo de &amp;#8220;aparelhar&amp;#8221; a nossa empresa. Sim, temos que melhorar isso. Bom, mas tirando a propaganda toda, (que é a primeira vez que eu cito aqui no blog), a questão é que agora a nossa pegada mudou. Não somos mais moleques. Ninguém mais é. Mesmo o Diogo Biazus com o seu novo visual Punk, sabe que a fase da molecagem passou. Ele também é empresário. E são empresários a maioria dos palestrantes que estiveram no evento. Nem tudo são flores. Eu descobri por exemplo que o Carlos Smanioto, um dos ícones que começou a publicar os primeiros artigos sobre Postgres na SQL Magazine estava com dificuldades alguns meses antes do PGBR2011. Outros dois grandes colegas excepcionais ficaram desempregado recentemente. Eu também tenho minhas dívidas para pagar&amp;#8230;. Não estamos vivendo de brisa. Estamos trabalhando muito, errando muito e aprendendo muito. No entanto, me arrisco a dizer que estamos felizes. Não é fácil explicar isso para nossas famílias. Mas é bem verdade. Eu posso dizer que trabalho com o que eu gosto e isso não é para qualquer um.&lt;/p&gt;
&lt;p&gt;Mas voltando a provocação do Sr. Fernando Ike. Eu tenho sempre medo do que esse cara diz, pois ele tem a mania de acertar &amp;#8211; ele também tem a mania de ser sorteado para alguma coisa em todo evento que vai. Já vi ele ser sorteado 2 vezes num único evento. E essa história de banco de dados virar comodity, já está escrito nas estrelas faz um tempo. Quando você vira especialista numa coisa, não quer que ela deixe de existir, pois você se dedicou por anos a fio para adquirir um bom domínio naquilo. Os bancos da dados relacionais não vão deixar de existir. Mas quem acha que eles vão continuar com o seu &amp;#8220;reinado&amp;#8221;, como o centro do universo que muito DBA acha que é&amp;#8230; já caiu do cavalo. Isso está ruindo mesmo. Claro, isso que não muda tão rápido assim. Ninguém acha que as transações bancárias vão começar a rodar em bases NoSQL. Mas é inútil negar que tem muita informação que não precisa de um banco de dados transacional 100% ACID para cuidar. E os novos desafios estão aí para quem quiser enxergar ou não.&lt;/p&gt;
&lt;p&gt;Enquanto a adoção do Postgres cresce no mundo todo e notoriamente no Brasil, um novo movimento surge quebrando paradigmas e a gente vai ter de aprender a conviver com isso. A palestra da &lt;a href=&quot;http://pgbr.postgresql.org.br/2011/palestras.php?id=66&quot;&gt;VMware&lt;/a&gt; estava lá para quem quisesse enxergar. A revolução acontecendo bem na nossa cara. Eu sei que o Ike tem uma visão clara disso. Quando você se afasta e olha mais de longe, consegue ver o mundo girar. Esse negócio de nuvem&amp;#8230; tem muita balela e gente querendo vender coisa velha com nome novo. Mas quando eu olho o número de clientes nossos que estão colocando seus software como &lt;a href=&quot;http://pt.wikipedia.org/wiki/Software_como_servi%C3%A7o&quot;&gt;SaaS&lt;/a&gt;, é notavel que as coisas estão mudando. E olha só, a Locaweb estava lá no evento&amp;#8230;&lt;/p&gt;
&lt;p&gt;É pessoal, eu não sei o próximo PGBR vai rolar ou como ele será. Sei que é bem possível que ele ocorra. Não sei se eu terei tempo para me dedicar a ele como me dediquei em 2011. Nem se as minhas prioridades estarão neste rumo até lá. Mas o mundo está girando&amp;#8230; independente de nós sentirmos isso ou não. Os polos magnéticos vão se inverter, uma nova era do gelo vai vir e um novo super continente vai se formar. Precisamos mesmo olhar para fora da caixa. Mas enquanto isso, posso dizer que o Postgres tem me surpreendido muito. Tem se mostrado um grande parceiro, e trabalhar com ele tem sido divertido.&lt;/p&gt;
&lt;p&gt;Bom, agora tem um monte de coisas para fazer aqui, até a próxima cervejada pessoal!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OBS&lt;/strong&gt;: Antes que alguém pergunte&amp;#8230; o &lt;a href=&quot;http://pt.wikipedia.org/wiki/Timbira_(povos)&quot;&gt;nome Timbira&lt;/a&gt; foi escolhido pelo Euler que tem um &lt;a href=&quot;http://www.timbira.com/&quot;&gt;blog&lt;/a&gt; com esse nome bem antes da &amp;#8220;Empresa Timbira nascer&amp;#8221;. Ele ajudou muito na tradução da documentação e internacionalização do Postgres. Como ele é Goiano e tem lá uma paixão louca pelo Brasil, eu acho que escolher um nome indigena para a nossa &amp;#8220;Empresa Brasileira de Postgres&amp;#8221; faz até muito sentido. Claro, é bem engraçado quando as pessoas pedem para repetir o nome da empresa umas 2 ou 3 vezes até entender. Todo mundo espera um buzzword em inglês. Mas depois de um tempo, eu achei o nome tão bacana quanto continuar escrevendo um blog em pt_BR e fazer parte do nosso &lt;a href=&quot;http://planeta.postgresql.org.br/&quot;&gt;planeta&lt;/a&gt; tupiniquim, &lt;img src=&quot;http://www.midstorm.org/~telles/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt;  . De toda forma, quanto mais masterfucking é o cliente, mais legal é ver a Timbira entrando lá de verde e amarelo&amp;#8230;&lt;/p&gt;</content:encoded>
	<dc:date>2011-12-02T11:51:54+00:00</dc:date>
</item>
<item rdf:about="tag:blogger.com,1999:blog-3371915898459901668.post-5892626199986025464">
	<title>Claudio Bezerra Leopoldino: Criação de Crosstabs no PostgreSQL</title>
	<link>http://postgresqlbr.blogspot.com/2011/11/criacao-de-crosstabs-no-postgresql.html</link>
	<content:encoded>Você já criou uma tabela cruzada, ou &lt;i&gt;crosstab&lt;/i&gt;, utilizando SQL? Você sabia que era possível? Possivelmente você nunca precisou, mas criar &lt;i&gt;crosstabs&lt;/i&gt; é um recurso à disposição que pode ser bastante útil!&lt;br /&gt;&lt;br /&gt;Tabelas cruzadas apresentam mais de uma dimensão de forma integrada aos usuários, sendo uma forma importante para a melhor visualização de dados consolidados. Geralmente o cruzamento de dados neste tipo de tabela é feito na camada de apresentação das aplicações ou em componentes geradores de relatórios, mas isso não impede que você também possa implementar &lt;i&gt;crosstabs&lt;/i&gt; via banco de dados. &lt;br /&gt;&lt;br /&gt;Vamos exemplificar a criação de &lt;i&gt;crosstabs&lt;/i&gt; no postgresql utilizando as tabelas abaixo: &lt;br /&gt;&lt;br /&gt;* Tabela Loja - Basicamente apresenta a descrição da loja&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-- Tabela Loja&lt;br /&gt;CREATE TABLE loja (codigo integer, nomeloja varchar(20), observacao varchar(250));&lt;br /&gt;INSERT INTO loja VALUES (1, 'Loja 1', 'Matriz');&lt;br /&gt;INSERT INTO loja VALUES (2, 'Loja 2', 'Filial 1');&lt;br /&gt;INSERT INTO loja VALUES (3, 'Loja 3', 'Filial 2');&lt;br /&gt;INSERT INTO loja VALUES (4, 'Loja 4', 'Filial 3');&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;* Tabela Vendas - Apresenta as vendas realizadas para cada mês em cada loja.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-- Tabela Vendas&lt;br /&gt;&lt;br /&gt;CREATE TABLE vendas (seqvenda integer, codloja integer, mesvenda integer, valor integer);&lt;br /&gt;INSERT INTO vendas VALUES (1, 1, 1, 100);&lt;br /&gt;INSERT INTO vendas VALUES (2, 1, 2, 100);&lt;br /&gt;INSERT INTO vendas VALUES (3, 1, 3, 100);&lt;br /&gt;INSERT INTO vendas VALUES (4, 1, 1, 100);&lt;br /&gt;INSERT INTO vendas VALUES (5, 2, 2, 100);&lt;br /&gt;INSERT INTO vendas VALUES (6, 2, 3, 100);&lt;br /&gt;INSERT INTO vendas VALUES (7, 2, 1, 100);&lt;br /&gt;INSERT INTO vendas VALUES (8, 2, 2, 100);&lt;br /&gt;INSERT INTO vendas VALUES (9, 4, 3, 100);&lt;br /&gt;INSERT INTO vendas VALUES (10, 4, 1, 100);&lt;br /&gt;INSERT INTO vendas VALUES (11, 4, 2, 100);&lt;br /&gt;INSERT INTO vendas VALUES (12, 4, 3, 100);&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Vamos fazer consultas para mostrar as vendas com base em duas dimensões: a loja que fez a vendas e o período (mês) das vendas.&lt;br /&gt;&lt;br /&gt;Em primeiro lugar, vamos colocar como colunas as lojas da tabela pai (loja), e como linhas as vendas da tabela filha, agrupando os dados por mês. A cláusula CASE é importante para atribuir o valor 0 (zero) quando a venda não for da loja a ser apresentada na coluna.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;span&gt;-- CROSSTAB &lt;/span&gt;&lt;br /&gt;&lt;span&gt;-- COLUNAS - LOJAS&lt;/span&gt;&lt;br /&gt;&lt;span&gt;-- LINHAS - Vendas em cada Mês&lt;/span&gt;&lt;br /&gt;&lt;span&gt;SELECT &lt;/span&gt;&lt;br /&gt;&lt;span&gt;(CASE vendas.mesvenda WHEN 1 THEN 'JAN' WHEN 2 THEN 'FEV' WHEN 3 THEN 'MAR' ELSE 'ERRO' END) AS MES,&lt;/span&gt;&lt;br /&gt;&lt;span&gt;SUM (CASE vendas.codloja WHEN 1 THEN vendas.valor ELSE 0 END) AS MATRIZ,&lt;/span&gt;&lt;br /&gt;&lt;span&gt;SUM (CASE vendas.codloja WHEN 2 THEN vendas.valor ELSE 0 END) AS FILIAL_1,&lt;/span&gt;&lt;br /&gt;&lt;span&gt;SUM (CASE vendas.codloja WHEN 3 THEN vendas.valor ELSE 0 END) AS FILIAL_2,&lt;/span&gt;&lt;br /&gt;&lt;span&gt;SUM (CASE vendas.codloja WHEN 4 THEN vendas.valor ELSE 0 END) AS FILIAL_3&lt;/span&gt;&lt;br /&gt;&lt;span&gt;FROM loja&lt;/span&gt;&lt;br /&gt;&lt;span&gt;INNER JOIN vendas&lt;/span&gt;&lt;br /&gt;&lt;span&gt;ON loja.codigo = vendas.codloja&lt;/span&gt;&lt;br /&gt;&lt;span&gt;GROUP BY vendas.mesvenda&lt;/span&gt;&lt;br /&gt;&lt;span&gt;ORDER BY vendas.mesvenda;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;O resultado da consulta mostra inclusive a filial 2, que esteve fechada durante o período: &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;mes | matriz | filial_1 | filial_2 | filial_3 &lt;/span&gt;&lt;br /&gt;&lt;span&gt;-----+--------+----------+----------+----------&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;JAN |&amp;nbsp;&amp;nbsp;&amp;nbsp; 200 |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 100 |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 100&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;FEV |&amp;nbsp;&amp;nbsp;&amp;nbsp; 100 |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 200 |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 100&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;MAR |&amp;nbsp;&amp;nbsp;&amp;nbsp; 100 |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 100 |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 200&lt;/span&gt;&lt;br /&gt;&lt;span&gt;(3 registros)&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Agora vamos fazer uma inversão: vamos colocar como colunas as lojas da tabela filha, vendas, e como linhas as informações da tabela pai, loja, com os dados agrupados por loja. A cláusula CASE é importante para atribuir o valor 0 (zero) quando a venda não for do mês a ser apresentado na coluna.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span&gt;-- CROSSTAB 2&lt;/span&gt;&lt;br /&gt;&lt;span&gt;-- COLUNAS - Vendas em cada Mês&lt;/span&gt;&lt;br /&gt;&lt;span&gt;-- LINHAS - LOJAS&lt;/span&gt;&lt;br /&gt;&lt;span&gt;SELECT &lt;/span&gt;&lt;br /&gt;&lt;span&gt;(CASE loja.codigo WHEN 1 THEN 'MATRIZ' WHEN 2 THEN 'FILIAL 1' WHEN 3 THEN 'FILIAL 2' WHEN 4 THEN 'FILIAL 3' ELSE 'ERRO' END) AS LOJA,&lt;/span&gt;&lt;br /&gt;&lt;span&gt;SUM (CASE vendas.mesvenda WHEN 1 THEN vendas.valor ELSE 0 END) AS JAN,&lt;/span&gt;&lt;br /&gt;&lt;span&gt;SUM (CASE vendas.mesvenda WHEN 2 THEN vendas.valor ELSE 0 END) AS FEV,&lt;/span&gt;&lt;br /&gt;&lt;span&gt;SUM (CASE vendas.mesvenda WHEN 3 THEN vendas.valor ELSE 0 END) AS MAR&lt;/span&gt;&lt;br /&gt;&lt;span&gt;FROM loja&lt;/span&gt;&lt;br /&gt;&lt;span&gt;INNER JOIN vendas&lt;/span&gt;&lt;br /&gt;&lt;span&gt;ON loja.codigo = vendas.codloja&lt;/span&gt;&lt;br /&gt;&lt;span&gt;GROUP BY loja.codigo&lt;/span&gt;&lt;br /&gt;&lt;span&gt;ORDER BY LOJA;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Resultado da consulta: &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; loja&amp;nbsp;&amp;nbsp; | jan | fev | mar &lt;/span&gt;&lt;br /&gt;&lt;span&gt;----------+-----+-----+-----&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;FILIAL 1 | 100 | 200 | 100&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;FILIAL 3 | 100 | 100 | 200&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;MATRIZ&amp;nbsp;&amp;nbsp; | 200 | 100 | 100&lt;/span&gt;&lt;br /&gt;&lt;span&gt;(3 registros)&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;O exemplo acima pode ser incrementado e melhorado de várias formas (por exemplo, as tabelas não têm índices). Se você tem alguma sugestão ou forma alternativa de fazer &lt;i&gt;crosstabs&lt;/i&gt; ou de melhorar os exemplos abaixo, não deixe de postar um comentário neste post!&lt;br /&gt;&lt;br /&gt;Obs.: Existe um módulo do postgresql já bastante estável, chamado tablefunc que apresenta funções para a criação de tabelas cruzadas. É uma forma de criar &lt;i&gt;crosstabs&lt;/i&gt; com menos trabalho, mas também com menos diversão e portabilidade! Mais informações sobre o tablefunc &lt;a href=&quot;http://www.postgresql.org/docs/9.1/static/tablefunc.html&quot;&gt;aqui&lt;/a&gt;.&lt;div class=&quot;blogger-post-footer&quot;&gt;Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3371915898459901668-5892626199986025464?l=postgresqlbr.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2011-11-25T14:59:04+00:00</dc:date>
	<dc:creator>cbleopoldino</dc:creator>
</item>
<item rdf:about="http://www.postgresql.org.br/16915 at http://www.postgresql.org.br">
	<title>PostgreSQL Brasil: PGDay Roraima</title>
	<link>http://www.postgresql.org.br/eventos/pgday/rr</link>
	<content:encoded>&lt;p&gt;&lt;strong&gt;Agradecimentos&lt;/strong&gt; PGDay RR&lt;/p&gt;
&lt;p&gt;A coordena&amp;ccedil;&amp;atilde;o do evento PGDay Roraima, agradece aos participantes que mostraram-se interessados na tecnologia de banco de dados PostgreSQL e compareceram ao evento. Tamb&amp;eacute;m um agradecimento ao CECOMP/DARI, CECOMP/DSM que apoiaram o evento de maneira geral e estiveram presentes durante as palestras e minicursos. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Justificativa quanto ao PGDay RORAIMA&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Atualmente o mundo inclusive o estado de Roraima vem buscando atualizar-se no que tange as tecnologias da informa&amp;ccedil;&amp;atilde;o. E o fato que o maior patrim&amp;ocirc;nio das institui&amp;ccedil;&amp;otilde;es, s&amp;atilde;o os dados armazenados em seus bancos de dados, podemos ressaltar que o processamento destes dados resultam em informa&amp;ccedil;&amp;otilde;es e a partir destas informa&amp;ccedil;&amp;otilde;es &amp;eacute; poss&amp;iacute;vel gerar o &amp;ldquo;conhecimento&amp;rdquo; necess&amp;aacute;rio para a sobreviv&amp;ecirc;ncia das institui&amp;ccedil;&amp;otilde;es. Com isso o nosso anseio em efetivar tal evento, &amp;eacute; justific&amp;aacute;vel.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;O que &amp;eacute;?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Postgres ou PostgreSQL &amp;eacute; um projeto de Sistema Gerenciador de Banco de Dados open-source que foi iniciado em 1986, na Universidade de Berkeley, na Calif&amp;oacute;rnia.&lt;/p&gt;
&lt;p&gt;PGDay, ou Dia do Postgres, &amp;eacute; um evento n&amp;atilde;o t&amp;atilde;o formal quanto o PGBR (Confer&amp;ecirc;ncia sobre PostgreSQL no Brasil) e de car&amp;aacute;ter regional, podendo ser realizado com poucas pessoas em qualquer/v&amp;aacute;rios estados do Pa&amp;iacute;s.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.postgresql.org.br/eventos/pgday/rr&quot; target=&quot;_blank&quot;&gt;leia mais&lt;/a&gt;&lt;/p&gt;</content:encoded>
	<dc:date>2011-11-22T15:44:23+00:00</dc:date>
</item>
<item rdf:about="http://www.midstorm.org/~fike/weblog/?p=1105">
	<title>Fernando Ike: Apresentação: Escalabilidade, as modas e No(SQL)</title>
	<link>http://www.midstorm.org/~fike/weblog/2011/11/11/apresentacao-escalabilidade-as-modas-e-nosql/</link>
	<content:encoded>&lt;div id=&quot;__ss_10109325&quot;&gt;&lt;strong&gt;&lt;a href=&quot;http://www.slideshare.net/fernandoike/escalabilidade-as-modas-nosql&quot; target=&quot;_blank&quot; title=&quot;Escalabilidade, as modas, (No)SQL&quot;&gt;Escalabilidade, as modas, (No)SQL&lt;/a&gt;&lt;/strong&gt; &lt;/div&gt;
&lt;div&gt;View more &lt;a href=&quot;http://www.slideshare.net/&quot; target=&quot;_blank&quot;&gt;presentations&lt;/a&gt; from &lt;a href=&quot;http://www.slideshare.net/fernandoike&quot; target=&quot;_blank&quot;&gt;Fernando Ike&lt;/a&gt;&lt;/div&gt;

&lt;div class=&quot;twttr_button&quot;&gt;
				&lt;a href=&quot;http://twitter.com/share?url=http://www.midstorm.org/~fike/weblog/2011/11/11/apresentacao-escalabilidade-as-modas-e-nosql/&amp;amp;text=Apresentação: Escalabilidade, as modas e No(SQL)&quot; target=&quot;_blank&quot; title=&quot;Click here if you liked this article&quot;&gt;
					&lt;img src=&quot;http://www.midstorm.org/~fike/weblog/wp-content/plugins/twitter-plugin/images/twitt.gif&quot; alt=&quot;Twitt&quot; /&gt;
				&lt;/a&gt;
			&lt;/div&gt;</content:encoded>
	<dc:date>2011-11-11T11:13:33+00:00</dc:date>
	<dc:creator>Fernando Ike</dc:creator>
</item>
<item rdf:about="http://www.midstorm.org/~fike/weblog/?p=1097">
	<title>Fernando Ike: Algumas bobagens de PostgreSQL num evento NoSQL</title>
	<link>http://www.midstorm.org/~fike/weblog/2011/11/10/algumas-bobagens-de-postgresql-num-evento-nosql/</link>
	<content:encoded>&lt;p&gt;&amp;nbsp; &amp;nbsp;J&amp;aacute; tem alguns dias mas falei algumas bobagens sobre &amp;nbsp;PostgreSQL e a nuvem num evento de NoSQL, ali&amp;aacute;s foi um evento muito bacana. T&amp;aacute; a&amp;iacute; embaixo&amp;#8230;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;__ss_10108925&quot;&gt;&lt;strong&gt;&lt;a href=&quot;http://www.slideshare.net/fernandoike/postgres-nuvens&quot; title=&quot;Postgres nuvens&quot;&gt;Postgres nuvens&lt;/a&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div&gt;View more &lt;a href=&quot;http://www.slideshare.net/&quot;&gt;presentations&lt;/a&gt; from &lt;a href=&quot;http://www.slideshare.net/fernandoike&quot;&gt;Fernando Ike&lt;/a&gt;.&lt;/div&gt;

&lt;div class=&quot;twttr_button&quot;&gt;
				&lt;a href=&quot;http://twitter.com/share?url=http://www.midstorm.org/~fike/weblog/2011/11/10/algumas-bobagens-de-postgresql-num-evento-nosql/&amp;amp;text=Algumas bobagens de PostgreSQL num evento NoSQL&quot; target=&quot;_blank&quot; title=&quot;Click here if you liked this article&quot;&gt;
					&lt;img src=&quot;http://www.midstorm.org/~fike/weblog/wp-content/plugins/twitter-plugin/images/twitt.gif&quot; alt=&quot;Twitt&quot; /&gt;
				&lt;/a&gt;
			&lt;/div&gt;</content:encoded>
	<dc:date>2011-11-10T19:38:41+00:00</dc:date>
	<dc:creator>Fernando Ike</dc:creator>
</item>
<item rdf:about="http://www.midstorm.org/~telles/?p=816">
	<title>Fabio Telles: PGBR2011 – DONE</title>
	<link>http://www.midstorm.org/~telles/2011/11/08/pgbr2011-done/</link>
	<content:encoded>&lt;p&gt;Finito, senhores. O PGBR2011 já se foi. Ok, ainda tem prestação de contas, avaliações a serem feitas, dinheiro de empenhos para receber, etc e tal. Mas agora até mesmo o Koichi Suzuki já terminou de dar a volta no mundo e voltou para o Japão.&lt;/p&gt;
&lt;p&gt;Fazer um evento num hotel tornou tudo muito mais caro. Foram mais de R$ 16K com aluguel das salas, projetores, sonorização, sala VIP, cofee break e claro, a cervejada. As despesas com hospedagem de palestrantes também foram altas, gastamos uns R$ 8K com isso. Mas o retorno foi incrível. O preço da diária não foi tão alto para quem veio de fora (negociamos isso em abril) e estavam todos lá. Sair para dar um passeio em São Paulo com a turma, dormir até mais tarde ou mesmo ficar de bobeira no saguão com os palestrantes internacionais tomando uma caipirinha. Isso tudo ficou mais fácil. Foi um enorme avanço em relação a 2009. Em 2009 só a organização pode desfrutar do excelente hotel da Unicamp. Sim, o hotel da Unicamp era muito mais agradável. A Unicamp em si é muito mais agradável. O mar de prédios de São Paulo não é algo tão bacana assim. Mesmo tirando a nossa tradicional &amp;#8220;&lt;a href=&quot;http://www.flickr.com/photos/tellesr/6322484113/in/pool-1655373@N21/&quot;&gt;foto do Bozo&lt;/a&gt;&amp;#8221; na piscina, a sensação de estar espremido entre prédios é meio bizarra. Mas o evento se tornou mais acessível para todos. No final, quem mais ganhou foi quem pagou para ir ao evento e pode estar mais próximo dos palestrantes e demais congressistas.&lt;/p&gt;
&lt;p&gt;Trazer tanta gente de fora, não foi moleza. O Flávio perdeu a conta de quantas vezes foi até o aeroporto. Além de convidar os Srs. Alvaro Herrera, Bruce Momjian, Dave Page, Greg Smith e Koichi Suzuki, o Sr. Jaime Casanova passou pela chamada de trabalhos e houveram pessoas que saíram de outros países só para vir ao PGBR2011, como o Sr. &lt;a href=&quot;http://pyrseas.wordpress.com/2011/10/31/postgresql-conference-brasil-2011/&quot;&gt;Joe Abbate&lt;/a&gt; que também aproveitou para passear pelo Brasil, claro. Bom, o fato é que o evento novamente chamou a atenção de pessoas de outros países e isso foi algo muito interessante de ver. Tenho de reconhecer que assistir uma palestra em espanhol parece mais difícil que assistir uma palestra em inglês. Acho que a nossa overdose diária de documentação em inglês deve ter algo haver com isso. Vamos ter de repensar nisso no próximo evento.&lt;/p&gt;
&lt;p&gt;Houveram alguns problemas menores como erros na impressão dos certificados e o atraso no recebimento dos chaveiros e adesivos. O elefante de pelúcia não ficou uma maravilha, mas se esgotou nos primeiros minutos do evento. O chaveiro ficou muito bacana também. No final acho que ficamos bem. A comida do hotel era realmente muito boa. O almoço não tinha muita variedade mas o peixe deles estava ótimo. A sala VIP era VIP mesmo. Dois bons sofás onde era perfeitamente possível tirar um bom cochilo, uma mesa para quem precisasse terminar uma palestra, fazer uma reunião de negócios ou atender um cliente remoto (sim, isto SEMPRE acontece).&lt;/p&gt;
&lt;p&gt;Achei a estrutura vertical do hotel um pouco incômoda. Você tinha que ficar subindo e descendo escadas dos auditórios para o salão de exposições. Os patrocinadores podem não ter gostado muito disso também. Mas acho que não foi algo terrível. Por outro lado, o salão de exposições era bem espaçoso, e conseguiu comportar todos no intervalo para o café sem problemas. E olha que era muuuita gente.&lt;/p&gt;
&lt;p&gt;As inscrições foram muito mais tranquilas que em 2009. Mais antecedência, o apoio com atendimento telefônico e um sistema de inscrições mais maduro ajudaram muito. Não que não houvessem problemas. O fato da prefeitura de Porto Alegre não emitir nota fiscal eletrônica, junto com a greve dos correios foi um tiro no pé. Mas o Euler e a Débora estão de parabéns pelo trabalho nesta área.&lt;/p&gt;
&lt;p&gt;Então vejamos alguns números:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Quase R$ 65K de custo no evento, sendo R$ 23K recebido pelas inscrições e o restante de 13 patrocinadores nacionais e internacionais. Este também foi o primeiro ano que não precisamos de ajuda da &lt;a href=&quot;http://www.spi-inc.org/&quot;&gt;SPI&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Mais de 240 pessoas inscritas no evento;&lt;/li&gt;
&lt;li&gt;Mais de 50 propostas de palestras na chamada de trabalhos e um total de 32 palestrantes presentes, fora os Lightning Talks.&lt;/li&gt;
&lt;li&gt;400 ecobags, 200 chaveiros, 100 squeezes, 100 camisetas, 60 elefantes de pelúcia, 5 banners, 1000 cartazes, 1000 adesivos pequenos e 100 adesivos normais.&lt;/li&gt;
&lt;li&gt;200 litros de chopp e inúmeras histórias para contar.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;É, não tem preço mesmo.&lt;/div&gt;
&lt;div&gt;Foi muito bom ver todos vocês novamente, eu realmente estava com saudades do pessoal. Até a próxima gente. &lt;img src=&quot;http://www.midstorm.org/~telles/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/div&gt;
&lt;div&gt;Eu precisava escrever algo mais inteligente, com impressões mais filosóficas e coisa e tal. Mas até agora não consegui digerir direito minhas próprias impressões, então mais para frente eu escrevo novamente.&lt;/div&gt;</content:encoded>
	<dc:date>2011-11-08T13:09:37+00:00</dc:date>
</item>
<item rdf:about="http://jotacomm.wordpress.com/?p=156">
	<title>João Paulo (Jota): Impressões do #pgbr2011</title>
	<link>http://jotacomm.wordpress.com/2011/11/06/impressoes-do-pgbr2011-2/</link>
	<content:encoded>&lt;p&gt;Olá, pessoal&lt;/p&gt;
&lt;p&gt;Depois de um grande tempo de inatividade estou voltando a escrever e neste retorno vou rascunhar sobre o #pgbr2011 que aconteceu em São Paulo.&lt;/p&gt;
&lt;p&gt;Como todos devem saber sou um entusiasta do PostgreSQL e estou presente desde o primeiro evento que ocorreu em São Paulo em 2007. De lá para cá muita coisa aconteceu: o PostgreSQL evolui bastante, e está se tornando cada vez mais sólido no mercado de Banco de Dados, além dele a comunidade brasileira também cresceu, evoluiu tanto no aprendizado técnico como o que tange a questão organizacional (Este será o tema do post).&lt;/p&gt;
&lt;p&gt;Precisamos pensar no seguinte: Por que em 2010 não tivemos PGBr e em 2011 sim? A resposta é simples. Em 2010, algumas pessoas se propuseram a organizar o evento, mas por alguns motivos isso não aconteceu, mas agora isso não vem ao caso, afinal já é passado.&lt;/p&gt;
&lt;p&gt;O que importa é que em 2011 a mesma comissão organizadora de 2007, 2008 e 2009 e mais alguns agredados tomaram a frente da organização e fizeram acontecer e por este motivo novamente tivemos o evento. Um evento com sucesso total, tanto na quantidade de pessoas que prestigiaram o evento, como também no nível das palestras apresentadas. E isso é algo que precisa/precisava ser elogiado, por isso que quando o meu amigo Dickson Guedes conversou comigo sobre apresentar um Lightning Talk eu topei na hora, na verdade eu já tinha em mente fazer um LT, mas seria uma apresentação sobre Backup, mas depois resolvi mudar o meu tema porque achei que precisava falar nem que rapidamente da organização do #pgbr2011 e foi o que tentei fazer.&lt;/p&gt;
&lt;p&gt;Eu gostaria de parabenizar toda a comissão pela organização do evento. Conheços todos e sei que vocês trabalharam arduamente para que o evento fosse possível. Organizar um evento deste porte é muito complicado, exige sacríficos na vida pessoal, profissional e em alguns momentos de ambas, por isso eu fiz questão de falar sobre isso no Lightning Talk e agora faço este registro aqui.&lt;/p&gt;
&lt;p&gt;Faço questão de não citar nomes porque certamente vou esquecer de alguém e isso seria completamente injusto porque todos trabalharam duro, claro que alguns mais e outros menos, mas é assim mesmo, uma equipe funciona assim, então pessoal sintam-se todos parabenizados e agradecidos pela organização do evento. Foi um tremendo sucesso e agora é esperarmos os PGDays de 2012 e o PGBr2012.&lt;/p&gt;
&lt;p&gt;Um grande abraço a todos.&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/jotacomm.wordpress.com/156/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/jotacomm.wordpress.com/156/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/jotacomm.wordpress.com/156/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/jotacomm.wordpress.com/156/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gofacebook/jotacomm.wordpress.com/156/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/jotacomm.wordpress.com/156/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gotwitter/jotacomm.wordpress.com/156/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/jotacomm.wordpress.com/156/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/jotacomm.wordpress.com/156/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/jotacomm.wordpress.com/156/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/jotacomm.wordpress.com/156/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/jotacomm.wordpress.com/156/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/jotacomm.wordpress.com/156/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/jotacomm.wordpress.com/156/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=jotacomm.wordpress.com&amp;amp;blog=5266308&amp;amp;post=156&amp;amp;subd=jotacomm&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</content:encoded>
	<dc:date>2011-11-06T06:37:34+00:00</dc:date>
	<dc:creator>jotacomm</dc:creator>
</item>
<item rdf:about="tag:blogger.com,1999:blog-6838506.post-567399567689290762">
	<title>Leandro Guimarães Faria Corcete DUTRA</title>
	<link>http://dutras.blogspot.com/2011/11/minha-programacao-de-palestras-do.html</link>
	<content:encoded>&lt;span class=&quot;post-body-first-line&quot;&gt;&lt;span class=&quot;post-body-first-letter&quot;&gt;M&lt;/span&gt;inha programação de &lt;a href=&quot;http://pgbr.postgresql.org.br/2011/programacao.php&quot;&gt;palestras do PgBr2011&lt;/a&gt;&lt;/span&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;2011-11-3&lt;/h3&gt;9h30 &lt;a href=&quot;http://pgbr.postgresql.org.br/2011/palestras.php?id=63&quot;&gt;Bruce Momjian, MVCC Unmasked&lt;/a&gt;&lt;br /&gt;
11h &lt;a href=&quot;http://pgbr.postgresql.org.br/2011/palestras.php?id=66&quot;&gt;vmWare vPostgres&lt;/a&gt;&lt;br /&gt;
14h &lt;a href=&quot;http://pgbr.postgresql.org.br/2011/palestras.php?id=46&quot;&gt;Eu!&lt;/a&gt;&lt;br /&gt;
15h &lt;a href=&quot;http://pgbr.postgresql.org.br/2011/palestras.php?id=39&quot;&gt;Leonardo César, \dfS pg_*: Um passeio pelas funções administrativas do postgres&lt;/a&gt;&lt;br /&gt;
16h20 &lt;a href=&quot;http://pgbr.postgresql.org.br/2011/palestras.php?id=60&quot;&gt;Greg(ory) Smiþ, Bottom-up Database Benchmarking&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;2011-11-4&lt;/h3&gt;9h &lt;a href=&quot;http://pgbr.postgresql.org.br/2011/palestras.php?id=61&quot;&gt;Koichi Suzuki, PostgreSQL and Postgres-XC in NTT Group&lt;/a&gt;&lt;br /&gt;
10h30 &lt;a href=&quot;http://pgbr.postgresql.org.br/2011/palestras.php?id=55&quot;&gt;Fernando Ike de Oliveira, Escalabilidade, As Modas e (No)SQL&lt;/a&gt;&lt;br /&gt;
10h30–12h30 &lt;a href=&quot;http://pgbr.postgresql.org.br/2011/palestras.php?id=19&quot;&gt;Dickson S. Guedes, Estripando o Elefante - dividindo seus problemas em problemas menores&lt;/a&gt;&lt;br /&gt;
14h30 &lt;a href=&quot;http://pgbr.postgresql.org.br/2011/palestras.php?id=42&quot;&gt;Euler Taveira de Oliveira, Tudo o que você queria saber sobre PostgreSQL mas tinha vergonha de perguntar&lt;/a&gt;&lt;br /&gt;
16h50 &lt;a href=&quot;http://pgbr.postgresql.org.br/2011/palestras.php?id=53&quot;&gt;Flavio Henrique Araque Gurgel, Meu ambiente cresceu e eu não planejei. E agora?&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/6838506-567399567689290762?l=dutras.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2011-11-03T18:14:39+00:00</dc:date>
	<dc:creator>Leandro Guimarães Faria Corcete DUTRA</dc:creator>
</item>
<item rdf:about="http://jotacomm.wordpress.com/?p=148">
	<title>João Paulo (Jota): PGBr 2011</title>
	<link>http://jotacomm.wordpress.com/2011/11/02/pgbr-2011/</link>
	<content:encoded>&lt;p&gt;Olá, pessoal&lt;/p&gt;
&lt;p&gt;Boa tarde!!! Gostaria de comentar que nesta quinta-feira (03/11) acontecerá a terceira edição do [&lt;a href=&quot;http://pgbr.postgresql.org.br/2011/noticias.php&quot;&gt;PGBr 2011]&lt;/a&gt;, antigo PGCon.&lt;/p&gt;
&lt;p&gt;Se possível apareçam por lá. Aguardamos vocês por lá.&lt;/p&gt;
&lt;p&gt;Abraços&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/jotacomm.wordpress.com/148/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/jotacomm.wordpress.com/148/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/jotacomm.wordpress.com/148/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/jotacomm.wordpress.com/148/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gofacebook/jotacomm.wordpress.com/148/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/jotacomm.wordpress.com/148/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gotwitter/jotacomm.wordpress.com/148/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/jotacomm.wordpress.com/148/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/jotacomm.wordpress.com/148/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/jotacomm.wordpress.com/148/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/jotacomm.wordpress.com/148/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/jotacomm.wordpress.com/148/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/jotacomm.wordpress.com/148/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/jotacomm.wordpress.com/148/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=jotacomm.wordpress.com&amp;amp;blog=5266308&amp;amp;post=148&amp;amp;subd=jotacomm&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</content:encoded>
	<dc:date>2011-11-02T21:41:32+00:00</dc:date>
	<dc:creator>jotacomm</dc:creator>
</item>
<item rdf:about="http://andrecf.kinghost.net/freebsd/?p=262">
	<title>André Fernandes: SQL para obter a descrição de uma função em PostgreSQL</title>
	<link>http://andrecf.kinghost.net/freebsd/2011/10/31/sql-para-obter-a-descricao-de-uma-funcao-em-postgresql/</link>
	<content:encoded>Para obter o código de uma função em Postgresql, podemos usar de pequenos artifícios (lembre-se de trocar #nome_da_funcao# pelo nome da função em questão: 1) se estivermos no psql, podemos rodar \df+ #nome_da_funcao# ou \ef #nome_da_funcao# sendo que na segunda opção(\ef) estaremos editando o código no editor padrão e não apenas vendo o código da [...]</content:encoded>
	<dc:date>2011-10-31T20:51:24+00:00</dc:date>
</item>
<item rdf:about="http://www.midstorm.org/~fike/weblog/?p=1071">
	<title>Fernando Ike: 2º encontro do NoSQLBrasil e reflexões</title>
	<link>http://www.midstorm.org/~fike/weblog/2011/10/29/2-encontro-do-nosqlbrasil-e-reflexoes/</link>
	<content:encoded>&lt;p&gt;&lt;img alt=&quot;&quot; height=&quot;239&quot; src=&quot;http://1.bp.blogspot.com/-r6HznLiC3Uo/TaDPx_bEV9I/AAAAAAAAAlI/bdPhHc7klBM/s1600/alexandria_01.jpg&quot; width=&quot;300&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; Tenho que agradecer o &lt;a href=&quot;http://porcelli.com.br/&quot; target=&quot;_blank&quot;&gt;Alexandre Porcelli&lt;/a&gt; pela a oportunidade de participar com um lighting talk. O evento foi excelente, apresenta&amp;ccedil;&amp;otilde;es muito boas e t&amp;eacute;cnicas (exceto a minha. &lt;img src=&quot;http://www.midstorm.org/~fike/weblog/wp-includes/images/smilies/icon_razz.gif&quot; alt=&quot;:P&quot; class=&quot;wp-smiley&quot; /&gt;  ).&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; Algumas palestras como da Microsoft e da Oracle fizeram-me refletir sobre algumas coisas do mercado de TI. Basicamente no mundo da Opera&amp;ccedil;&amp;atilde;o ou Sustenta&amp;ccedil;&amp;atilde;o:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;- Big Data e Storages&lt;/strong&gt;:&amp;nbsp;&lt;br /&gt;
	&amp;nbsp; &amp;nbsp;Com cada vez mais equipamentos conectados a Internet ou sistemas corporativos, est&amp;aacute; cada vez mais complexo gerenciar sistemas e infraestrutura. Tem-se informa&amp;ccedil;&amp;atilde;o demais e a necessidade de extrair tend&amp;ecirc;ncias, rela&amp;ccedil;&amp;otilde;es, hist&amp;oacute;rico, etc. Qualquer sistema a ser pensando (principalmente que envolva a internet) pode ter volume de transa&amp;ccedil;&amp;atilde;o ou acesso muito acima do que tinha-se planejado.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; Os dados para armazenar, principalmente informa&amp;ccedil;&amp;atilde;o hist&amp;oacute;rica ou legado crescer&amp;aacute; exponencialmente. Storage do jeito tradicional, com a preocupa&amp;ccedil;&amp;atilde;o de Raid Group, Raid Type e etc. ter&amp;aacute; a import&amp;acirc;ncia menor. Pensar&amp;atilde;o em &lt;strong&gt;Provisionamento Din&amp;acirc;mico&lt;/strong&gt;, &lt;strong&gt;Virtualiza&amp;ccedil;&amp;atilde;o&lt;/strong&gt; de Storages e rob&amp;ocirc;s de Fitotecas. &amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; Tamb&amp;eacute;m ficar&amp;aacute; cada vez mais usado a &amp;quot;&lt;strong&gt;Tieriza&amp;ccedil;&amp;atilde;o&lt;/strong&gt;&amp;quot; ou seja, conforme o uso de um determinado dado tem acesso recorrente, o Storage automaticamente movimenta este de discos mais lentos para mais r&amp;aacute;pidos.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; Nunca pensei em afirmar isso com grande convic&amp;ccedil;&amp;atilde;o mas cada vez mais o uso de &lt;strong&gt;NFS&lt;/strong&gt; (arquitetura Network Attach Storage) ou outro sistema de arquivo distribu&amp;iacute;do ser&amp;aacute; cada vez maior pois conectar tantos equipamentos com &amp;quot;fibra &amp;oacute;tica&amp;quot; &amp;nbsp;(&lt;strong&gt;SAN&lt;/strong&gt;) &amp;nbsp;tem um custo operacional de crescimento do que uso de sistema de arquivo distribu&amp;iacute;do quando &amp;eacute; necess&amp;aacute;rio pensar em escalabilidade rapidamente.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; S&amp;oacute; para deixar claro que transa&amp;ccedil;&amp;otilde;es &lt;a href=&quot;http://pt.wikipedia.org/wiki/OLTP&quot; target=&quot;_blank&quot;&gt;OLTP&lt;/a&gt; ainda confio em Storages &lt;strong&gt;SAN&lt;/strong&gt; mas confesso que a arquitetura&lt;strong&gt; Scale Out&lt;/strong&gt; para armazenamento tem chamado minha aten&amp;ccedil;&amp;atilde;o ultimamente, principalmente para uso de dado n&amp;atilde;o estruturado como bancos de dados &lt;strong&gt;NoSQL&lt;/strong&gt;, &lt;strong&gt;&amp;Aacute;udio&lt;/strong&gt;, &lt;strong&gt;V&amp;iuml;deo&lt;/strong&gt;, etc.&lt;/p&gt;
&lt;p&gt;- &lt;strong&gt;NoSQL e Big Data&lt;/strong&gt;:&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;Ent&amp;atilde;o, basicamente em qualquer sistema pode ocorrer o problema do sucesso al&amp;eacute;m do esperado. A&amp;iacute; &amp;eacute; cache, cache, cache onde puder ter para dar conta e ou abrir m&amp;atilde;o de alguma coisa de uma aplica&amp;ccedil;&amp;atilde;o tradicional &lt;a href=&quot;http://pt.wikipedia.org/wiki/CRUD&quot; target=&quot;_blank&quot;&gt;CRUD&lt;/a&gt; ou banco de dados relacional.&lt;/p&gt;
&lt;p&gt;- &lt;strong&gt;Pradoniza&amp;ccedil;&amp;atilde;o de produto n&amp;atilde;o, processo&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&amp;nbsp; Isso &amp;eacute; um pouco ainda dif&amp;iacute;cil de aceitar mas &amp;eacute; um fato. Se voc&amp;ecirc; &amp;eacute; respons&amp;aacute;vel por uma opera&amp;ccedil;&amp;atilde;o de infraestrutura ou servi&amp;ccedil;o, perceber&amp;aacute; que n&amp;atilde;o adianta adotar um tipo de virtualiza&amp;ccedil;&amp;atilde;o, um banco de dados, um tipo de sistema operacional, etc. Cada vez mais tem-se que encontrar solu&amp;ccedil;&amp;otilde;es r&amp;aacute;pidas e adequadas para sustentar o neg&amp;oacute;cio.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; O mais importante &amp;eacute; o controle dos processo da opera&amp;ccedil;&amp;atilde;o de infraestrutura. Mesmo porque a opera&amp;ccedil;&amp;atilde;o n&amp;atilde;o est&amp;aacute;, necessariamente na sede da empresa, est&amp;aacute; na nuvem.&lt;/p&gt;
&lt;p&gt;- &lt;strong&gt;Virtualiza&amp;ccedil;&amp;atilde;o &amp;eacute; um commodite&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&amp;nbsp; N&amp;atilde;o sei se ambientes pequenos isso acontece/acontecer&amp;aacute; mas em muitas situa&amp;ccedil;&amp;otilde;es tem hypevisor (&lt;a href=&quot;http://xen.org/&quot; target=&quot;_blank&quot;&gt;Xen&lt;/a&gt;, &lt;a href=&quot;http://www.linux-kvm.org/&quot; target=&quot;_blank&quot;&gt;KVM&lt;/a&gt;, &lt;a href=&quot;http://vmware.com&quot; target=&quot;_blank&quot;&gt;VMware&lt;/a&gt;, &lt;a href=&quot;http://www.microsoft.com/brasil/servidores/hyper-v-server/default.mspx&quot; target=&quot;_blank&quot;&gt;Hyper-V&lt;/a&gt;, etc.) diferentes com ferramentas para gerenciar. &amp;nbsp;Felizmente existe algumas solu&amp;ccedil;&amp;otilde;es interessantes para esse tipo de gerenciamento como Openebula e OpenStack.&lt;/p&gt;
&lt;p&gt;- &amp;nbsp;&lt;strong&gt;Solu&amp;ccedil;&amp;otilde;es poliglotas:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; Ent&amp;atilde;o f&amp;atilde; de uma linguagem de programa&amp;ccedil;&amp;atilde;o, pode continuar encantado com ela mas a oferta &amp;eacute; tanta de solu&amp;ccedil;&amp;otilde;es que muitas delas est&amp;atilde;o desenvolvidas em uma linguagem diferente que voc&amp;ecirc; gosta. Ter&amp;aacute; que aprender como adequ&amp;aacute;-las para suas necessidades (&lt;strong&gt;Perl&lt;/strong&gt;, &lt;strong&gt;Python&lt;/strong&gt;, &lt;strong&gt;Ruby&lt;/strong&gt;, &lt;strong&gt;Java&lt;/strong&gt;, &lt;strong&gt;Scala&lt;/strong&gt;, etc&amp;#8230; ). Um aparte: Gostei muito do &lt;a href=&quot;http://www.elasticsearch.org/&quot; target=&quot;_blank&quot;&gt;Elastic Search&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;- &lt;strong&gt;DBA, &amp;eacute; o fim&lt;/strong&gt;:&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; N&amp;atilde;o &amp;eacute; o fim do DBA mas tornara cada vez mais um nicho especif&amp;iacute;co. Muito da responsabilidade do DBA com o Big Data est&amp;aacute; com o desenvolvedor ou arquiteto da aplica&amp;ccedil;&amp;atilde;o. Principalmente com os bancos de dados NoSQL.&lt;/p&gt;
&lt;p&gt;- &lt;strong&gt;Sysadmin/Sysops/Devops/FuckOps&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; De certa maneira tamb&amp;eacute;m o sysadmin tem suas fun&amp;ccedil;&amp;otilde;es alteradas, os conhecimentos de ferramentas de configura&amp;ccedil;&amp;atilde;o (&lt;strong&gt;Chef&lt;/strong&gt;, &lt;strong&gt;Puppet&lt;/strong&gt;, &lt;strong&gt;Cfengine&lt;/strong&gt;, etc&amp;#8230;) e administra&amp;ccedil;&amp;atilde;o de servidores na &amp;quot;nuvem&amp;quot; &amp;eacute; cada vez mais frequente. Ah, se voc&amp;ecirc; &amp;eacute; um sysadmin que n&amp;atilde;o tem caguete de programa&amp;ccedil;&amp;atilde;o &amp;eacute; melhor rever seus conceitos sen&amp;atilde;o tamb&amp;eacute;m sua &amp;aacute;rea de atua&amp;ccedil;&amp;atilde;o ficar&amp;aacute; mais limitada.&lt;/p&gt;
&lt;p&gt;- &lt;strong&gt;Enfim, ganhamos e n&amp;atilde;o sabemos&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;Os grandes, aparentemente perderam o bonde da virtualiza&amp;ccedil;&amp;atilde;o de servidores, est&amp;atilde;o brigando numa &amp;quot;camada&amp;quot; acima. A tal de &lt;a href=&quot;http://www.nimbusproject.org/files/Sky_Computing.pdf&quot; target=&quot;_blank&quot;&gt;Sky Computing&lt;/a&gt;, tanto que a Microsoft com o &lt;a href=&quot;http://www.microsoft.com/windowsazure/&quot; target=&quot;_blank&quot;&gt;Azure&lt;/a&gt;, IBM com &lt;a href=&quot;http://www.ibm.com/cloud-computing&quot; target=&quot;_blank&quot;&gt;Smart Cloud&lt;/a&gt;,&amp;nbsp;Oracle com a &lt;a href=&quot;http://cloud.oracle.com/&quot; target=&quot;_parent&quot;&gt;Public Cloud&lt;/a&gt;, Google com &lt;a href=&quot;http://code.google.com/intl/pt-BR/appengine/&quot; target=&quot;_blank&quot;&gt;App Engine&lt;/a&gt;. E eu achando que &lt;a href=&quot;http://www-db.ics.uci.edu/pages/research/das/index.shtml&quot; target=&quot;_blank&quot;&gt;Daas&lt;/a&gt; com &lt;a href=&quot;http://postgresql.org&quot; target=&quot;_blank&quot;&gt;PostgreSQL&lt;/a&gt; era o bacana. &lt;img src=&quot;http://www.midstorm.org/~fike/weblog/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Obs. T&amp;aacute; meio troll esse post. Se tiver afim de aprofundar algum assunto, comenta a&amp;iacute; que depois comentou ou posto algo menos gen&amp;eacute;rico. &lt;img src=&quot;http://www.midstorm.org/~fike/weblog/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;div class=&quot;twttr_button&quot;&gt;
				&lt;a href=&quot;http://twitter.com/share?url=http://www.midstorm.org/~fike/weblog/2011/10/29/2-encontro-do-nosqlbrasil-e-reflexoes/&amp;amp;text=2º encontro do NoSQLBrasil e reflexões&quot; target=&quot;_blank&quot; title=&quot;Click here if you liked this article&quot;&gt;
					&lt;img src=&quot;http://www.midstorm.org/~fike/weblog/wp-content/plugins/twitter-plugin/images/twitt.gif&quot; alt=&quot;Twitt&quot; /&gt;
				&lt;/a&gt;
			&lt;/div&gt;</content:encoded>
	<dc:date>2011-10-29T14:12:59+00:00</dc:date>
	<dc:creator>Fernando Ike</dc:creator>
</item>
<item rdf:about="http://www.midstorm.org/~fike/weblog/?p=1074">
	<title>Fernando Ike: Agenda Novembro</title>
	<link>http://www.midstorm.org/~fike/weblog/2011/10/26/agenda-novembro/</link>
	<content:encoded>&lt;p&gt;&amp;nbsp; &amp;nbsp; Salve meus caros!!!&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; height=&quot;466&quot; src=&quot;http://3.bp.blogspot.com/_O9pf6dNH760/TAslFDM9PvI/AAAAAAAAEMI/F_8iq8dfo5I/s1600/schedule.jpg&quot; width=&quot;400&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; Para nem voc&amp;ecirc;s e eu esquecermos, minha agenda de palestras:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- &lt;a href=&quot;http://nosqlbr.com/&quot; target=&quot;_blank&quot;&gt;NoSQLBR V2&lt;/a&gt;: PostgreSQL nas Nuvens (j&amp;aacute; apresentei. Falta um post sobre&amp;#8230;&amp;nbsp;)&lt;/p&gt;
&lt;p&gt;- &lt;a href=&quot;http://pgbr.postgresql.org.br&quot; target=&quot;_blank&quot;&gt;PGBR2011&lt;/a&gt;: &lt;a href=&quot;http://pgbr.postgresql.org.br/2011/palestras.php?id=55&quot; target=&quot;_blank&quot;&gt;Escalabilidade, as modas e o No(SQL)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;- &lt;a href=&quot;https://events.linuxfoundation.org/events/linuxcon-brazil/&quot; target=&quot;_blank&quot;&gt;Linuxcon Brasil&lt;/a&gt;: &lt;a href=&quot;https://events.linuxfoundation.org/events/linuxcon-brazil/ike&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;Desmitificando gargalos de performance&lt;/strong&gt;&lt;/a&gt; (Prefiro o t&amp;iacute;tulo como: &lt;strong&gt;Lendas Urbanas de Performance&lt;/strong&gt;)&lt;/p&gt;
&lt;div class=&quot;twttr_button&quot;&gt;
				&lt;a href=&quot;http://twitter.com/share?url=http://www.midstorm.org/~fike/weblog/2011/10/26/agenda-novembro/&amp;amp;text=Agenda Novembro&quot; target=&quot;_blank&quot; title=&quot;Click here if you liked this article&quot;&gt;
					&lt;img src=&quot;http://www.midstorm.org/~fike/weblog/wp-content/plugins/twitter-plugin/images/twitt.gif&quot; alt=&quot;Twitt&quot; /&gt;
				&lt;/a&gt;
			&lt;/div&gt;</content:encoded>
	<dc:date>2011-10-27T02:28:05+00:00</dc:date>
	<dc:creator>Fernando Ike</dc:creator>
</item>
<item rdf:about="http://guedesoft.net/blog/?p=547">
	<title>Dickson dos Santos Guedes: Dicas de uso do comando COPY no PostgreSQL</title>
	<link>http://guedesoft.net/blog/2011/10/24/dicas-de-uso-do-comando-copy-no-postgresql/</link>
	<content:encoded>Mais um episódio do PGCasts no ar, e hoje eu falo sobre o comando COPY, espero que gostem e aguardo sugestões!</content:encoded>
	<dc:date>2011-10-24T11:58:54+00:00</dc:date>
</item>
<item rdf:about="tag:blogger.com,1999:blog-3371915898459901668.post-220886676945714251">
	<title>Claudio Bezerra Leopoldino: Unlogged Tables: Funcionalidade para Aumento de Desempenho!</title>
	<link>http://postgresqlbr.blogspot.com/2011/10/unlogged-tables-funcionalidade-para.html</link>
	<content:encoded>Todos sempre buscamos melhorar o desempenho das operações de banco de dados. E um dos recursos de performance ainda pouco utilizados da versão 9.1 do postgres são as chamadas &lt;i&gt;unlogged tables&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;O que são Unlogged Tables? &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Unlogged Tables&lt;/i&gt; são tabelas que não apresentam suporte a recuperação pós-falha. Não apresentam portanto log de transações (&lt;i&gt;write-ahead-log&lt;/i&gt; - WAL). Essa característica possibilita um grande ganho de desempenho em todas as operações realizadas. O ganho de desempenho obtido se deve ao sacrifício da possibilidade de recuperar os dados em caso de falha de sistema. &lt;br /&gt;&lt;br /&gt;Uma &lt;i&gt;unlogged table&lt;/i&gt; tem seus dados automaticamente perdidos em caso de falha, pois é truncada automaticamente, o que gera um ganho no tempo de recuperação do banco de dados.&lt;br /&gt;&lt;br /&gt;Os dados de uma &lt;i&gt;unlogged table&lt;/i&gt; não sofrem replicação dentro do postgresql.&lt;br /&gt;&lt;br /&gt;Em &lt;i&gt;unlogged tables&lt;/i&gt; não há necessidade de se manter o &lt;i&gt;log&lt;/i&gt; e sincronizá-lo com o banco de dados, fator importante para o de ganho de desempenho.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Em que situações é recomendado utilizar este tipo de tabela?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Em situações em que a durabilidade dos dados não seja realmente importante:&lt;br /&gt;- Para parâmetros de aplicações web;&lt;br /&gt;- Cache de dados em geral;&lt;br /&gt;- Tabelas de status de aplicações, entre outras possibilidades.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Acredito que apenas uma pequena parte de sistemas de bancos de dados possa ser armazenada em tabelas &lt;i&gt;unlogged&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;As operações de inserção, alteração, alteração e consulta a dados de uma &quot;tabela sem log&quot; são diferentes de uma tabela &quot;normal&quot;?&lt;/b&gt;&lt;br /&gt;A forma de fazer e os comandos utilizados permanecem os mesmos. No entanto, internamente, não há &lt;i&gt;write-ahead-log&lt;/i&gt; (WAL), o que faz com que os dados da tabela seja perdidos em caso de quedas de sistema. A velocidade das operações tende a ser bem maior.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Como criar &lt;i&gt;Unlogged Tables&lt;/i&gt;? &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;A criação de tabelas sem &lt;i&gt;log&lt;/i&gt; é bastante simples. Basta colocar a cláusula &quot;UNLOGGED&quot; no comando de criação da tabela.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;teste=&amp;gt; CREATE TABLE LOGADA (cod integer, descricao varchar(50));&lt;br /&gt;CREATE TABLE&lt;br /&gt;teste=&amp;gt; CREATE UNLOGGED TABLE NAO_LOGADA (cod integer, descricao varchar(50));&lt;br /&gt;CREATE TABLE&lt;br /&gt;teste=&amp;gt; &lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;b&gt;É permitido indexar este tipo de tabela?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Não existem restrições à indexação, exceto para índices GIST em que este recurso não está implementado. É possível inclusive reindexar, se for o caso! Os índices de uma &lt;i&gt;unlogged table&lt;/i&gt; também são &quot;unlogged&quot;, isto é, são truncados em caso de falha do sistema.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;teste=&amp;gt; CREATE INDEX UNLOGT ON NAO_LOGADA(cod);&lt;br /&gt;CREATE INDEX&lt;br /&gt;teste=&amp;gt; &lt;br /&gt;teste=&amp;gt; insert into NAO_LOGADA values (1, 'Teste 1');&lt;br /&gt;INSERT 0 1&lt;br /&gt;teste=&amp;gt; insert into NAO_LOGADA values (2, 'Teste 2');&lt;br /&gt;INSERT 0 1&lt;br /&gt;teste=&amp;gt; insert into NAO_LOGADA values (3, 'Teste 3');&lt;br /&gt;INSERT 0 1&lt;br /&gt;teste=&amp;gt; REINDEX TABLE NAO_LOGADA;&lt;br /&gt;REINDEX&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;b&gt;De quanto é o ganho esperado em desempenho? &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;DEPENDE da operações realizada. Veja o link abaixo e depois faça seus próprios testes:&lt;br /&gt;&lt;a href=&quot;http://pgsnaga.blogspot.com/2011/10/pgbench-on-unlogged-tables.html&quot;&gt;http://pgsnaga.blogspot.com/2011/10/pgbench-on-unlogged-tables.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Considerações Finais&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Unlogged Tables&lt;/i&gt; são um recurso válido para ganho de performance em certos casos específicos. No entanto, a definição de que tabelas devem ser &lt;i&gt;unlogged&lt;/i&gt; pode gerar erros graves e impossibilitar a recuperação de dados relevantes. Esta decisão deve ser sempre bastante embasada e levar em conta as necessidades de todos os usuários do banco.&lt;div class=&quot;blogger-post-footer&quot;&gt;Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3371915898459901668-220886676945714251?l=postgresqlbr.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2011-10-11T16:46:04+00:00</dc:date>
	<dc:creator>cbleopoldino</dc:creator>
</item>
<item rdf:about="http://www.postgresql.org.br/16904 at http://www.postgresql.org.br">
	<title>PostgreSQL Brasil: PGDay RONDÔNIA 2011</title>
	<link>http://www.postgresql.org.br/eventos/pgday/ro</link>
	<content:encoded>&lt;p&gt;&lt;strong&gt;O que &amp;eacute;?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Postgres ou&amp;nbsp;&lt;a target=&quot;_blank&quot; href=&quot;http://www.postgresql.org&quot;&gt;PostgreSQL&lt;/a&gt;&amp;nbsp;&amp;eacute; um projeto de Sistema Gerenciador de Banco de Dados open-source que foi iniciado em 1986, na Universidade de Berkeley, na Calif&amp;oacute;rnia.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.postgresql.org.br/eventos/pgday/ro&quot; target=&quot;_blank&quot;&gt;leia mais&lt;/a&gt;&lt;/p&gt;</content:encoded>
	<dc:date>2011-10-11T14:47:45+00:00</dc:date>
</item>
<item rdf:about="http://guedesoft.net/blog/?p=540">
	<title>Dickson dos Santos Guedes: Index-Only scans no PostgreSQL 9.2</title>
	<link>http://guedesoft.net/blog/2011/10/10/index-only-scans-no-postgresql-92/</link>
	<content:encoded>Uma das funcionalidades mais esperadas (e pedidas), estará disponível na próxima versão do PostgreSQL: index-only scans ...</content:encoded>
	<dc:date>2011-10-10T13:15:21+00:00</dc:date>
</item>
<item rdf:about="http://www.midstorm.org/~telles/?p=809">
	<title>Fabio Telles: #PGBR2011 – Tudo ao mesmo tempo agora</title>
	<link>http://www.midstorm.org/~telles/2011/10/06/pgbr2011-tudo-ao-mesmo-tempo-agora/</link>
	<content:encoded>&lt;p&gt;Zilhões de coisas rolando ao mesmo tempo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Saiu a lista dos palestrantes do PGBR2011. A grade ainda estamos montando.&lt;/li&gt;
&lt;li&gt;Sim, uma palestra minha foi aprovada (não, eu não faço parte da banca avaliadora), vou falar sobre processos de melhoria de desempenho em ambiente OLTP de alta concorrência. A palestra se chama: &amp;#8220;Fazendo uma manada passar debaixo da porta&amp;#8221;&lt;/li&gt;
&lt;li&gt;O link onde o site do PGBR está hospedado está com problemas sérios no link. Esperamos que isto esteja normalizado em breve.&lt;/li&gt;
&lt;li&gt;Foi publicada a minha participação no #DatabaseCast sobre PostgreSQL, no Imasters.&lt;/li&gt;
&lt;li&gt;Estamos mandando bala no material promocional. Tirando a sacola, tudo será vendido praticamente a preço de custo. Até agora serão:&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt; 400 ecobags para o material do evento;&lt;/li&gt;
&lt;li&gt;100 squeezes em alumínio;&lt;/li&gt;
&lt;li&gt;100 elefantes de pelúcia;&lt;/li&gt;
&lt;li&gt;100 camisetas pólo;&lt;/li&gt;
&lt;li&gt;200 chaveiros;&lt;/li&gt;
&lt;li&gt;1000 adesivos;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Um mês antes do evento ocorrer, temos 120 inscritos. Sim, brasileiro deixa tudo para a última hora&amp;#8230; então devemos ter um número bem superior até lá.&lt;/li&gt;
&lt;li&gt;Teremos um prêmio para as pessoas que mais se destacaram nos últimos tempos. Estamos organizando isso ainda, mas será uma forma de valorizar aqueles que tem contribuído para o fortalecimento da comunidade brasileira.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;Bom, muita coisa ao mesmo tempo&amp;#8230; não dá para falar tudo que eu gostaria, mas o mais importante de tudo:&lt;/div&gt;
&lt;h2&gt;O chopp está garantido no final do evento!!!&lt;/h2&gt;
&lt;p&gt;(ok, vai ter refrigerante também&amp;#8230; mas não consegui achar o Guaraná Jesus por aqui)&lt;/p&gt;</content:encoded>
	<dc:date>2011-10-06T12:13:15+00:00</dc:date>
</item>
<item rdf:about="http://guedesoft.net/blog/?p=522">
	<title>Dickson dos Santos Guedes: Meu Itinerário para o PGBR 2011</title>
	<link>http://guedesoft.net/blog/2011/10/05/meu-itinerario-para-o-pgbr-2011/</link>
	<content:encoded>Seguindo a mesma linha do Fike resolvi escrever aqui meu itinerário para o PGBR 2011.</content:encoded>
	<dc:date>2011-10-05T21:33:07+00:00</dc:date>
</item>
<item rdf:about="tag:blogger.com,1999:blog-578610887231886448.post-6892222031194940548">
	<title>Rodrigo Hjort: Mantendo atualizado o índice FTS no PostgreSQL</title>
	<link>http://www.hjort.co/2011/10/mantendo-atualizado-o-indice-fts-no.html</link>
	<content:encoded>&lt;br /&gt;&lt;br /&gt;Dando sequência ao post anterior &lt;a href=&quot;http://www.hjort.co/2011/07/full-text-search-em-portugues-no.html&quot; target=&quot;new&quot;&gt;&quot;Full Text Search em português no PostgreSQL&quot;&lt;/a&gt;, veremos como manter atualizado o índice de busca textual, particularmente no caso de os dados da tabela sofrerem muitas atualizações (i.e., inclusões e modificações).&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-J2AMj0fS3OE/TosX6vT41kI/AAAAAAAAAas/sGgyNCKsKt8/s1600/Kleer-Fax-44908-HiTech-Deluxe-Ring-Book-Index-Divider2b.jpg&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; width=&quot;335&quot; src=&quot;http://4.bp.blogspot.com/-J2AMj0fS3OE/TosX6vT41kI/AAAAAAAAAas/sGgyNCKsKt8/s400/Kleer-Fax-44908-HiTech-Deluxe-Ring-Book-Index-Divider2b.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Só para relembrar, o diagrama a seguir ilustra o funcionamento do mecanismo de &lt;b&gt;Full Text Search no PostgreSQL&lt;/b&gt;, em que fazem parte processos como parser, normalizador e indexador:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-YPNiQf_KukA/TosX6SVMdEI/AAAAAAAAAac/gYwcEFv_v08/s1600/pg-fts-diag.jpg&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;292&quot; width=&quot;400&quot; src=&quot;http://3.bp.blogspot.com/-YPNiQf_KukA/TosX6SVMdEI/AAAAAAAAAac/gYwcEFv_v08/s400/pg-fts-diag.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Para exemplificar o problema apresentado no início desse post, considere que a tabela MUNICIPIOS esteja devidamente populada, tendo a coluna de suporte para a busca textual criada e o índice do tipo GIN (ou GiST) associado. Sendo assim, podemos fazer consultas SQL desse tipo:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush:sql&quot;&gt;SELECT nome, uf FROM municipios&lt;br /&gt;WHERE busca @@ plainto_tsquery(simples('agua lindoia'));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Veja o resultado:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush:sql&quot;&gt;curso=# SELECT nome, uf FROM municipios&lt;br /&gt;curso-# WHERE busca @@ plainto_tsquery(simples('agua lindoia'))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nome&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | uf &lt;br /&gt;------------------+----&lt;br /&gt;&amp;nbsp;Águas de Lindóia | SP&lt;br /&gt;(1 registro)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;O que acontece agora se incluirmos um novo registro na tabela? Veja:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush:sql&quot;&gt;INSERT INTO municipios (codigo, nome, uf)&lt;br /&gt;VALUES (100, 'Águas de Lindóia do Sul', 'RS');&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ao executarmos a busca anterior, o município recém-incluído não aparecerá... Isso porque a coluna de suporte à busca não foi atualizada. Veja o conteúdo dela:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush:sql&quot;&gt;curso=# SELECT nome, uf, busca FROM municipios WHERE codigo = 100;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nome&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | uf | busca &lt;br /&gt;-------------------------+----+-------&lt;br /&gt;&amp;nbsp;Águas de Lindóia do Sul | RS | &lt;br /&gt;(1 registro)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Para manter essa coluna atualizada automaticamente em operações de INSERT ou UPDATE, precisamos de um disparador (trigger). No PostgreSQL criamos uma função em linguagem procedural (geralmente em PL/pgSQL) e em seguida a associamos a um disparador.&lt;br /&gt;&lt;br /&gt;Sendo assim, crie a função de trigger com o código abaixo:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush:sql&quot;&gt;CREATE FUNCTION municipios_trigger()&lt;br /&gt;RETURNS trigger AS $$&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp; new.busca := to_tsvector(simples(new.nome));&lt;br /&gt;&amp;nbsp; return new;&lt;br /&gt;end&lt;br /&gt;$$ LANGUAGE plpgsql;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ao ser chamada, ela fará com que o conteúdo da coluna &quot;busca&quot; seja preenchido com o texto gerado da normalização da coluna &quot;nome&quot;.&lt;br /&gt;&lt;br /&gt;Em seguida, crie o disparador de atualização:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush:sql&quot;&gt;CREATE TRIGGER municipios_tsupdate&lt;br /&gt;BEFORE INSERT OR UPDATE ON municipios&lt;br /&gt;FOR EACH ROW EXECUTE PROCEDURE municipios_trigger();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ou seja, antes de cada INSERT ou UPDATE na tabela, a função municipios_trigger() será invocada para preencher automaticamente a coluna &quot;busca&quot;.&lt;br /&gt;&lt;br /&gt;Agora experimente modificar aquele registro inserido acima:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush:sql&quot;&gt;UPDATE municipios SET uf = uf WHERE codigo = 100;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Observe como ficou o conteúdo daquela linha:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush:sql&quot;&gt;curso=# SELECT nome, uf, busca FROM municipios WHERE codigo = 100;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nome&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | uf |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; busca&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;-------------------------+----+---------------------------&lt;br /&gt;&amp;nbsp;Águas de Lindóia do Sul | RS | 'agu':1 'lindo':3 'sul':5&lt;br /&gt;(1 registro)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Finalmente efetue a busca textual que havia falhado:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush:sql&quot;&gt;curso=# SELECT nome, uf FROM municipios&lt;br /&gt;curso-# WHERE busca @@ plainto_tsquery(simples('agua lindoia'));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nome&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | uf &lt;br /&gt;-------------------------+----&lt;br /&gt;&amp;nbsp;Águas de Lindóia do Sul | RS&lt;br /&gt;&amp;nbsp;Águas de Lindóia&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | SP&lt;br /&gt;(2 registros)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Tente agora fazer uma modificação no nome desse município:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush:sql&quot;&gt;UPDATE municipios SET nome = 'Águas Quentes do Sul' WHERE codigo = 100;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;E então refaça a busca considerando o novo nome:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush:sql&quot;&gt;curso=# SELECT codigo, nome, uf FROM municipios&lt;br /&gt;WHERE busca @@ plainto_tsquery(simples('agua quente'));&lt;br /&gt;&amp;nbsp;codigo |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nome&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | uf &lt;br /&gt;--------+----------------------+----&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 100 | Águas Quentes do Sul | RS&lt;br /&gt;(1 registro)&lt;br /&gt;&lt;/pre&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-CKGE1JJDC7U/TosX6ulwgvI/AAAAAAAAAak/uRB2IVqUZpk/s1600/idx-pd606837b.jpg&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;206&quot; width=&quot;400&quot; src=&quot;http://4.bp.blogspot.com/-CKGE1JJDC7U/TosX6ulwgvI/AAAAAAAAAak/uRB2IVqUZpk/s400/idx-pd606837b.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Índice sempre up-to-date! Muito fácil, né? :D&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Referências&lt;/h2&gt;&lt;br /&gt;[1] &lt;a href=&quot;http://www.postgresql.org/docs/8.3/static/textsearch-features.html#TEXTSEARCH-UPDATE-TRIGGERS&quot; target=&quot;_blank&quot;&gt;PostgreSQL 8.3 Documentation - Full Text Search&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/578610887231886448-6892222031194940548?l=www.hjort.co&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2011-10-04T07:43:23+00:00</dc:date>
	<dc:creator>Rodrigo HJORT</dc:creator>
</item>
<item rdf:about="tag:blogger.com,1999:blog-578610887231886448.post-6500553344076967028">
	<title>Rodrigo Hjort: Full Text Search em português no PostgreSQL</title>
	<link>http://www.hjort.co/2011/07/full-text-search-em-portugues-no.html</link>
	<content:encoded>&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Full Text Searching&lt;/b&gt; (ou simplesmente busca textual ou FTS) é uma poderosa ferramenta disponível em bancos de dados que visa aumentar a probabilidade de sucesso nas consultas efetuadas pelos usuários.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-Tm8Z3geDm_0/TjMd77-3fiI/AAAAAAAAAVM/gdJbATYm8Hk/s1600/module-full-text-search2.jpg&quot;&gt;&lt;img src=&quot;http://4.bp.blogspot.com/-Tm8Z3geDm_0/TjMd77-3fiI/AAAAAAAAAVM/gdJbATYm8Hk/s400/module-full-text-search2.jpg&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5634880474321485346&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Operadores de busca textual existem nos SGBDs há anos. O &lt;b&gt;PostgreSQL&lt;/b&gt; oferece, além do LIKE, o ILIKE (versão que desconsidera a capitalização) e operadores baseados em expressão regular (i.e., ~ e ~*) para tipos de dados textuais. Entretanto, tais operadores falham ao não prover muitas propriedades essenciais requeridas por sistemas de informações modernos, tais como suporte linguístico, ranking dos resultados e indexação [1].&lt;br /&gt;&lt;br /&gt;Na Universidade de Moscou foi criado o projeto &lt;b&gt;Tsearch2&lt;/b&gt; [2], no qual os russos Oleg Bartunov e Teodor Sigaev desenvolveram um motor do tipo full text inteiramente integrado ao SGBD PostgreSQL. Além da referida solução de busca textual, foram criados dois poderosos mecanismos de indexação: GiST e GIN.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-OF8HSf3CxMQ/TjMd8MO7ObI/AAAAAAAAAVc/Fn7TrqlM2yU/s1600/oleg-teodor-2.jpg&quot;&gt;&lt;img src=&quot;http://1.bp.blogspot.com/-OF8HSf3CxMQ/TjMd8MO7ObI/AAAAAAAAAVc/Fn7TrqlM2yU/s400/oleg-teodor-2.jpg&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5634880478683806130&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;O Tsearch2 residiu no diretório contrib do PostgreSQL até a sua versão 8.1, sendo finalmente incorporado ao core do SGBD na versão 8.3, tornando-se a opção default para FTS nele.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-tr-_YvpPVeA/TjMd73U8fYI/AAAAAAAAAVU/0fDmLv-8enE/s1600/features_search%2Btext2.jpg&quot;&gt;&lt;img src=&quot;http://1.bp.blogspot.com/-tr-_YvpPVeA/TjMd73U8fYI/AAAAAAAAAVU/0fDmLv-8enE/s400/features_search%2Btext2.jpg&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5634880473071910274&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Para ilustrar, tomemos como exemplo o clássico cadastro de municípios brasileiros. A missão é efetuar buscas textuais (neste caso pelo nome dos municípios) usando FTS.&lt;br /&gt;&lt;br /&gt;Eis uma tabela no PostgreSQL populada com as cidades:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush:bash&quot;&gt;&lt;br /&gt;        nome         | uf &lt;br /&gt;---------------------+----&lt;br /&gt; Abadia de Goiás     | GO&lt;br /&gt; Abadia dos Dourados | MG&lt;br /&gt; Abadiânia           | GO&lt;br /&gt; Abaeté              | MG&lt;br /&gt; Abaetetuba          | PA&lt;br /&gt; Abaiara             | CE&lt;br /&gt; Abaíra              | BA&lt;br /&gt; Abaré               | BA&lt;br /&gt; Abatiá              | PR&lt;br /&gt; Abdon Batista       | SC&lt;br /&gt; ...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A ideia é fazer com que buscas aproximadas possam ser efetuadas pelo usuário, ou seja, algo mais &quot;poderoso&quot; que um falho operador LIKE.&lt;br /&gt;&lt;br /&gt;A primeira modificação será criar uma coluna adicional, chamada de &quot;busca&quot;, a fim de armazenar os vetores já normalizados dos termos para ser usada posteriormente nas consultas.&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush:sql&quot;&gt;&lt;br /&gt;ALTER TABLE municipios ADD busca tsvector;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Eis a estrutura da tabela após a execução do comando:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush:bash&quot;&gt;&lt;br /&gt;         Table &quot;public.municipios&quot;&lt;br /&gt; Column |         Type          | Modifiers &lt;br /&gt;--------+-----------------------+-----------&lt;br /&gt; nome   | character varying(50) | &lt;br /&gt; uf     | character(2)          | &lt;br /&gt; busca  | tsvector              | &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Como o foco deste estudo é usar o idioma português, e considerando que o servidor PostgreSQL esteja configurado com a codificação UTF-8 (i.e., Unicode), precisaremos criar algumas funções adicionais. Baseando-se em [3] e [4], criei essas funções:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush:sql&quot;&gt;&lt;br /&gt;CREATE FUNCTION to_ascii(bytea, name) RETURNS text AS&lt;br /&gt; 'to_ascii_encname'&lt;br /&gt; LANGUAGE internal STRICT;&lt;br /&gt;&lt;br /&gt;CREATE FUNCTION simples(texto varchar) RETURNS varchar AS&lt;br /&gt; 'select lower(to_ascii(convert_to($1, ''latin1''), ''latin1''))'&lt;br /&gt; LANGUAGE sql IMMUTABLE STRICT;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Veja o que essa nova função simples() é capaz de fazer:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush:sql&quot;&gt;&lt;br /&gt;brasil=# select simples('Pinhão com Açaí');&lt;br /&gt;    simples     &lt;br /&gt;----------------&lt;br /&gt; pinhao com acai&lt;br /&gt;(1 row)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ou seja, trata-se de uma função de transformação que normaliza o texto recebido como argumento. Ela será essencial para os passos a seguir.&lt;br /&gt;&lt;br /&gt;Podemos usar a função simples() em conjunto com to_tsvector() a fim de produzir o vetor de lexemas (termos processados a serem usados nas buscas). Veja:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush:sql&quot;&gt;&lt;br /&gt;brasil=# select to_tsvector(simples('Pinhão com Açaí'));&lt;br /&gt;    to_tsvector    &lt;br /&gt;-------------------&lt;br /&gt; 'aca':3 'pinha':1&lt;br /&gt;(1 row)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Voltando à tabela de municípios, execute o comando SQL a seguir para popular a recém-criada coluna &quot;busca&quot; com o vetor transformado em cada uma de suas tuplas.&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush:sql&quot;&gt;&lt;br /&gt;UPDATE municipios SET busca = to_tsvector(simples(nome));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Pronto! Agora que os textos foram pré-processados, basta executar as consultas SQL usando o operador especial @@ no PostgreSQL. Veja um exemplo de uso no qual o usuário digitou o texto &quot;sao mateus&quot; na aplicação. A consulta SQL fica assim:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush:sql&quot;&gt;&lt;br /&gt;brasil=# select nome, uf from municipios&lt;br /&gt;brasil=# where busca @@ plainto_tsquery(simples('sao mateus'));&lt;br /&gt;          nome          | uf &lt;br /&gt;------------------------+----&lt;br /&gt; São Mateus             | ES&lt;br /&gt; São Mateus do Maranhão | MA&lt;br /&gt; São Mateus do Sul      | PR&lt;br /&gt;(3 rows)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Note que além do vetor (coluna &quot;busca&quot; do tipo tsvector) é preciso especificar um tipo tsquery, fornecido pelas funções to_tsquery() e plainto_tsquery(). A função simples() foi usada novamente para realizar a transformação do texto informado.&lt;br /&gt;&lt;br /&gt;Ótimo! É só isso?&lt;br /&gt;&lt;br /&gt;Não... Funcionou, mas o desempenho não pode ser garantido. Na realidade a busca com essa abordagem será mais feliz que se usássemos um ardiloso LIKE &quot;%sao mateus%&quot;. (Jogue a primeira pedra quem nunca encontrou um monstrinho desses em uma aplicação!).&lt;br /&gt;&lt;br /&gt;Vejamos como o SGBD está tratando a consulta SQL acima:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush:sql&quot;&gt;&lt;br /&gt;brasil=# explain select nome, uf from municipios&lt;br /&gt;brasil=# where busca @@ plainto_tsquery(simples('sao mateus'));&lt;br /&gt;                         QUERY PLAN                          &lt;br /&gt;-------------------------------------------------------------&lt;br /&gt; Seq Scan on municipios  (cost=0.00..163.60 rows=6 width=16)&lt;br /&gt;   Filter: (busca @@ plainto_tsquery('sao mateus'::text))&lt;br /&gt;(2 rows)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ops, uma varredura sequencial (também conhecido por full scan ou sequential scan) está sendo efetuada! Se você não sabe o que é isso, consulte o seu DBA. Se ele for teu amigo, não irá te xingar.&lt;br /&gt;&lt;br /&gt;Bom, e como podemos corrigir isso? Criando um índice! :D&lt;br /&gt;&lt;br /&gt;Neste caso específico do FTS no PostgreSQL, temos a escolha de usar uma das duas opções de índices, GiST ou GIN (lembra dos russos?). Cada uma tem a sua aplicação. Escolhi o GIN por esta apresentar maior precisão para esta aplicação. Veja como criar o índice:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush:sql&quot;&gt;&lt;br /&gt;CREATE INDEX municipios_gidx ON municipios USING gin(busca);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;E agora, será que funcionou? Roda o EXPLAIN novamente! Veja:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush:sql&quot;&gt;&lt;br /&gt;brasil=# explain select nome, uf from municipios&lt;br /&gt;brasil=# where busca @@ plainto_tsquery(simples('sao mateus'));&lt;br /&gt;                                  QUERY PLAN                                  &lt;br /&gt;------------------------------------------------------------------------------&lt;br /&gt; Bitmap Heap Scan on municipios  (cost=4.30..23.49 rows=6 width=16)&lt;br /&gt;   Recheck Cond: (busca @@ plainto_tsquery('sao mateus'::text))&lt;br /&gt;   -&gt;  Bitmap Index Scan on municipios_gidx  (cost=0.00..4.30 rows=6 width=0)&lt;br /&gt;         Index Cond: (busca @@ plainto_tsquery('sao mateus'::text))&lt;br /&gt;(4 rows)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Sucesso! Agora a busca textual com FTS está devidamente indexada no PostgreSQL.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Referências&lt;/h2&gt;&lt;br /&gt;[1] &lt;a href=&quot;http://www.postgresql.org/docs/8.3/static/textsearch.html&quot; target=&quot;_blank&quot;&gt;PostgreSQL 8.3 Documentation - Full Text Search&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;[2] &lt;a href=&quot;http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/docs/tsearch-V2-intro.html&quot; target=&quot;_blank&quot;&gt;Tsearch2 - full text search extension for PostgreSQL&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;[3] &lt;a href=&quot;http://www.laudatio.com/wordpress/2008/11/05/postgresql-83-to_ascii-utf8/&quot; target=&quot;_blank&quot;&gt;PostgreSQL: TO_ASCII &amp;amp; UTF8&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;[4] &lt;a href=&quot;http://www.postgresql.org/docs/8.3/static/functions-string.html&quot; target=&quot;_blank&quot;&gt;PostgreSQL 8.3 Documentation - String Functions and Operators&lt;/a&gt;&lt;br /&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/578610887231886448-6500553344076967028?l=www.hjort.co&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2011-10-04T07:43:23+00:00</dc:date>
	<dc:creator>Rodrigo HJORT</dc:creator>
</item>
<item rdf:about="http://www.midstorm.org/~fike/weblog/?p=1043">
	<title>Fernando Ike: TODO: Minha agenda p/ PGBR 2011</title>
	<link>http://www.midstorm.org/~fike/weblog/2011/10/01/todo-minha-agenda-p-pgbr-2011/</link>
	<content:encoded>&lt;p&gt;&amp;nbsp; &lt;img alt=&quot;&quot; height=&quot;367&quot; src=&quot;http://mentorsonline.files.wordpress.com/2011/04/choosing.gif&quot; width=&quot;400&quot; /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; O tem&amp;aacute;rio da PGBR 2011 fez uma excelente escolha de temas. &amp;Eacute; muito dif&amp;iacute;cil escolher qual assistir, de qualquer forma fiz uma sele&amp;ccedil;&amp;atilde;o de palestras que tentarei assisti. (sem ordem de prioridade e com alguns coment&amp;aacute;rios)&lt;/p&gt;
&lt;p&gt;-&amp;nbsp;&lt;a href=&quot;http://pgbr.postgresql.org.br/2011/palestras.php?id=28&quot; target=&quot;_blank&quot;&gt;PostSemantic: Integrando dados legados atrav&amp;eacute;s de sem&amp;acirc;ntica&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Est&amp;aacute; na moda ontologia e Web sem&amp;acirc;ntica. Um dos caminhos que para integra&amp;ccedil;&amp;atilde;o de sistemas &amp;quot;aut&amp;ocirc;nomos&amp;quot; &amp;eacute; uso do &lt;a href=&quot;http://www.w3.org/TR/rdf-sparql-query/&quot; target=&quot;_blank&quot;&gt;SPARQL&lt;/a&gt;. Minha apresenta&amp;ccedil;&amp;atilde;o para PGBR tem isso na agenda mas sem a profundidade que o Rodrigo deva abordar. Um projeto interessante de uso do SPARQL e RDF &amp;eacute; &lt;a href=&quot;http://wiki.dbpedia.org/&quot; target=&quot;_blank&quot;&gt;DBpedia&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;- &lt;strong&gt;&lt;a href=&quot;http://pgbr.postgresql.org.br/2011/palestras.php?id=53&quot; target=&quot;_blank&quot;&gt;Meu ambiente cresceu e eu n&amp;atilde;o planejei. E agora?&lt;/a&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Sempre pensei em apresentar uma palestra dessa. At&amp;eacute; rascunhei mas &amp;nbsp;fiquei adiando, adiando termirnar &amp;nbsp;e (finalmente) algu&amp;eacute;m mais qualificado (Fl&amp;aacute;vio Gurgel) do que eu falar&amp;aacute; de um assunto t&amp;atilde;o bacana e que poucos d&amp;atilde;o aten&amp;ccedil;&amp;atilde;o (s&amp;oacute; depois de ver o tamanho da fatura por n&amp;atilde;o ter planejado direito&amp;#8230;). &lt;img src=&quot;http://www.midstorm.org/~fike/weblog/wp-includes/images/smilies/icon_biggrin.gif&quot; alt=&quot;:D&quot; class=&quot;wp-smiley&quot; /&gt;  &lt;img src=&quot;http://www.midstorm.org/~fike/weblog/wp-includes/images/smilies/icon_biggrin.gif&quot; alt=&quot;:D&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;- &lt;strong&gt;&lt;a href=&quot;http://pgbr.postgresql.org.br/2011/palestras.php?id=59&quot; target=&quot;_blank&quot;&gt;PostgreSQL Performance Pitfalls&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.westnet.com/~gsmith/&quot; target=&quot;_blank&quot;&gt;&amp;nbsp;Greg Smith&lt;/a&gt; &amp;eacute; um dos desenvolvedores do PostreSQL e falar&amp;aacute; um &amp;quot;pouco&amp;quot; sobre performance. Escreveu um&amp;nbsp;&lt;a href=&quot;http://www.amazon.com/PostgreSQL-High-Performance-Gregory-Smith/dp/184951030X&quot; target=&quot;_blank&quot;&gt;livro recomendad&amp;iacute;ssimo sobre o tema&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;- &lt;a href=&quot;http://pgbr.postgresql.org.br/2011/palestras.php?id=49&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;Viva a Revolu&amp;ccedil;&amp;atilde;o Geoespacial&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; Para quem acha que Geoespaciais &amp;eacute; o Google Maps, Foursquare ou informa&amp;ccedil;&amp;otilde;es de uma gal&amp;aacute;xia, n&amp;atilde;o perca a palestra do &lt;a href=&quot;http://dgp.cnpq.br/buscaoperacional/detalhepesq.jsp?pesq=9716745813487378&quot; target=&quot;_blank&quot;&gt;Bueno&lt;/a&gt;. Ali&amp;aacute;s, ele (ao menos para mim) &amp;eacute; um dos pioneiros do &lt;a href=&quot;http://postgis.refractions.net/&quot; target=&quot;_blank&quot;&gt;Postgis&lt;/a&gt; no Brasil. &amp;nbsp;Se quiser de aut&amp;oacute;grafos dele, fale comigo no evento. &lt;img src=&quot;http://www.midstorm.org/~fike/weblog/wp-includes/images/smilies/icon_biggrin.gif&quot; alt=&quot;:D&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;- &lt;strong&gt;&lt;a href=&quot;http://pgbr.postgresql.org.br/2011/palestras.php?id=5&quot; target=&quot;_blank&quot;&gt;Escalabilidade horizontal com PostgreSQL 9.0 e Pgpool II&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; Escalabilidade horizontal, Grids e sistemas distribu&amp;iacute;dos s&amp;atilde;o alguns dos meus temas preferidos. Alguns servi&amp;ccedil;os da &amp;quot;nuvem&amp;quot; de PostgreSQL usam bastante os recursos que ser&amp;atilde;o apresentados pelo &lt;a href=&quot;https://launchpad.net/~matheusespanhol&quot; target=&quot;_blank&quot;&gt;Matheus&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;- &lt;a href=&quot;http://pgbr.postgresql.org.br/2011/palestras.php?id=63&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;MVCC Unmasked&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://momjian.us/&quot; target=&quot;_blank&quot;&gt;Bruce Momjian&lt;/a&gt; falar&amp;aacute; uma das funcionalidades de um banco de dados mais fant&amp;aacute;sticas de um banco dedados, seja SQL ou n&amp;atilde;o: &lt;a href=&quot;http://en.wikipedia.org/wiki/Multiversion_concurrency_control&quot; target=&quot;_blank&quot;&gt;MVCC&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;- &lt;a href=&quot;http://pgbr.postgresql.org.br/2011/palestras.php?id=62&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;PostgreSQL at the center of your dataverse&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; Implamenta&amp;ccedil;&amp;atilde;o da especifica&amp;ccedil;&amp;atilde;o &lt;a href=&quot;http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=34136&quot; target=&quot;_blank&quot;&gt;ISO SQL/MED&lt;/a&gt;, talvez o &lt;a href=&quot;http://pgsnake.blogspot.com/&quot; target=&quot;_blank&quot;&gt;Dave Page&lt;/a&gt; fale que &amp;eacute; poss&amp;iacute;vel buscar informa&amp;ccedil;&amp;otilde;es online do telesc&amp;oacute;pio &lt;a href=&quot;http://hubblesite.org/&quot; target=&quot;_blank&quot;&gt;Hubble&lt;/a&gt;. &lt;img src=&quot;http://www.midstorm.org/~fike/weblog/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt;  &lt;img src=&quot;http://www.midstorm.org/~fike/weblog/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt;  &lt;img src=&quot;http://www.midstorm.org/~fike/weblog/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;- &lt;strong&gt;&lt;a href=&quot;http://pgbr.postgresql.org.br/2011/palestras.php?id=65&quot; target=&quot;_blank&quot;&gt;PostgreSQL: heavyweight locks, lwlocks, deadlocks, spinlocks, pg_locks, row locks &amp;#8230; is&amp;aacute;lvese quien pueda!&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; Locks, locks, deadlocks. O terror de qualquer pessoa que tem envolvimento com banco de dados. &lt;a href=&quot;http://www.commandprompt.com/blogs/alvaro_herrera/&quot; target=&quot;_blank&quot;&gt;&amp;Aacute;lvaro Herrera&lt;/a&gt;&amp;nbsp;falar&amp;aacute; de um pouco sobre magia negra chamada locks (bloqueios).&amp;nbsp;&lt;/p&gt;
&lt;p&gt;-&lt;strong&gt; &lt;a href=&quot;http://pgbr.postgresql.org.br/2011/palestras.php?id=61&quot; target=&quot;_blank&quot;&gt;PostgreSQL and Postgres-XC in NTT Group&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; A &lt;a href=&quot;https://www.oss.ecl.ntt.co.jp/ossc/&quot; target=&quot;_blank&quot;&gt;NTT&lt;/a&gt; &amp;eacute; uma empresa de telecomunica&amp;ccedil;&amp;otilde;es do Jap&amp;atilde;o, vai ser interessante ver o que eles est&amp;atilde;o fazendo com PostgreSQL para manter seus servi&amp;ccedil;os. Ah, os japoneses s&amp;atilde;o os que mais usam telefone no mundo, imagina quanto um banco de dados &amp;eacute; exigido???&lt;/p&gt;
&lt;p&gt;- &lt;strong&gt;&lt;a href=&quot;http://pgbr.postgresql.org.br/2011/palestras.php?id=36&quot; target=&quot;_blank&quot;&gt;Fazendo uma manada de elefantes passar por baixo da porta&lt;/a&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; Provavelmente a palestra mais esperada da PGBR 2011. Dicas importantes de sobre hardware, sistemas de arquivos, etc. &amp;nbsp;Recomendado para qualquer um que &amp;eacute; ou ser&amp;aacute; respons&amp;aacute;vel por banco de dados, principalmente para sistemas OLTP (&lt;span class=&quot;Apple-style-span&quot;&gt;Online Transaction Processing&lt;/span&gt;) e tamb&amp;eacute;m, porque &amp;eacute; o &lt;a href=&quot;http://www.midstorm.org/~fike/weblog/2011/09/28/celebridades-do-postgresql-entrevistado/&quot; target=&quot;_blank&quot;&gt;brasileiro que trabalha com PostgreSQL sensa&amp;ccedil;&amp;atilde;o de 2011&lt;/a&gt;. Tamb&amp;eacute;m conhecido como &lt;a href=&quot;http://www.midstorm.org/~telles/&quot; target=&quot;_blank&quot;&gt;Telles Demolidor&lt;/a&gt; (Homem sem medo).&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; height=&quot;306&quot; src=&quot;http://www.comix.com.br/images/Panini_demolidor_homemsemmedo.jpg&quot; width=&quot;200&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;font class=&quot;Apple-style-span&quot; size=&quot;3&quot;&gt;&lt;b&gt;&lt;br /&gt;
	&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;PS. Aut&amp;oacute;grafos do Telles, basta agendar comigo. &lt;img src=&quot;http://www.midstorm.org/~fike/weblog/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;PS2. Hey, essa &amp;eacute; a minha lista de inten&amp;ccedil;&amp;atilde;o. As outras que n&amp;atilde;o listei aqui ser&amp;atilde;o apresentadas por pessoas de alta qualifica&amp;ccedil;&amp;atilde;o. Qual a sua lista?&lt;/p&gt;
&lt;div class=&quot;twttr_button&quot;&gt;
				&lt;a href=&quot;http://twitter.com/share?url=http://www.midstorm.org/~fike/weblog/2011/10/01/todo-minha-agenda-p-pgbr-2011/&amp;amp;text=TODO: Minha agenda p/ PGBR 2011&quot; target=&quot;_blank&quot; title=&quot;Click here if you liked this article&quot;&gt;
					&lt;img src=&quot;http://www.midstorm.org/~fike/weblog/wp-content/plugins/twitter-plugin/images/twitt.gif&quot; alt=&quot;Twitt&quot; /&gt;
				&lt;/a&gt;
			&lt;/div&gt;</content:encoded>
	<dc:date>2011-10-02T00:11:38+00:00</dc:date>
	<dc:creator>Fernando Ike</dc:creator>
</item>
<item rdf:about="http://www.midstorm.org/~fike/weblog/?p=1024">
	<title>Fernando Ike: Celebridades do PostgreSQL entrevistado</title>
	<link>http://www.midstorm.org/~fike/weblog/2011/09/28/celebridades-do-postgresql-entrevistado/</link>
	<content:encoded>&lt;p&gt;&lt;img alt=&quot;&quot; height=&quot;319&quot; src=&quot;http://www.flicksandbits.com/wp-content/uploads/2011/04/robert-pattinson-elephant.jpg&quot; width=&quot;500&quot; /&gt;&amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;Telles &amp;eacute; atualmente a celebridade brasileira do &lt;a href=&quot;http://www.postgresql.org&quot; target=&quot;_blank&quot;&gt;PostgreSQL&lt;/a&gt; em 2011. &amp;nbsp;Por que?&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;Simples, ele tem email de grife e foi entrevistado pelo pessoal do &lt;a href=&quot;http://imasters.com.br/artigo/22194/postgresql/databasecast-15-historia-do-postgresql&quot; target=&quot;_blank&quot;&gt;DatabaseCast para falar de PostgreSQ&lt;/a&gt;L. &amp;nbsp;E n&amp;atilde;o ache que &amp;eacute; pouca coisa, porque i&amp;aacute; apresentar uma das palestras mais quentes da &lt;a href=&quot;http://pgbr.postgresql.org.br&quot; target=&quot;_blank&quot;&gt;PGBR 2011&lt;/a&gt; que o t&amp;iacute;tulo &amp;quot;&lt;a href=&quot;http://pgbr.postgresql.org.br/2011/palestras.php?id=36&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;Fazendo um manada de elefantes passar por baixo da porta&lt;/strong&gt;&lt;/a&gt;&amp;quot;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;Basicamente a palestra dele &amp;eacute; sobre o uso do PostgreSQL em ambientes de alt&amp;iacute;ssima concorr&amp;ecirc;ncia, coisa para gente de conhecimento super elevado. N&amp;atilde;o perca. &lt;img src=&quot;http://www.midstorm.org/~fike/weblog/wp-includes/images/smilies/icon_biggrin.gif&quot; alt=&quot;:D&quot; class=&quot;wp-smiley&quot; /&gt; DD&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;P.S. Deixando a badala&amp;ccedil;&amp;atilde;o de lado. Boa entrevista do Telles, recomendo a audi&amp;ccedil;&amp;atilde;o.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; height=&quot;300&quot; src=&quot;http://3.bp.blogspot.com/_mOmFLCJdBqw/TMB7V1_FNDI/AAAAAAAAAw4/XNVfDjJAefY/s1600/pbDatabase.gif&quot; width=&quot;325&quot; /&gt;&lt;/p&gt;
&lt;div class=&quot;twttr_button&quot;&gt;
				&lt;a href=&quot;http://twitter.com/share?url=http://www.midstorm.org/~fike/weblog/2011/09/28/celebridades-do-postgresql-entrevistado/&amp;amp;text=Celebridades do PostgreSQL entrevistado&quot; target=&quot;_blank&quot; title=&quot;Click here if you liked this article&quot;&gt;
					&lt;img src=&quot;http://www.midstorm.org/~fike/weblog/wp-content/plugins/twitter-plugin/images/twitt.gif&quot; alt=&quot;Twitt&quot; /&gt;
				&lt;/a&gt;
			&lt;/div&gt;</content:encoded>
	<dc:date>2011-09-29T02:22:02+00:00</dc:date>
	<dc:creator>Fernando Ike</dc:creator>
</item>
<item rdf:about="http://guedesoft.net/blog/?p=513">
	<title>Dickson dos Santos Guedes: DatabaseCast #15: História do PostgreSQL – iMasters</title>
	<link>http://guedesoft.net/blog/2011/09/28/databasecast-15-historia-do-postgresql-%e2%80%93-imasters/</link>
	<content:encoded>Ouça o Telles falando sobre PostgreSQL no DatabaseCast #15: História do PostgreSQL – iMasters.</content:encoded>
	<dc:date>2011-09-28T14:43:58+00:00</dc:date>
</item>
<item rdf:about="http://guedesoft.net/blog/?p=506">
	<title>Dickson dos Santos Guedes: Lista de palestrantes confirmados para o PGBR 2011</title>
	<link>http://guedesoft.net/blog/2011/09/28/lista-de-palestrantes-confirmados-para-o-pgbr-2011/</link>
	<content:encoded>Apesar da grade do PGBR 2011 não ter sido divulgada ainda, já é possível ver a lista dos palestrantes ...</content:encoded>
	<dc:date>2011-09-28T04:28:24+00:00</dc:date>
</item>
<item rdf:about="http://guedesoft.net/blog/?p=504">
	<title>Dickson dos Santos Guedes: Liberada nova versão do PostgreSQL com correções cumulativas</title>
	<link>http://guedesoft.net/blog/2011/09/26/liberada-nova-versao-do-postgresql-com-correcoes-cumulativas/</link>
	<content:encoded>O Grupo de Desenvolvimento Global do PostgreSQL liberou hoje atualizações (minor version) para as versões: 9.1.1, 9.0.5, 8.4.9, 8.3.16 e 8.2.22.
É estremamente recomendável que todos os usuários atualizem as suas instalações atuais.
Em tempo, a comunidade PostgreSQL, até o final do ano provavelmente, vai parar de dar manutenção para a versão 8.2. Tendo em vista que [...]</content:encoded>
	<dc:date>2011-09-26T23:15:16+00:00</dc:date>
</item>
<item rdf:about="http://www.postgresql.org.br/16903 at http://www.postgresql.org.br">
	<title>PostgreSQL Brasil: Liberada nova versão do PostgreSQL com correções cumulativas</title>
	<link>http://www.postgresql.org.br/node/16903</link>
	<content:encoded>&lt;p&gt;O Grupo de Desenvolvimento Global do PostgreSQL liberou hoje atualiza&amp;ccedil;&amp;otilde;es (minor version) para as vers&amp;otilde;es: 9.1.1, 9.0.5, 8.4.9, 8.3.16 e 8.2.22.&lt;/p&gt;
&lt;p&gt;&amp;Eacute; estremamente recomend&amp;aacute;vel que todos os usu&amp;aacute;rios atualizem as suas instala&amp;ccedil;&amp;otilde;es atuais.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.postgresql.org.br/node/16903&quot; target=&quot;_blank&quot;&gt;leia mais&lt;/a&gt;&lt;/p&gt;</content:encoded>
	<dc:date>2011-09-26T23:14:48+00:00</dc:date>
</item>
<item rdf:about="http://guedesoft.net/blog/?p=477">
	<title>Dickson dos Santos Guedes: 5 coisas que você deveria saber sobre dump e restore no PostgreSQL</title>
	<link>http://guedesoft.net/blog/2011/09/26/5-coisas-que-voce-deveria-saber-sobre-dump-e-restore-no-postgresql/</link>
	<content:encoded>Depois de um período longo sem um computador decente para gravar os screencasts, voltei com o &lt;strong&gt;PGCasts&lt;/strong&gt;. Último episódio saindo do forno. Confira!</content:encoded>
	<dc:date>2011-09-26T03:00:32+00:00</dc:date>
</item>
<item rdf:about="tag:blogger.com,1999:blog-8625426919745210336.post-6389023070440079316">
	<title>Euler Taveira: Hora de considerar a versão 9.1?</title>
	<link>http://eulerto.blogspot.com/2011/09/hora-de-considerar-versao-91.html</link>
	<content:encoded>Ao ler o post do &lt;a href=&quot;http://blog.2ndquadrant.com/en/2011/09/limitations-removed-in-postgre.html&quot;&gt;Greg&lt;/a&gt;, resolvi apresentar a minha opinião sobre o $TITULO. É bom ser cauteloso quando estamos lidando com nossos dados. Mas será que devemos esperar quanto tempo antes de considerar uma atualização para uma versão mais nova?&lt;br /&gt;&lt;br /&gt;Quando estamos lidando com versões antigas de uma tecnologia sempre nos deparamos com desenvolvedores de aplicações que estão tentando utilizar as últimas funcionalidades que o software oferece. No universo do PostgreSQL, isso não é diferente; há sempre uma nova função, uma sintaxe diferente, a otimização de um tipo de consulta, um novo tipo de índice e por aí vai.&lt;br /&gt;&lt;br /&gt;Além disso, os DBAs enfrentam no dia-a-dia as limitações de uma versão que vai se tornando obsoleta ao longo dos anos (tenho clientes utilizando a versão 8.1 e que ainda sofrem dos picos de escrita durante o &lt;i&gt;checkpoint&lt;/i&gt;). Os DBAs são os profissionais mais cautelosos dentre aqueles que administram serviços; mesmo assim, consideram atualizar entre versões para (i) diminuírem a dor de cabeça com as limitações pré-existentes e (ii) beneficiarem das novas otimizações e oportunidades (de ajuste e monitoramento).&lt;br /&gt;&lt;br /&gt;Voltando a questão da versão, o PostgreSQL sempre considera novas versões aquelas que mudam o &lt;i&gt;X&lt;/i&gt; e/ou &lt;i&gt;Y&lt;/i&gt; em &lt;i&gt;X.Y.Z&lt;/i&gt; (o &lt;i&gt;Z&lt;/i&gt; é reservado para correção de bugs). Assim, os primeiros lançamentos das novas versões são 7.4.0, 8.0.0, 8.1.0, 8.2.0, 8.3.0, 8.4.0, 9.0.0, 9.1.0 (preferem omitir o&amp;nbsp;&lt;i&gt;.0&lt;/i&gt; pois afinal de contas, uma vez na versão &lt;i&gt;X.Y&lt;/i&gt; os binários podem ser atualizados para Z+n sem precisar fazer uma migração entre versões -- cópia de segurança -&amp;gt; restauração ou &lt;a href=&quot;http://www.postgresql.org/docs/current/static/pgupgrade.html&quot;&gt;pg_upgrade&lt;/a&gt;). Dentre os lançamentos mencionados há uma diferença: aqueles que mudam o &lt;i&gt;X&lt;/i&gt; e os que não mudam. É uma diferença na qualidade? &lt;u&gt;Não&lt;/u&gt;. A mudança no &lt;i&gt;X&lt;/i&gt; ocorre quando há um grande número de funcionalidades impactantes em uma nova versão com relação as anteriores. Foi assim da &lt;a href=&quot;http://www.postgresql.org/docs/current/static/release-8-0.html&quot;&gt;7.4 -&amp;gt; 8.0&lt;/a&gt; (suporte a Windows, tablespaces, PITR, savepoints) e da &lt;a href=&quot;http://www.postgresql.org/docs/current/static/release-9-0.html&quot;&gt;8.4 -&amp;gt; 9.0&lt;/a&gt; (replicação embutida, Hot Standby, bloco de código anônimo aka DO).&lt;br /&gt;&lt;br /&gt;Olhando do ponto de vista de evolução de um software, mais mudanças código geram mais bugs! Então para aqueles DBAs mais cautelosos eu não aconselho que migrem rapidamente quando o &lt;i&gt;X&lt;/i&gt; mudar. Costumo aconselhar que esperem alguns lançamentos de versões de correção (talvez 3 ou 4) para pensar em adotá-las. Quando quem muda é o &lt;i&gt;Y&lt;/i&gt;, o conselho é esperar 1 ou duas versões de correção. Geralmente, logo após o lançamento de uma versão (como foi o caso da 9.1 recentemente), o grupo de desenvolvimento lança versões corretivas pouco tempo depois para corrigir aqueles bugs que passaram despercebidos durante o longo ciclo de testes (beta e RC -- 6 meses).&lt;br /&gt;&lt;br /&gt;Como estamos na 9.1, se você estiver considerando uma atualização de versão, faça um planejamento com a 9.1 ao invés da 9.0 (por exemplo). Apesar de ser uma nova versão, o tempo que as suas aplicações ficarem em teste é exatamente aquele em que o grupo de desenvolvimento terá lançado 1 ou 2 versões corretivas.&lt;br /&gt;&lt;br /&gt;Seja feliz com 9.1 até que o 9.2 ou 9.3 saia do forno e você considere atualizar novamente. ;)&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/8625426919745210336-6389023070440079316?l=eulerto.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2011-09-14T18:52:16+00:00</dc:date>
	<dc:creator>Euler Taveira de Oliveira</dc:creator>
</item>
<item rdf:about="tag:blogger.com,1999:blog-6838506.post-1770466136072337828">
	<title>Leandro Guimarães Faria Corcete DUTRA: PgBr MMXI</title>
	<link>http://dutras.blogspot.com/2011/09/pgbr-mmxi.html</link>
	<content:encoded>&lt;p&gt;&lt;span class=&quot;post-body-first-line&quot;&gt;&lt;span class=&quot;post-body-first-letter&quot;&gt;M&lt;/span&gt;ais um ano, e volta a &lt;a href=&quot;http://pgbr.postgresql.org/&quot;&gt;Conferência Braſileira de PoſtgreSQL&lt;/a&gt;&lt;/span&gt;, agora chamada PgBr, e não mais PgConBr.  Além de economizar três caracteres (¡dã!), o novo nome evita coliſão com a &lt;a href=&quot;http://pgcon.org/&quot;&gt;Conferência global de PoſtgreSQL&lt;/a&gt;, realizada todo ano em &lt;a href=&quot;http://pt.wikipedia.org/wiki/Ottawa&quot;&gt;Otava&lt;/a&gt;, &lt;a href=&quot;http://pt.wikipedia.org/wiki/Ontário&quot;&gt;Ontário&lt;/a&gt;, &lt;a href=&quot;http://pt.wikipedia.org/wiki/Canadá&quot;&gt;Canadá&lt;/a&gt;, no primeiro ſemeſtre.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Ainda não ſei ſe poderei ir.  Eſte ano, apeſar de ſer realizada na capital de &lt;a href=&quot;http://pt.wikipedia.org/wiki/São Paulo (cidade)&quot;&gt;São Paulo dos Campos de Piratininga&lt;/a&gt;, &lt;a href=&quot;http://pt.wikipedia.org/wiki/São Paulo&quot;&gt;SP&lt;/a&gt;, a conferência realizar‐ſe‐á durante a ſemana de trabalho, como ſe fôra planejada para uma cidade de funcionários públicos, como &lt;a href=&quot;http://pt.wikipedia.org/wiki/Brasília&quot;&gt;Braſília&lt;/a&gt;, &lt;a href=&quot;http://pt.wikipedia.org/wiki/Distrito Federal (Brasil)&quot;&gt;DF&lt;/a&gt;.  Eu meſmo, funcionário público, ſaio do eſperado e me acho aßoberbado de trabalho, o que me dificulta a ida.  Ißo ainda poderia ſer negociado; o que realmente me atrapalha é juſtificar ir ſem paleſtrar, e tenho já mais de um ano afaſtado da área de dados, o que me gera falta de aßunto.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Não que não haja aßuntos intereßantes.  Mas após duas experiências ſofridas de paleſtrar ſem preparação adequada (&lt;a href=&quot;http://pgbr.postgresql.org.br/2009/&quot;&gt;PgBr MMIX&lt;/a&gt;, ſobre &lt;a href=&quot;http://pgbr.postgresql.org.br/2009/programacao.php&quot;&gt;expreßões comuns de tabelas&lt;/a&gt; e &lt;a href=&quot;http://www.pgcon.org/2010/&quot;&gt;PgCon MMX&lt;/a&gt;, ſobre &lt;a href=&quot;http://www.pgcon.org/2010/schedule/events/228.en.html&quot;&gt;modelagem literária&lt;/a&gt;), além de meu preſtígio ter baixado baſtante n&lt;a href=&quot;http://postgresql.org.br/&quot;&gt;a comunidade&lt;/a&gt;, reluto em achar que conſeguirei preparar e apreſentar algo que valha a pena, ainda mais que ainda eſtou ſem meu &lt;a href=&quot;http://debian.org./&quot;&gt;Debian&lt;/a&gt; &lt;a href=&quot;http://gnu.org./&quot;&gt;GNU&lt;/a&gt;/&lt;a href=&quot;http://linux.org./&quot;&gt;Linux&lt;/a&gt; em caſa, ainda com os problemas do &lt;a href=&quot;http://pt.wikipedia.org/wiki/EFI&quot;&gt;EFI&lt;/a&gt; da &lt;a href=&quot;http://apple.com/br/&quot;&gt;Apple&lt;/a&gt; — no trabalho, onde ainda é &lt;a href=&quot;http://pt.wikipedia.org/wiki/BIOS&quot;&gt;Bios&lt;/a&gt;, eſtou no conforto do Debian com GNU &lt;a href=&quot;http://gnu.org./software/emacs/&quot;&gt;Emacs&lt;/a&gt; — ſaudades do &lt;a href=&quot;http://es.wikipedia.org/wiki/Open_Firmware&quot;&gt;Open Firmware&lt;/a&gt;…&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Idéias até tenho — por exemplo, ‘O Paquiderme univerſal’, ſobre como o PoſtgreSQL, ao rodar em todo tipo de plataforma, eſcalando do portátil ao grande porte, com todo tipo de linguagem e extenſão, atende a praticamente todas as demandas poßíveis e imagináveis de computação e geſtão de dados deſte lado do &lt;a href=&quot;http://thethirdmanifesto.com/&quot;&gt;paraíſo relacional&lt;/a&gt;; ou ‘A Evolução paquidérmica: para o alto, e ¡avante!’, repaßando a liſta de &lt;a href=&quot;http://wiki.postgresql.org/wiki/Todo&quot;&gt;afazeres do PoſtgreSQL&lt;/a&gt;, moſtrando como vamos melhorar, talvez colocando em perſpectiva tanto das noßas verſões mais recentes quanto do eſtado e melhorias mais recentes dos principais concorrentes; ou ‘O Elefante: ſua verdadeira forma, e diſfarces’, moſtrando as facilidades de migração de código, com ênfaſe dividida entre facilidades de compatibilidade com concorrentes e aplicação de padrões que facilitam a migração de e para o PoſtgreSQL.  A queſtão é que, no momento, creio que há muito mais gente que poßa fazê-lo muito melhor do que eu.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Vejamos.  No momento, não eſtou paßando bem.  Talvez amanhã reſolva apreſentar algo, o prazo já ſe encerrará.  Mas eu bem preferia que outros apreſentaßem eßes temas, e outros melhores ainda.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Se eu não puder ir, peço que alguém levante a diſcußão: regiſtremos os domínios &lt;a href=&quot;http://poſtgres.org.br/&quot;&gt;Poſtgres&lt;/a&gt;,  &lt;a href=&quot;http://poſtgresql.org.br/&quot;&gt;PoſtgreSQL&lt;/a&gt; e  &lt;a href=&quot;http://postgres.org.br/&quot;&gt;Postgres.org.br&lt;/a&gt;?&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/6838506-1770466136072337828?l=dutras.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2011-09-14T17:23:39+00:00</dc:date>
	<dc:creator>Leandro Guimarães Faria Corcete DUTRA</dc:creator>
</item>
<item rdf:about="tag:blogger.com,1999:blog-3371915898459901668.post-1691220424041542799">
	<title>Claudio Bezerra Leopoldino: PostgreSQL 9.1 Lançado Oficialmente!</title>
	<link>http://postgresqlbr.blogspot.com/2011/09/postgresql-91-lancado-oficialmente.html</link>
	<content:encoded>A muito aguardada versão 9.1 do PostgreSQL está disponível para &lt;a href=&quot;http://www.postgresql.org/download&quot;&gt;download&lt;/a&gt;. O destaque são as mudanças relacionadas a performance e replicação, mas existem melhorias em praticamente todos os campos. É baixar, instalar e usar!&lt;br /&gt;&lt;br /&gt;Abaixo o texto do anúncio oficial:&lt;br /&gt;&lt;br /&gt;&lt;div&gt;------------------------------------------------------------------------------------&lt;/div&gt;&lt;br /&gt;&lt;i&gt;The PostgreSQL Global Development Group announces the release of&lt;br /&gt;PostgreSQL 9.1.&amp;nbsp; This latest version of the leading open source database&lt;br /&gt;offers innovative technology, unmatched extensibility, and new features&lt;br /&gt;such as synchronous replication, K-Nearest Neighbor indexing, and&lt;br /&gt;foreign data wrappers.&lt;br /&gt;&lt;br /&gt;&quot;PostgreSQL 9.1 provides some of the most advanced enterprise&lt;br /&gt;capabilities of any open source database, and is backed by a vibrant and&lt;br /&gt;innovative community with proven customer success.&amp;nbsp; PostgreSQL is well&lt;br /&gt;positioned for building and running applications in the cloud,&quot; said&lt;br /&gt;Charles Fan, Sr. VP R&amp;amp;D, VMware.&lt;br /&gt;&lt;br /&gt;Responding to Users&lt;br /&gt;&lt;br /&gt;Version 9.1 delivers several features which users have been requesting&lt;br /&gt;for years, removing roadblocks to deploying new or ported applications&lt;br /&gt;on PostgreSQL.&amp;nbsp; These include:&lt;br /&gt;&lt;br /&gt;* Synchronous Replication: enable high-availability&lt;br /&gt;&amp;nbsp; with consistency across multiple servers&lt;br /&gt;* Per-Column Collations: support linguistically-correct&lt;br /&gt;&amp;nbsp; sorting per database, table or column.&lt;br /&gt;* Unlogged Tables: greatly improves performance for ephemeral data&lt;br /&gt;&lt;br /&gt;&quot;Heroku runs the largest PostgreSQL database-as-a-service in the world,&quot;&lt;br /&gt;said James Lindenbaum, Heroku co-founder. &quot;The release of synchronous&lt;br /&gt;data replication with 9.1 provides our customers with innovative new&lt;br /&gt;ways of protecting mission-critical data, and validates PostgreSQL as&lt;br /&gt;one of the fastest-moving datastores available.&quot;&lt;br /&gt;&lt;br /&gt;Advancing the State of the Art&lt;br /&gt;&lt;br /&gt;Our community of contributors innovates with cutting-edge features.&lt;br /&gt;Version 9.1 includes several which are new to the database industry,&lt;br /&gt;such as:&lt;br /&gt;&lt;br /&gt;* K-Nearest-Neighbor Indexing: index on &quot;distance&quot; for&lt;br /&gt;&amp;nbsp; faster location and text-search queries&lt;br /&gt;* Serializable Snapshot Isolation: keeps concurrent transactions&lt;br /&gt;&amp;nbsp; consistent without blocking, using &quot;true serializability&quot;&lt;br /&gt;* Writeable Common Table Expressions: execute complex multi-stage&lt;br /&gt;&amp;nbsp; data updates in a single query&lt;br /&gt;* Security-Enhanced Postgres: deploy military-grade security&lt;br /&gt;&amp;nbsp; and Mandatory Access Control&lt;br /&gt;&lt;br /&gt;&quot;OpenERP has always relied on the enterprise-class features of&lt;br /&gt;PostgreSQL to provide a fast, reliable and scalable foundation for the&lt;br /&gt;Business Applications supporting our customers' operations every day.&lt;br /&gt;Data integrity in highly concurrent and transactional contexts is a&lt;br /&gt;critical topic for us, and we're very enthusiastic about the new&lt;br /&gt;Serializable Snapshot Isolation of PostgreSQL 9.1!&quot;&amp;nbsp; said Olivier Dony,&lt;br /&gt;OpenERP Community Manager.&lt;br /&gt;&lt;br /&gt;Extending the Database Engine&lt;br /&gt;&lt;br /&gt;PostgreSQL's extensibility enables users to add new functionality to a&lt;br /&gt;running production database, and use them for tasks no other database&lt;br /&gt;system can perform.&amp;nbsp; Version 9.1 adds new extensibility tools, including:&lt;br /&gt;&lt;br /&gt;* Foreign Data Wrappers: attach and query other databases&lt;br /&gt;&amp;nbsp; from PostgreSQL&lt;br /&gt;* Extensions: easily create, load, and manage new database features&lt;br /&gt;&lt;br /&gt;In PostgreSQL's 25th year of database development, our community&lt;br /&gt;continues to advance database technology with every annual release.&lt;br /&gt;Download version 9.1 now and experience the most advanced open source&lt;br /&gt;database system in the world.&lt;br /&gt;&lt;br /&gt;More information on PostgreSQL 9.1:&lt;br /&gt;* Release notes&lt;br /&gt;&amp;nbsp; &lt;a href=&quot;http://www.postgresql.org/docs/9.1/static/release-9-1&quot; target=&quot;_blank&quot;&gt;http://www.postgresql.org/docs/9.1/static/release-9-1&lt;/a&gt;&lt;br /&gt;* Presskit&lt;br /&gt;&amp;nbsp; &lt;a href=&quot;http://www.postgresql.org/about/press/presskit91&quot; target=&quot;_blank&quot;&gt;http://www.postgresql.org/about/press/presskit91&lt;/a&gt;&lt;br /&gt;* Guide to 9.0:&lt;br /&gt;&amp;nbsp; &lt;a href=&quot;http://wiki.postgresql.org/wiki/What%27s_new_in_PostgreSQL_9.1&quot; target=&quot;_blank&quot;&gt;http://wiki.postgresql.org/wiki/What's_new_in_PostgreSQL_9.1&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Download 9.1 now:&lt;br /&gt;* Main download page:&lt;br /&gt;&amp;nbsp; &lt;a href=&quot;http://www.postgresql.org/download&quot; target=&quot;_blank&quot;&gt;http://www.postgresql.org/download&lt;/a&gt;&lt;br /&gt;* Source code:&lt;br /&gt;&amp;nbsp; &lt;a href=&quot;http://www.postgresql.org/ftp/source/v9.1.0&quot; target=&quot;_blank&quot;&gt;http://www.postgresql.org/ftp/source/v9.1.0&lt;/a&gt;&lt;br /&gt;* One-click installer, including Windows installer:&lt;br /&gt;&amp;nbsp; &lt;a href=&quot;http://www.enterprisedb.com/products/pgdownload.do&quot; target=&quot;_blank&quot;&gt;http://www.enterprisedb.com/products/pgdownload.do&lt;/a&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3371915898459901668-1691220424041542799?l=postgresqlbr.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2011-09-12T10:58:46+00:00</dc:date>
	<dc:creator>cbleopoldino</dc:creator>
</item>
<item rdf:about="tag:blogger.com,1999:blog-3371915898459901668.post-7909675147169877230">
	<title>Claudio Bezerra Leopoldino: Serpro Ultrapassa os 200 Bancos de Dados PostgreSQL!</title>
	<link>http://postgresqlbr.blogspot.com/2011/09/serpro-ultrapassa-os-200-bancos-de.html</link>
	<content:encoded>&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-d_33BpY9hB8/TmpOr0WqASI/AAAAAAAAAOA/EvZhmlJVqy0/s1600/serprologo.jpeg&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-d_33BpY9hB8/TmpOr0WqASI/AAAAAAAAAOA/EvZhmlJVqy0/s1600/serprologo.jpeg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Ao atingir o volume de 220 bancos de dados, o PostgreSQL passa a ocupar a&lt;br /&gt;posição de destaque como tecnologia livre de bancos de dados no Serpro - Serviço Federal de Processamento de Dados. O MySQl apresenta 200 bancos de dados implementados.&lt;br /&gt;&lt;br /&gt;Confira esta informação na página 19 da edição 207 da versão online de &lt;a href=&quot;http://tema.serpro.gov.br/pub/serpro/index.jsp?ipg=544&quot;&gt;revista TEMA&lt;/a&gt;. Outro artigo com destaque para o Postgres é o do encarte TEMATEC &quot;Expresso em Nuvem&quot;, que mostra uma implementação de grande porte com Postgres e &lt;a href=&quot;http://pgpool.projects.postgresql.org/&quot;&gt;PgPool&lt;/a&gt;.&lt;div class=&quot;blogger-post-footer&quot;&gt;Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3371915898459901668-7909675147169877230?l=postgresqlbr.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2011-09-09T14:46:57+00:00</dc:date>
	<dc:creator>cbleopoldino</dc:creator>
</item>
<item rdf:about="tag:blogger.com,1999:blog-8625426919745210336.post-6300399704501277329">
	<title>Euler Taveira: palestras para PGBR 2011</title>
	<link>http://eulerto.blogspot.com/2011/09/palestras-para-pgbr-2011.html</link>
	<content:encoded>Esta semana encerra o prazo para o envio de palestras para o &lt;a href=&quot;http://pgbr.postgresql.org.br/2011/&quot;&gt;PGBR 2001&lt;/a&gt; que acontecerá nos dias 3 e 4 de novembro em São Paulo, SP. Não deixe de enviar a sua proposta de palestra!&lt;br /&gt;&lt;br /&gt;As palestras podem ser básicas ou avançadas, curtas (palestra) ou longas (tutorial), português, espanhol ou inglês. Só há um pré-requisito: ser relacionada ao PostgreSQL.&lt;br /&gt;&lt;br /&gt;Todos os palestrantes terão entrada &lt;b&gt;gratuita&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Vá a página de &lt;a href=&quot;http://pgbr.postgresql.org.br/2011/ems/cfp.php&quot;&gt;submissões de trabalhos&lt;/a&gt; e envie-nos as suas propostas! Você pode submeter até 5 ideias interessantes. Não deixe de divulgar esta nota para outras comunidades relacionadas; talvez alguém tem uma ideia interessante por lá.&lt;br /&gt;&lt;br /&gt;Te espero no PGBR 2011.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/8625426919745210336-6300399704501277329?l=eulerto.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2011-09-07T01:31:33+00:00</dc:date>
	<dc:creator>Euler Taveira de Oliveira</dc:creator>
</item>
<item rdf:about="http://www.midstorm.org/~telles/?p=795">
	<title>Fabio Telles: PGBR2011 – Inscrições abertas!</title>
	<link>http://www.midstorm.org/~telles/2011/09/03/pgbr2011-inscricoes-abertas/</link>
	<content:encoded>&lt;p&gt;&lt;a title=&quot;PGBR2011 - Inscrições abertas!&quot; href=&quot;http://pgbr.postgresql.org.br/&quot;&gt;&lt;img class=&quot;aligncenter&quot; title=&quot;PGBR2011 - Inscrições abertas&quot; src=&quot;http://pgbr.postgresql.org.br/2011/imgs/divulgue_inscricoes.png&quot; alt=&quot;&quot; width=&quot;168&quot; height=&quot;80&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Este ano tudo será diferente&amp;#8230;. sim já é. Uma das maiores dificuldades do PGCon Brasil, agora rebatizado como PGBR, é a parte das inscrições. É o tipo de coisa difícil de fazer de forma voluntária. Nas edições anteriores o Euler Taveira e o Diogo Biazus se mataram para fazer as inscrições acontecerem. Bom, a gente continua se matando, mas desta vez temos uma forcinha. Temos algo revolucionário: um número de telefone!!! Ou seja, alguém poderá lhe ouvir, tirar suas dúvidas, falar como nós somos bacanas, ouvir reclamações e passar receitas de bolo pelo telefone. Não, a pessoa que irá atender o telefone não vai lhe ensinar a deixar o seu banco de dados mais rápido&amp;#8230;. se a gente faz isso ninguém vai no evento, &lt;img src=&quot;http://www.midstorm.org/~telles/wp-includes/images/smilies/icon_razz.gif&quot; alt=&quot;:-P&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;Mas não é só isso, o Euler melhorou bastante a 3º versão do sistema de inscrições. As notas fiscais continuarão sendo um problema chato, pois a prefeitura de Porto Alegre &amp;#8211; RS ainda não emite nota fiscal eletrônica. Ou seja, ainda vamos ter que continuar mandando pelo correio. Se você não precisa de nota fiscal, pegue o seu boleto, pague, autentique e use-o como comprovante. Dá um trabalhão despachar tudo pelo correio.&lt;/p&gt;
&lt;p&gt;Se você pertence a um órgão público, se adiante por favor. Todo mundo sabe o mega trampo que é fazer o processo de empenho. Estamos com todos os documentos em ordem, a &lt;a href=&quot;http://softwarelivre.org/asl&quot;&gt;ASL&lt;/a&gt; (o PostgreSQL-BR é associado a ASL, que é quem nos dá respaldo jurídico e contábil), e já está cadastrada no SICAF. Facilite a sua vida e consulte o &lt;a href=&quot;http://www.comprasnet.gov.br/&quot;&gt;SICAF&lt;/a&gt;. Sim, o preço da inscrição para governo é mais caro. Também nos custa muito receber o dinheiro da inscrição de um órgão público. E o dinheiro só pode ser utilizado para custear o evento do próximo ano, uma vez que governo só paga depois do evento&amp;#8230; e os nossos fornecedores não trabalham assim.&lt;/p&gt;
&lt;p&gt;A grande novidade na minha opinião é a inscrição VIP. Todo mundo que se inscreve tem acesso às palestras nos 2 dias, coffe-break e a cervejada que deverá rolar no encerramento. Mas quem puder pagar um pouco mais, já pode incluir o custo do almoço no hotel. As vagas são limitadas, pois o restaurante do hotel não vai comportar todos. Mas para quem optar por isso, vai poder almoçar junto com os palestrantes, patrocinadores e a organização do evento. As vagas são limitadas a 80 pessoas, então corram, pois a maioria dos inscritos até agora optou mesmo pela inscrição VIP.&lt;/p&gt;
&lt;p&gt;Bom, por enquanto é só, façam já sua inscrição e o chopp será por nossa conta. Em tempo: há também uma promoção para os 20 primeiros inscritos &lt;em&gt;confirmados&lt;/em&gt; no evento. Eles ganharão um elefante de pelúcia do PGBR. Mas acredito que quando você estiver lendo isso, a promoção já tenha acabado. A não ser que o 20 primeiros demorem muito para &lt;em&gt;confirmar&lt;/em&gt; (a.k.a. &lt;em&gt;pagar&lt;/em&gt;) suas inscrições.&lt;/p&gt;</content:encoded>
	<dc:date>2011-09-03T13:00:39+00:00</dc:date>
</item>
<item rdf:about="http://www.postgresql.org.br/16898 at http://www.postgresql.org.br">
	<title>PostgreSQL Brasil: Inscrições abertas para o PGBR2011</title>
	<link>http://www.postgresql.org.br/node/16898</link>
	<content:encoded>&lt;h3&gt;&amp;nbsp;As &lt;a target=&quot;_blank&quot; href=&quot;http://pgbr.postgresql.org.br/2011/inscricoes.php&quot;&gt;inscri&amp;ccedil;&amp;otilde;es para o PGBR2011&lt;/a&gt; se iniciaram hoje&lt;/h3&gt;
&lt;p&gt;&lt;br /&gt;
Para aqueles que se inscreverem at&amp;eacute; 16/09 o pre&amp;ccedil;o estar&amp;aacute; bem mais em conta:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.postgresql.org.br/node/16898&quot; target=&quot;_blank&quot;&gt;leia mais&lt;/a&gt;&lt;/p&gt;</content:encoded>
	<dc:date>2011-09-02T01:49:31+00:00</dc:date>
</item>
<item rdf:about="http://www.midstorm.org/~fike/weblog/?p=1007">
	<title>Fernando Ike: PGBR2011 – Chamada de trabalhos</title>
	<link>http://www.midstorm.org/~fike/weblog/2011/08/29/pgbr2011-%e2%80%93-chamada-de-trabalhos/</link>
	<content:encoded>&lt;p&gt;&lt;a href=&quot;http://pgbr.postgresql.org.br&quot;&gt;&lt;br /&gt;
	&lt;img alt=&quot;PGBR 2011 - Conferência Brasileira PostgreSQL&quot; border=&quot;0&quot; height=&quot;60&quot; src=&quot;http://pgbr.postgresql.org.br/2011/imgs/divulgue_horizontal_pequeno.jpg&quot; width=&quot;432&quot; /&gt; &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; O &lt;a href=&quot;http://www.midstorm.org/~telles/&quot; target=&quot;_blank&quot;&gt;telles&lt;/a&gt; fez a &lt;a href=&quot;http://www.midstorm.org/~telles/2011/08/14/pgbr2011-chamada-de-trabalhos/&quot; target=&quot;_blank&quot;&gt;melhor chamada de trabalhos que algu&amp;eacute;m poderia escrever&lt;/a&gt;, portanto nem vou tentar fazer melhor. Vai l&amp;aacute; e l&amp;ecirc;!!!&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; Enviei duas propostas:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Escalabilidade, As Modas e (No)SQL&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Escalabilidade e a miserabilidade do fracasso&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; height=&quot;262&quot; src=&quot;http://3.bp.blogspot.com/_1x5nKkIk-rs/SxSW0_F1IuI/AAAAAAAAHvQ/l47e8BvopSI/s1600/pink_elephants-1.jpg&quot; width=&quot;400&quot; /&gt;&lt;/p&gt;
&lt;div class=&quot;twttr_button&quot;&gt;
				&lt;a href=&quot;http://twitter.com/share?url=http://www.midstorm.org/~fike/weblog/2011/08/29/pgbr2011-%e2%80%93-chamada-de-trabalhos/&amp;amp;text=PGBR2011 – Chamada de trabalhos&quot; target=&quot;_blank&quot; title=&quot;Click here if you liked this article&quot;&gt;
					&lt;img src=&quot;http://www.midstorm.org/~fike/weblog/wp-content/plugins/twitter-plugin/images/twitt.gif&quot; alt=&quot;Twitt&quot; /&gt;
				&lt;/a&gt;
			&lt;/div&gt;</content:encoded>
	<dc:date>2011-08-30T00:30:02+00:00</dc:date>
	<dc:creator>Fernando Ike</dc:creator>
</item>
<item rdf:about="http://ribafs.wordpress.com/2006/12/22/podutividade-no-desenvolvimento-web/">
	<title>Ribamar FS: Dicas e Truques do SQL no PostgreSQL</title>
	<link>http://ribafs.wordpress.com/2006/12/22/podutividade-no-desenvolvimento-web/</link>
	<content:encoded>&lt;h2&gt;Trabalhando com SQL&lt;/h2&gt;
&lt;p&gt;Quase todas estas dicas abaixo recebi na lista de PostgreSQL do http://postgresql.org.br. Sempre que lembrei concedi os devidos créditos.&lt;br /&gt;
&lt;strong&gt;1) Criar Tabela tendo outra outra como base e já importando todos os registros dessa outra:&lt;/strong&gt;&lt;br /&gt;
CREATE TABLE tabelanova AS SELECT * FROM tabealexistente;&lt;br /&gt;
&lt;strong&gt;2) Inserindo com SELECT&lt;/strong&gt;&lt;br /&gt;
Inserir todos os registros de uma tabela em outra:&lt;br /&gt;
INSERT INTO tabelaqueimporta SELECT * from tabelaqueexporta;&lt;/p&gt;
&lt;p&gt;insert into engenharia.insumos (grupo,insumo,descricao,unidade) select grupo,insumo,descricao, CAST(unidade AS int2) AS &amp;#8220;unidade&amp;#8221; from engenharia.apagar&lt;/p&gt;
&lt;p&gt;insert into engenharia.insumos (grupo,insumo,descricao,unidade) select grupo,insumo,descricao, cast(unidade AS INT2) AS unidade from engenharia.apagar&lt;/p&gt;
&lt;p&gt;$conn = pg_connect(&amp;#8220;host=10.40.100.186 dbname=apoena user=_postgresql&amp;#8221;);&lt;br /&gt;
for($x=10;$x&amp;lt;=87;$x++){&lt;br /&gt;
$sql=&amp;#8221;update engenharia.precos set custo_produtivo = (select custo_produtivo from engenharia.apagar where insumo=&amp;#8217;$x&amp;#8217;) where insumo=&amp;#8217;00&amp;#8242; || &amp;#8216;$x&amp;#8217;&amp;#8221;;&lt;br /&gt;
$ret=pg_query($conn,$sql);&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;br /&gt;
3) Atualizar um campo em todos os registros de uma tabela recebendo de outra tabela:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;UPDATE servicos s SET custo = total FROM composicoes c&lt;br /&gt;
WHERE s.tabela = c.tabela AND s.servico = c.servico&lt;/p&gt;
&lt;p&gt;Uso do Like e de Expressões Regulares&lt;/p&gt;
&lt;p&gt;Registros:&lt;br /&gt;
Ribamar Ferreira de Sousa&lt;br /&gt;
João Pereira Brito&lt;/p&gt;
&lt;p&gt;Usando LIKE e ILIKE&lt;/p&gt;
&lt;p&gt;SELECT * FROM clientes WHERE nome LIKE &amp;#8216;Riba%&amp;#8217;; // Retorna Ribamar Ferreira de Sousa&lt;br /&gt;
SELECT * FROM clientes WHERE nome LIKE &amp;#8216;riba%&amp;#8217;; // Nada retorna&lt;br /&gt;
SELECT * FROM clientes WHERE nome ILIKE &amp;#8216;riba%&amp;#8217;; // Retorna Ribamar Ferreira de Sousa&lt;br /&gt;
SELECT * FROM clientes WHERE nome NOT LIKE &amp;#8216;pedro&amp;#8217;; // Retorna ambos os registros&lt;/p&gt;
&lt;p&gt;Usando Expressões Regulares&lt;/p&gt;
&lt;p&gt;SELECT * FROM clientes WHERE nome ~~ &amp;#8216;Riba%&amp;#8217;; // Retorna Ribamar Ferreira de Sousa&lt;br /&gt;
SELECT * FROM clientes WHERE nome ~~ &amp;#8216;riba%&amp;#8217;; // Nada retorna&lt;br /&gt;
SELECT * FROM clientes WHERE nome ~~* &amp;#8216;riba%&amp;#8217;; // Retorna Ribamar Ferreira de Sousa&lt;br /&gt;
SELECT * FROM clientes WHERE nome !~~ &amp;#8216;pedro&amp;#8217;; // Retorna ambos os registros&lt;br /&gt;
SELECT nome FROM clientes WHERE nome ~ &amp;#8216;Ribamar Ferreira de Sousa&amp;#8217;; // Retorna Ribamar Ferreira de Sousa&lt;br /&gt;
SELECT * FROM clientes WHERE nome !~ &amp;#8216;jorge&amp;#8217;; // Retorna ambos&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4) Buscar nas tabelas de sistema do postgresql, todos as tabelas de um determinado schema, os campos que sejam do tipo boolean.. &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;SELECT n.nspname AS Schema, c.relname AS Tabela, t.typname AS Tipo&lt;br /&gt;
FROM pg_class c&lt;br /&gt;
LEFT JOIN pg_namespace n ON n.oid = c.relnamespace&lt;br /&gt;
LEFT JOIN pg_type t ON t.oid = c.reltype&lt;br /&gt;
WHERE c.relkind = &amp;#8216;r&amp;#8217;::&amp;#8221;char&amp;#8221;&lt;br /&gt;
AND t.typname = &amp;#8216;boolean&amp;#8217;;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;br /&gt;
5) Exemplos de Joins&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Join com 4 tabelas&lt;/p&gt;
&lt;p&gt;$w_sql = &amp;#8221; TRUE &amp;#8220;;&lt;/p&gt;
&lt;p&gt;if ( $p_tabela != &amp;#8220;&amp;#8221;) { $w_sql = $w_sql . &amp;#8221; AND tabela ~~*&amp;#8217;&amp;#8221; . $p_tabela . &amp;#8220;&amp;#8216;&amp;#8221;; }&lt;br /&gt;
if ( $p_insumo_grupo != &amp;#8220;&amp;#8221;) { $w_sql = $w_sql . &amp;#8221; AND insumo_grupo ~~*&amp;#8217;&amp;#8221; .$p_insumo_grupo.&amp;#8221;&amp;#8216;&amp;#8221;; }&lt;br /&gt;
if ( $p_insumo != &amp;#8220;&amp;#8221;) { $w_sql = $w_sql . &amp;#8221; AND insumo ~~*&amp;#8217;&amp;#8221; . $p_insumo . &amp;#8220;&amp;#8216;&amp;#8221;; }&lt;br /&gt;
if ( $p_fornecedor != &amp;#8220;&amp;#8221;) { $w_sql = $w_sql . &amp;#8221; AND fornecedor ~~*&amp;#8217;&amp;#8221; .$p_fornecedor.&amp;#8221;&amp;#8216;&amp;#8221;; }&lt;/p&gt;
&lt;p&gt;$w_sql=&amp;#8221;SELECT distinct on (p.tabela, p.insumo_grupo, p.insumo, p.fornecedor) p.custo_produtivo, p.data_inclusao,&lt;br /&gt;
t.tabela, t.descricao as tabelad,&lt;br /&gt;
ig.grupo, ig.descricao as insumogd,&lt;br /&gt;
i.grupo, i.insumo, i.descricao as insumod,&lt;br /&gt;
f.codigo_fornecedor, f.razao_social as fornecedord&lt;br /&gt;
FROM $m_table as p, $m_table_tab as t, $m_table_ing as ig, $m_table_ins as i, $m_table_for as f&lt;br /&gt;
WHERE p.tabela=t.tabela AND p.insumo_grupo=ig.grupo AND p.insumo=i.insumo AND p.fornecedor=f.codigo_fornecedor&lt;br /&gt;
AND p.insumo_grupo = i.grupo ORDER BY p.tabela DESC, p.insumo_grupo;&amp;#8221;;&lt;/p&gt;
&lt;p&gt;/*&lt;br /&gt;
p &amp;#8211; $m_table (engenharia.precos)&lt;br /&gt;
i &amp;#8211; $m_table_ins (engenharia.insumos)&lt;br /&gt;
ig &amp;#8211; $m_table_ing (engenharia.insumos_grupos)&lt;br /&gt;
t &amp;#8211; $m_table_tab (engenharia.tabela)&lt;br /&gt;
*/&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;br /&gt;
6) Mudar Tipo de Dados de Campo &amp;#8211; CAST (Só &amp;gt;=8.0):&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;ALTER TABLE tabela ALTER COLUMN campo TYPE tipo;&lt;br /&gt;
ALTER TABLE produtos ALTER COLUMN preco TYPE numeric(10,2);&lt;br /&gt;
ALTER TABLE produtos ALTER COLUMN data TYPE DATE USING CAST (data AS DATE);&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;br /&gt;
7) Renomear Tabela&lt;/strong&gt;&lt;br /&gt;
ALTER TABLE tabela RENAME TO nomenovo;&lt;br /&gt;
ALTER TABLE produtos RENAME TO equipamentos;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;br /&gt;
 &lt;img src=&quot;http://s0.wp.com/wp-includes/images/smilies/icon_cool.gif&quot; alt=&quot;8)&quot; class=&quot;wp-smiley&quot; /&gt; Tamanho de Tabela, Banco ou Todos os Bancos do SGBD:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Tamanho de Banco de Dados (postgresql 8.1 ou superior):&lt;br /&gt;
select pg_database_size(&amp;#8216;nomebanco&amp;#8217;);&lt;/p&gt;
&lt;p&gt;Tamanho de Tabela&lt;br /&gt;
select pg_tablespace_size(&amp;#8216;nometabela&amp;#8217;);&lt;/p&gt;
&lt;p&gt;Tamanho de todos os bancos de dados do SGBD:&lt;br /&gt;
select (sum(relpages) * &lt;img src=&quot;http://s0.wp.com/wp-includes/images/smilies/icon_cool.gif&quot; alt=&quot;8)&quot; class=&quot;wp-smiley&quot; /&gt; / 1024 || &amp;#8216; MB&amp;#8217; as tamanho from pg_class where relowner &amp;gt; 1;&lt;/p&gt;
&lt;p&gt;Ou&lt;/p&gt;
&lt;p&gt;select (sum(relpages) / 2^7) :: int || &amp;#8216; MB&amp;#8217; as tamanho from pg_class where relowner &amp;gt; 1;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;br /&gt;
9) Validação de e-mails&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1 &amp;#8211; select distinct(campo_email),campo_nome, campos_n from tabela where campo_email like &amp;#8216;%@%.%&amp;#8217;&lt;br /&gt;
2 &amp;#8211; SELECT POSITION(&amp;#8216;@&amp;#8217;, &amp;#8216;ribafs@gmail.com&amp;#8217;) &amp;gt; 0&lt;br /&gt;
3 &amp;#8211; select &amp;#8216;coutinho.php@gmail.com&amp;#8217; ~ &amp;#8216;@&amp;#8217;&lt;br /&gt;
4 &amp;#8211; select &amp;#8216;coutinho.php@gmail.com&amp;#8217; like &amp;#8216;%@%&amp;#8217;&lt;br /&gt;
5 &amp;#8211; select if (&amp;#8216;campo_email&amp;#8217; like &amp;#8220;%@%.%&amp;#8221;,&amp;#8221;TRUE&amp;#8221;,&amp;#8221;FALSE&amp;#8221;) as flag, campo_adcional from tabela&lt;br /&gt;
6 &amp;#8211; select &amp;#8216;coutinho@gmail.com&amp;#8217; similar to &amp;#8216;%@%.%&amp;#8217;;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;br /&gt;
10) Temos um campo (insumo) com valores = 1, 2, 3, &amp;#8230; 87&lt;/strong&gt;&lt;br /&gt;
Queremos atualizar para 0001, 0002, 0003, &amp;#8230; 0087&lt;/p&gt;
&lt;p&gt;UPDATE equipamentos SET insumo = &amp;#8217;000&amp;#8242; || insumo WHERE LENGTH(insumo) = 1;&lt;br /&gt;
UPDATE equipamentos SET insumo = &amp;#8217;00&amp;#8242; || insumo WHERE LENGTH(insumo) = 2;&lt;/p&gt;
&lt;p&gt;Outra saída mais elegante ainda:&lt;/p&gt;
&lt;p&gt;UPDATE equipamentos SET insumo = REPEAT(&amp;#8217;0&amp;#8242;, 4-LENGTH(insumo)) || insumo;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;br /&gt;
11) Retornar o número de usuários conectados&lt;/strong&gt;&lt;br /&gt;
select count(*) from pg_stat_activity&lt;/p&gt;
&lt;p&gt;pg_stat_database que apresenta para cada banco de dados o número de conexões.&lt;br /&gt;
Eu particularmente acho que fica mais fácil de visualizar do que o pg_stat_activity quando se tem muitas conexões.&lt;/p&gt;
&lt;p&gt;Mostrar uso dos índices dos bancos de dados:&lt;br /&gt;
select * from pg_statio_user_indexes;&lt;/p&gt;
&lt;p&gt;select * from pg_stat_user_indexes;&lt;/p&gt;
&lt;p&gt;Mostra estatística de uso das tabelas e manutenção:&lt;br /&gt;
select * from pg_stat_all_tables;&lt;/p&gt;
&lt;p&gt;Mostra todas as tabelas do atual esquema do atual banco:&lt;br /&gt;
select * from pg_stat_user_tables;&lt;/p&gt;
&lt;p&gt;pg_stat_get_tuples_returned(oid) bigint Number of rows read by sequential scans when argument is a table, or number of index entries returned when argument is an index&lt;br /&gt;
pg_stat_get_tuples_fetched(oid) bigint Number of table rows fetched by bitmap scans when argument is a table, or table rows fetched by simple index scans using the index when argument is an index&lt;br /&gt;
pg_stat_get_tuples_inserted(oid) bigint Number of rows inserted into table&lt;br /&gt;
pg_stat_get_tuples_updated(oid) bigint Number of rows updated in table&lt;br /&gt;
pg_stat_get_tuples_deleted(oid) bigint Number of rows deleted from table&lt;br /&gt;
pg_stat_get_blocks_fetched(oid) bigint Number of disk block fetch requests for table or index&lt;br /&gt;
pg_stat_get_blocks_hit(oid) bigint Number of disk block requests found in cache for table or index&lt;br /&gt;
pg_stat_get_last_vacuum_time(oid) timestamptz Time of the last vacuum initiated by the user on this table&lt;br /&gt;
pg_stat_get_last_autovacuum_time(oid) timestamptz Time of the last vacuum initiated by the autovacuum daemon on this table&lt;br /&gt;
pg_stat_get_last_analyze_time(oid) timestamptz Time of the last analyze initiated by the user on this table&lt;br /&gt;
pg_stat_get_last_autoanalyze_time(oid) timestamptz Time of the last analyze initiated by the autovacuum daemon on this table&lt;/p&gt;
&lt;p&gt;This is controlled by configuration parameters that are normally set in postgresql.conf&lt;/p&gt;
&lt;p&gt;The function pg_stat_get_backend_idset provides a convenient way to generate one row for each active server process. For example, to show the PIDs and current queries of all server processes:&lt;/p&gt;
&lt;p&gt;SELECT pg_stat_get_backend_pid(s.backendid) AS procpid,&lt;br /&gt;
pg_stat_get_backend_activity(s.backendid) AS current_query&lt;br /&gt;
FROM (SELECT pg_stat_get_backend_idset() AS backendid) AS s;&lt;/p&gt;
&lt;p&gt;Visualizar os processos do portgresql num UNIX:&lt;/p&gt;
&lt;p&gt;ps auxww | grep ^postgres&lt;/p&gt;
&lt;p&gt;Formato de retorno:&lt;br /&gt;
postgres: user database host activity&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;12) Corrigindo Estouro do Máximo de transações (2 bilhões)&lt;/strong&gt;&lt;br /&gt;
Constatando:&lt;/p&gt;
&lt;p&gt;SELECT datname, age(datfrozenxid) FROM pg_database;&lt;/p&gt;
&lt;p&gt;age acusa mais de 2 bilhões&lt;/p&gt;
&lt;p&gt;Tarcizio Meurer&lt;/p&gt;
&lt;p&gt;- Execute um dumpall na base&lt;br /&gt;
- drop a base e o agrupamento de dados&lt;br /&gt;
- recrie o agrupamento&lt;br /&gt;
- recrie a base&lt;br /&gt;
- carrege os dados novemente.&lt;br /&gt;
&lt;strong&gt;13) Total de Registros de Todos os Bancos do SGBD (PHP):&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;?php&lt;/p&gt;
&lt;p&gt;$conexao=pg_connect(&amp;#8220;host=127.0.0.1 user=postgres password=postabir&amp;#8221;);&lt;/p&gt;
&lt;p&gt;$sql=&amp;#8221;SELECT datname AS banco FROM pg_database ORDER BY datname&amp;#8221;;&lt;br /&gt;
$consulta=pg_query($conexao,$sql);&lt;/p&gt;
&lt;p&gt;$banco = array();&lt;br /&gt;
$c=0;&lt;br /&gt;
while ($data = @pg_fetch_object($consulta,$c)) {&lt;br /&gt;
$cons=$data-&amp;gt;banco;&lt;/p&gt;
&lt;p&gt;$banco[] .= $cons;&lt;br /&gt;
$c++;&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;$sql2=&amp;#8221;SELECT n.nspname as esquema,c.relname as tabela FROM pg_namespace n, pg_class c&lt;br /&gt;
WHERE n.oid = c.relnamespace&lt;br /&gt;
and c.relkind = &amp;#8216;r&amp;#8217; &amp;#8212; no indices&lt;br /&gt;
and n.nspname not like &amp;#8216;pg\\_%&amp;#8217; &amp;#8212; no catalogs&lt;br /&gt;
and n.nspname != &amp;#8216;information_schema&amp;#8217; &amp;#8212; no information_schema&lt;br /&gt;
ORDER BY nspname, relname&amp;#8221;;&lt;/p&gt;
&lt;p&gt;for ($x=0; $x &amp;lt; count($banco);$x++){&lt;br /&gt;
if ($banco[$x] !=&amp;#8221;template0&amp;#8243; &amp;amp;&amp;amp; $banco[$x] != &amp;#8220;template1&amp;#8243; &amp;amp;&amp;amp; $banco[$x] !=&amp;#8221;postgres&amp;#8221;){&lt;br /&gt;
$conexao2=pg_connect(&amp;#8220;host=127.0.0.1 dbname=$banco[$x] user=postgres password=postabir&amp;#8221;);&lt;br /&gt;
$consulta2=pg_query( $conexao2, $sql2 );&lt;/p&gt;
&lt;p&gt;while ($data = pg_fetch_object($consulta2)) {&lt;br /&gt;
$esquematab=$data-&amp;gt;esquema.&amp;#8217;.&amp;#8217;.$data-&amp;gt;tabela;&lt;br /&gt;
$sql3=&amp;#8221;SELECT count(*) FROM $esquematab&amp;#8221;;&lt;br /&gt;
$consulta3=pg_query($conexao2,$sql3);&lt;br /&gt;
$res=@pg_fetch_array($consulta3);&lt;/p&gt;
&lt;p&gt;print &amp;#8216;Banco.Esquema.Tabela -&amp;gt; &amp;#8216;.$banco[$x].&amp;#8217;.&amp;#8217;.$data-&amp;gt;esquema.&amp;#8217;.&amp;#8217;.$data-&amp;gt;tabela.&amp;#8217; &amp;#8211; Registro(s) &amp;#8211; &amp;#8216;.$res[0].&amp;#8221;;&lt;br /&gt;
$total += $res[0];&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;}&lt;br /&gt;
}&lt;br /&gt;
print &amp;#8220;Total de Registro de todas as tabelas de todos os bancos &amp;#8220;. $total;&lt;/p&gt;
&lt;p&gt;?&amp;gt;&lt;br /&gt;
&lt;strong&gt;14) Uso da Constraint check&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;CREATE TABLE testes(&lt;br /&gt;
codigo serial primary key,&lt;br /&gt;
idade integer,&lt;br /&gt;
check (idade &amp;gt; 18 AND idade &amp;lt; 70)&lt;br /&gt;
)&lt;/p&gt;
&lt;p&gt;Alternativas:&lt;/p&gt;
&lt;p&gt;check (preco &amp;gt; desconto)&lt;/p&gt;
&lt;p&gt;check (desconto &amp;gt; 0 AND preco &amp;gt; desconto)&lt;/p&gt;
&lt;p&gt;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;-&lt;br /&gt;
Somente aceitar c ou e (simulando campo tipo enum do MySQL):&lt;br /&gt;
tipo char(1) check (tipo =&amp;#8217;c&amp;#8217; OR tipo=&amp;#8217;e')&lt;/p&gt;
&lt;p&gt;Para este cria-se uma combo com values &amp;#8216;c&amp;#8217; e &amp;#8216;e&amp;#8217;.&lt;br /&gt;
&lt;strong&gt;15) Manutenção do PostgreSQL:&lt;/strong&gt;&lt;br /&gt;
No CRON:&lt;/p&gt;
&lt;p&gt;/home/pgsql/bin/psql -c &amp;#8220;vacuum full analyse&amp;#8221; -d dadosadv -U postgres&lt;/p&gt;
&lt;p&gt;Consultas no Pronpt do SO:&lt;br /&gt;
psql -U postgres -d banco -c &amp;#8220;SELECT * FROM clientes&amp;#8221;&lt;/p&gt;
&lt;p&gt;Manutenção em Tabela&lt;br /&gt;
vacuum analize tabela;&lt;/p&gt;
&lt;p&gt;Reindexar Banco, tabela ou índice&lt;br /&gt;
reindex database banco;&lt;/p&gt;
&lt;p&gt;Exibir plano de consulta&lt;br /&gt;
explain select * from tabela;&lt;/p&gt;
&lt;p&gt;Exibir todos os parâmetros de runtime&lt;br /&gt;
show all;&lt;br /&gt;
&lt;strong&gt;16) Consulta com Dias Úteis&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Só para constar aqui vai uma expressão SQL que fornece os&lt;br /&gt;
dias úteis de um período. Considerei que existe uma tabela&lt;br /&gt;
com o registro dos feriados e outros dias que não devem ser&lt;br /&gt;
considerados (emendas, pontos facultativos, etc):&lt;/p&gt;
&lt;p&gt;SELECT dia FROM&lt;br /&gt;
(SELECT (&amp;#8217;2007-10-01&amp;#8242;::date+s.a*&amp;#8217;1 day&amp;#8217;::interval) AS dia&lt;br /&gt;
FROM generate_series(0, &amp;#8217;2007-10-31&amp;#8242;::date -&lt;br /&gt;
&amp;#8217;2007-10-01&amp;#8242;::date, 1) AS s(a)) foo&lt;br /&gt;
WHERE EXTRACT(DOW FROM dia) BETWEEN 1 AND 5&lt;br /&gt;
EXCEPT&lt;br /&gt;
SELECT dia FROM tab_feriado;&lt;/p&gt;
&lt;p&gt;Osvaldo (na lista postgresql-br)&lt;br /&gt;
&lt;strong&gt;17) Update em uma chave primária sem causar duplicação de chave&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;UPDATE teste SET coluna1 = t_aux.coluna1+1&lt;br /&gt;
FROM (&lt;br /&gt;
SELECT coluna1&lt;br /&gt;
FROM teste&lt;br /&gt;
ORDER BY coluna1 DESC&lt;br /&gt;
) t_aux&lt;br /&gt;
WHERE teste.coluna1 = t_aux.coluna1;&lt;/p&gt;
&lt;p&gt;Osvaldo (na lista postgresql-br)&lt;br /&gt;
&lt;strong&gt;18) Como saber se existe uma transação ativa&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;select pg_stat_activity;&lt;/p&gt;
&lt;p&gt;Dica do João Paulo.&lt;br /&gt;
&lt;strong&gt;19)Inserir data como valor default:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pode usar também o current_date ou o localtimestamp.&lt;/p&gt;
&lt;p&gt;insert into tabela(data) values ((select current_date));&lt;/p&gt;
&lt;p&gt;ou&lt;/p&gt;
&lt;p&gt;insert into tabela(data) values ((select localtimestampo));&lt;br /&gt;
&lt;strong&gt;20) Ler último saldo de tabela&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Tenho o seguinte conteudo numa tabela de contas:&lt;/p&gt;
&lt;p&gt;Lancto&amp;#8211;CCorrente&amp;#8211;Banco&amp;#8211;OP&amp;#8211;DataLan&amp;#8212;&amp;#8212;-Valor&amp;#8212;&amp;#8212;&amp;#8212;Saldo&amp;#8211;&lt;br /&gt;
1 12345-6 002 C 19/11/2007 1000.00 1000.00&lt;br /&gt;
2 12345-6 002 C 19/11/2007 2000.00 3000.00&lt;br /&gt;
3 12345-6 002 D 19/11/2007 100.00 2900.00&lt;br /&gt;
4 23450-6 001 C 19/11/2007 2000.00 3000.00&lt;br /&gt;
5 23450-6 001 D 19/11/2007 100.00 2900.00&lt;/p&gt;
&lt;p&gt;Preciso retornar sempre o último SALDO registrado.&lt;br /&gt;
Como nunca vou saber a data exata da periodo de consulta.&lt;/p&gt;
&lt;p&gt;Estou executando:&lt;/p&gt;
&lt;p&gt;SELECT saldoatual FROM lanban WHERE contacorrente = &amp;#8217;12345-6&amp;#8242; and datalan &amp;lt;= &amp;#8217;2007/12/01&amp;#8242; ORDER BY datalan DESC LIMIT 1&lt;/p&gt;
&lt;p&gt;Retona o Saldo: 1000.00, preciso pegar o ultimo saldo da conta 12345-6: que é 2900.00.&lt;/p&gt;
&lt;p&gt;Isso porque tabelas são conjuntos de dados. O padrão SQL *não* garante a&lt;br /&gt;
ordem dos dados. Mesmo se ele garantisse, um simples UPDATE podia mudar&lt;br /&gt;
o ordem dos dados e o seu SELECT não retornaria o valor desejado.&lt;/p&gt;
&lt;p&gt;&amp;gt; Alguem tem alguma dica?&lt;br /&gt;
&amp;gt;&lt;br /&gt;
O campo &amp;#8216;Lancto&amp;#8217; é do tipo serial? Se for poderias utilizar:&lt;br /&gt;
SELECT saldoatual FROM lanban WHERE contacorrente = &amp;#8217;12345-6&amp;#8242; ORDER BY&lt;br /&gt;
&amp;#8220;Lancto&amp;#8221; DESC LIMIT 1.&lt;/p&gt;
&lt;p&gt;Dica do Euler Taveira de Oliveira&lt;br /&gt;
&lt;strong&gt;21) Formato de moeda&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;O correto seria:&lt;br /&gt;
to_char(1030.52,&amp;#8217;9G999D99&amp;#8242;)&lt;br /&gt;
mas o resultado é: 1,030,52&lt;br /&gt;
como você pode observar existe um problema no&lt;br /&gt;
separador de milhar (indicado pelo G) que é&lt;br /&gt;
considerado como , e não como . que seria o esperado.&lt;/p&gt;
&lt;p&gt;Uma maneira de contornar (não muito elegante) é:&lt;br /&gt;
to_char(1030.52,&amp;#8217;9&amp;#8243;.&amp;#8221;999D99&amp;#8242;)&lt;/p&gt;
&lt;p&gt;Corrigido na versão 8.3&lt;br /&gt;
&lt;strong&gt;22) Saber o Tamanho de Tabela e de Índices&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;pg_relation_size()&lt;br /&gt;
pg_total_relation_size()&lt;/p&gt;
&lt;p&gt;-Leo&lt;br /&gt;
&amp;#8211;&lt;br /&gt;
Leonardo Cezar&lt;br /&gt;
&lt;strong&gt;23) Último Saldo&lt;/strong&gt;&lt;br /&gt;
Fernando Brombatti&lt;/p&gt;
&lt;p&gt;A situação é a seguinte. Não se sabe se o serial citado (por N razões) vai ser o último valor existente. Nada me garante que estes dados não sofreram algum UPDATE. Sendo assim, recomendo:&lt;br /&gt;
1) alterar o campo DATE para TIMESTAMP&lt;br /&gt;
2) alterar o query:&lt;br /&gt;
SELECT lan.saldoatual&lt;br /&gt;
FROM lanban lan&lt;br /&gt;
WHERE lan.contacorrente = &amp;#8217;12345-6&amp;#8242; AND lan.datalan = (SELECT MAX(maxlan.datalan)&lt;br /&gt;
FROM lanban maxlan&lt;br /&gt;
WHERE maxlan.contacorrente = lan.contacorrente)&lt;br /&gt;
Isso faz com que no primeiro SQL eu traga os lancamentos da conta e no segundo eu trago a máxima data de lançamento para a mesma conta. Como as contas são iguais, trago a máxima data da conta atual, logo tenho o saldo atual.&lt;br /&gt;
É confuso, mas é o mais seguro (podem haver UPDATES neste caso também, mas aí não se depende de um serial).&lt;br /&gt;
Para este query funcionar bem necessita mais um índice em datalan ao menos.&lt;br /&gt;
Nos nossos sistemas da prefeitura nunca usamos saldos desta forma, pois aí se é removido algum registro a informação não fica correta.&lt;/p&gt;
&lt;p&gt;Espero não ter confundido tanto.&lt;br /&gt;
&lt;strong&gt;24) Encontrando tanela de sistema&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Para localizar informações desse tipo existe o information_schema&lt;br /&gt;
(conforme citado pelo Leandro). Utilizando o catalogo poupa voce de&lt;br /&gt;
futuras dores de cabeça quando por exemplo houver alguma alteração&lt;br /&gt;
estrutural em tabelas do sistema em versõs futuras. As views do&lt;br /&gt;
catalogo deverão permanecer com o máximo de compatibilidade entre&lt;br /&gt;
versões (segundo padrão SQL).&lt;/p&gt;
&lt;p&gt;Além de ser mais simples:&lt;/p&gt;
&lt;p&gt;SELECT *&lt;br /&gt;
FROM information_schema.tables&lt;br /&gt;
WHERE table_name = &amp;#8216;foobar&amp;#8217;;&lt;/p&gt;
&lt;p&gt;Infelizmente não possuimos referencias a outros banco de dados&lt;br /&gt;
(banco.schema.tabela), portanto o comando deverá ser executado em&lt;br /&gt;
todos seus bancos para localizar a tabela ou um programeta bash&lt;br /&gt;
parecido com isso:&lt;/p&gt;
&lt;p&gt;$ ARG=$1 || &amp;#8220;foo&amp;#8221; &amp;amp;&amp;amp; for DATABASE in `psql -U postgres -c &amp;#8220;\l&amp;#8221; \&lt;br /&gt;
| cut -d&amp;#8221;|&amp;#8221; -f1 | egrep &amp;#8216;^(\ [a-z])&amp;#8217;`&lt;br /&gt;
do&lt;br /&gt;
psql -U postgres -d $DATABASE -Atc \&lt;br /&gt;
&amp;#8220;SELECT &amp;#8216;O banco de dados $DATABASE possui a tabela: $RG&amp;#8217;&lt;br /&gt;
FROM information_schema.tables&lt;br /&gt;
WHERE table_name = &amp;#8216;$ARG&amp;#8217;&amp;#8221;;&lt;br /&gt;
done;&lt;/p&gt;
&lt;p&gt;Abraço!&lt;/p&gt;
&lt;p&gt;-Leo&lt;br /&gt;
&lt;strong&gt;25) Como Localizar e Deletar registros duplicados &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1.Select para localizar duplicados&lt;br /&gt;
select campo,campo1,count(*)&lt;br /&gt;
from tabela group by campo,campo1 having count(*) &amp;gt; 1&lt;/p&gt;
&lt;p&gt;2.Deletar duplicados:&lt;br /&gt;
delete from tab p1&lt;br /&gt;
where rowid &amp;lt; (select max(rowid)&lt;br /&gt;
from tab1 p2&lt;br /&gt;
where p1.primary_key = p2.primary_key);&lt;br /&gt;
&lt;strong&gt;26) Inserir registros em uma específica posição&lt;/strong&gt;&lt;br /&gt;
&amp;gt; Hi, how are you? maybe you know how SQL insert data&lt;br /&gt;
&amp;gt; bellow or above in database tabe? example insert&lt;br /&gt;
&amp;gt; data from position table 5 thanks&lt;br /&gt;
&amp;gt;&lt;/p&gt;
&lt;p&gt;No, I don&amp;#8217;t known.&lt;br /&gt;
But if you make a copy from table,&lt;br /&gt;
create a new table with same structure,&lt;br /&gt;
insert a new register,&lt;br /&gt;
import register from old table, then first register&lt;br /&gt;
are this last register inserted.&lt;br /&gt;
&lt;strong&gt;27) Timezones do PostgreSQL (lista pgbr-geral)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;No POSTGRESQL.CONF tem o timezone onde você pode colocar algo do tipo:&lt;/p&gt;
&lt;p&gt;TIMEZONE=BRAZIL/EAST esta é minha configuração, ou seja, de minha região.&lt;/p&gt;
&lt;p&gt;Analise.&lt;br /&gt;
Wandrey&lt;/p&gt;
&lt;p&gt;Outra &amp;#8212;&amp;#8212;&amp;#8212;&amp;#8211;&lt;br /&gt;
Na maioria dos casos é criado um link do diretório de timezones do&lt;br /&gt;
S.O. (/usr/share/zoneinfo//usr/share/zoneinfo/) para o diretório de&lt;br /&gt;
Timezones do Postgres ($PGDIR/share/timezone )Que possui seu próprio&lt;br /&gt;
sistema de controle de timezone, se não me engano a partir d versão &lt;img src=&quot;http://s0.wp.com/wp-includes/images/smilies/icon_cool.gif&quot; alt=&quot;8)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;&amp;#8211;&lt;br /&gt;
Att:&lt;br /&gt;
Thiago Risso&lt;br /&gt;
&lt;strong&gt;28) Inserir Número Aleatório em Tabela&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;CREATE TABLE page (&lt;br /&gt;
id SERIAL PRIMARY KEY,&lt;br /&gt;
about TEXT NULL,&lt;br /&gt;
);&lt;/p&gt;
&lt;p&gt;ALTER TABLE page ADD myrand NUMERIC NOT NULL DEFAULT RANDOM();&lt;/p&gt;
&lt;p&gt;UPDATE page SET myrand = DEFAULT;&lt;/p&gt;
&lt;p&gt;SELECT id FROM page WHERE myrand &amp;gt;= RANDOM() ORDER BY myrand LIMIT 1;&lt;/p&gt;
&lt;p&gt;This approach has some problems:&lt;/p&gt;
&lt;p&gt;* If the number you pick is greater than the largest number in the myrand column, you will not find any matching rows.&lt;br /&gt;
* The gaps between the random values in the myrand column are not uniform, and thus the rows selected are not random. Imagine a table with two rows and myrand values of 0.8 and 0.9. If the random number compared to myrand is .8 or less, the first row is chosen. But the second row is only chosen if the value picked is between .8 and .9&lt;br /&gt;
* If more than one row has the exact same number, it is likely that one of them will never get picked.&lt;/p&gt;
&lt;p&gt;Mais detalhes em: &lt;a href=&quot;http://people.planetpostgresql.org/greg/index.php?/archives/118-guid.html&quot;&gt;http://people.planetpostgresql.org/greg/index.php?/archives/118-guid.htm&amp;#8230;&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;29) Desabilitar Triggers&lt;/strong&gt;&lt;br /&gt;
Vinicius Santos &amp;#8211; MSI escreveu:&lt;br /&gt;
Thiago Boufleuhr escreveu:&lt;/p&gt;
&lt;p&gt;Como faço para desabilitar as triggers em uma sessão no PLSQL ?&lt;/p&gt;
&lt;p&gt;Thiago Boufleuhr&lt;/p&gt;
&lt;p&gt;ALTER TABLE [NOME DA TABELA]&lt;br /&gt;
DISABLE TRIGGER [NOME DA TRIGGER]&lt;br /&gt;
Ou&lt;br /&gt;
ALTER TABLE [NOME DA TABELA]&lt;br /&gt;
DISABLE TRIGGER ALL&lt;/p&gt;
&lt;p&gt;ALERTA:&lt;br /&gt;
William Leite Araújo: MUITO CUIDADO AO USAR &amp;#8220;DISABLE TRIGGER ALL&amp;#8221;&lt;/p&gt;
&lt;p&gt;As constraints de chave estrangeira são controladas via TRIGGER. Caso desabilite todos os gatilhos, a checagem da integridade referencial (chaves estrangeiras) serão desabilitadas!&lt;br /&gt;
&lt;strong&gt;30) Codificação de Caracteres&lt;/strong&gt;&lt;br /&gt;
Euler Taveira de Oliveira&lt;br /&gt;
&amp;gt;Evandro Ricardo Silvestre wrote: Codificação de caracteres do cliente e&lt;br /&gt;
do servidor podem ser diferentes. Se a codificação do cliente é diferente da codificação do servidor, o servidor PostgreSQL tenta fazer uma conversão antes de armazenar/retornar os dados. Um problema que existia é que a aplicação cliente (no caso abaixo o psql) não avisava se a codificação informada ao servidor (client_encoding) era a mesma do ambiente (terminal).&lt;br /&gt;
Bem vindo ao psql 8.3.0, o terminal iterativo do PostgreSQL.&lt;br /&gt;
Digite: \copyright para mostrar termos de distribuição&lt;br /&gt;
\h para ajuda com comandos SQL&lt;br /&gt;
\? para ajuda com comandos do psql&lt;br /&gt;
\g ou terminar com ponto-e-vírgula para executar a consulta&lt;br /&gt;
\q para sair&lt;br /&gt;
template1=# show client_encoding;&lt;br /&gt;
client_encoding&lt;br /&gt;
&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8211;&lt;br /&gt;
LATIN1&lt;br /&gt;
(1 registro)&lt;br /&gt;
template1=# show server_encoding;&lt;br /&gt;
server_encoding&lt;br /&gt;
&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8211;&lt;br /&gt;
LATIN1&lt;br /&gt;
(1 registro)&lt;br /&gt;
template1=# select upper(&amp;#8216;áéíóú&amp;#8217;);&lt;br /&gt;
upper&lt;br /&gt;
&amp;#8212;&amp;#8212;-&lt;br /&gt;
ÁÉÍÓÚ&lt;br /&gt;
(1 registro)&lt;br /&gt;
template1=# set client_encoding to &amp;#8216;utf-8&amp;#8242;;&lt;br /&gt;
SET&lt;/p&gt;
&lt;p&gt;template1=# show client_encoding;&lt;br /&gt;
client_encoding&lt;br /&gt;
&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8211;&lt;br /&gt;
utf-8&lt;br /&gt;
(1 registro)&lt;br /&gt;
template1=# select upper(&amp;#8216;áéíóú&amp;#8217;);&lt;br /&gt;
ERRO: sequência de bytes é inválida para codificação &amp;#8220;UTF8&amp;#8243;: 0xe1e9ed&lt;br /&gt;
DICA: Este erro pode acontecer também se a sequência de bytes nãocorresponde a codificação esperado pelo servidor, que é controlada por &amp;#8220;client_encoding&amp;#8221;.&lt;br /&gt;
ERRO: sequÃªncia de bytes Ã© invÃ¡lida para codificaÃ§Ã£o &amp;#8220;UTF8&amp;#8243;: 0xe1e9ed&lt;br /&gt;
DICA: Este erro pode acontecer tambÃ©m se a sequÃªncia de bytes nÃ£o corresponde a codificaÃ§Ã£o esperado pelo servidor, que Ã© controlada por &amp;#8220;client_encoding&amp;#8221;.&lt;br /&gt;
[trocando a codificação de caracteres do terminal e digitando novamente]&lt;br /&gt;
template1=# select upper(&amp;#8216;áéí&amp;#8217;);&lt;br /&gt;
upper&lt;br /&gt;
&amp;#8212;&amp;#8212;-&lt;br /&gt;
ÁÉÍ&lt;br /&gt;
(1 registro)&lt;br /&gt;
&lt;strong&gt;31) Como visualizar as consultas correntes no Postgres&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Colaboração: Frederico Palma&lt;/p&gt;
&lt;p&gt;Data de Publicação: 16 de fevereiro de 2008&lt;/p&gt;
&lt;p&gt;É necessário habilitar o stats_command_string no postgresql.conf:&lt;/p&gt;
&lt;p&gt;stats_command_string = true&lt;/p&gt;
&lt;p&gt;Essa configuração pode ser alterada em um banco que está ativo sem a necessidade de reiniciá-lo e sem afetar as conexões abertas para recarregar as configurações. Envie um SIGHUP ou use o comando:&lt;/p&gt;
&lt;p&gt;pg_ctl reload&lt;/p&gt;
&lt;p&gt;Quando stats_command_string está ativo a tabela pg_stat_activity armazena todas consultas correntes.&lt;/p&gt;
&lt;p&gt;Realizando a consulta:&lt;/p&gt;
&lt;p&gt;SELECT datname,procpid,current_query FROM pg_stat_activity&lt;/p&gt;
&lt;p&gt;Teremos a lista dos bancos de dados utilizados com seus respectivos processos (PID) referente às consultas.&lt;/p&gt;
&lt;p&gt;SELECT datname,procpid,current_query FROM pg_stat_activity ORDER BY procpid;&lt;/p&gt;
&lt;p&gt;datname | procpid | current_query&lt;br /&gt;
&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;+&amp;#8212;&amp;#8212;&amp;#8212;+&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8211;&lt;br /&gt;
mydatabase1 | 2587 | &amp;lt; IDLE&amp;gt;&lt;br /&gt;
mydatabase2 | 15726 | SELECT * FROM users WHERE id=123 ;&lt;br /&gt;
mydatabase3 | 15851 | &amp;lt; IDLE&amp;gt;&lt;/p&gt;
&lt;p&gt;Publicado originalmente na Dicas-L &amp;#8211; &lt;a href=&quot;http://www.dicas-l.com.br/dicas-l/20080216.php&quot;&gt;http://www.dicas-l.com.br/dicas-l/20080216.php&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;32)&lt;/p&gt;
&lt;br /&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/categories/ribafs.wordpress.com/4/&quot; /&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/tags/ribafs.wordpress.com/4/&quot; /&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/ribafs.wordpress.com/4/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/ribafs.wordpress.com/4/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/ribafs.wordpress.com/4/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/ribafs.wordpress.com/4/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gofacebook/ribafs.wordpress.com/4/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/ribafs.wordpress.com/4/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gotwitter/ribafs.wordpress.com/4/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/ribafs.wordpress.com/4/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/ribafs.wordpress.com/4/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/ribafs.wordpress.com/4/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/ribafs.wordpress.com/4/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/ribafs.wordpress.com/4/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/ribafs.wordpress.com/4/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/ribafs.wordpress.com/4/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=ribafs.wordpress.com&amp;amp;blog=630184&amp;amp;post=4&amp;amp;subd=ribafs&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</content:encoded>
	<dc:date>2011-08-28T23:52:07+00:00</dc:date>
	<dc:creator>ribafs</dc:creator>
</item>
<item rdf:about="http://www.midstorm.org/~telles/?p=791">
	<title>Fabio Telles: PGDay RS no dia 19 de agosto de 2011</title>
	<link>http://www.midstorm.org/~telles/2011/08/15/pgday-rs-no-dia-19-de-agosto-de-2011/</link>
	<content:encoded>&lt;p&gt;O pessoal de RS se mexeu e mais um PGDay RS estará ocorrendo este ano. Será no dia 19 de agosto (sexta-feira) em Porto Alegre.&lt;/p&gt;
&lt;p&gt;Os palestrantes, a programação e o local estão todos publicados no site do evento. Infelizmente não vou poder estar lá, mas já vi que a grade de palestrantes é excelente e será um evento bem bacana, incluindo um Dojo PL/pgSQL e os já conhecidos Lightning Talks.&lt;/p&gt;
&lt;p&gt;Gostaria aqui de parabenizar os palestrantes Dickson Guedes, Diego Rossi, Diogo Biazus, Eduardo Wolak e Fabiano Machado Dias por palestrarem no evento e em especial para o Fabrízio de Royes Mello que é a pessoa que está liderando a organização do evento.&lt;/p&gt;
&lt;p&gt;Não esqueçam de mandarem as fotos, publicarem as palestas, ok?&lt;/p&gt;</content:encoded>
	<dc:date>2011-08-15T11:26:35+00:00</dc:date>
</item>
<item rdf:about="http://www.midstorm.org/~telles/?p=784">
	<title>Fabio Telles: PGBR2011 – Chamada de trabalhos</title>
	<link>http://www.midstorm.org/~telles/2011/08/14/pgbr2011-chamada-de-trabalhos/</link>
	<content:encoded>&lt;h2&gt;Nesta semana foi aberta a &lt;a href=&quot;http://pgbr.postgresql.org.br/2011/chamada.php&quot;&gt;Chamada de Trabalhos&lt;/a&gt; do &lt;a href=&quot;http://pgbr.postgresql.org.br/&quot;&gt;PGBR2011&lt;/a&gt;.&lt;/h2&gt;
&lt;p&gt;A chamada ficará aberta até o dia 09/09/2011 então não bobeie e mande logo as suas propostas. Este ano serão 4 modalidades diferentes (fora os Lightning Talks): Palestras normais de 50 minutos, tutoriais de 2 horas, hacker talks que podem der de 30 minutos até 2 horas e os painéis acadêmicos que serão expostos no saguão do evento. Tudo explicado no site do evento. Você pode mandar até 5 propostas diferentes para a banca avaliadora (da qual eu não faço parte) escolher.&lt;/p&gt;
&lt;p&gt;Eu já estou preparando as minhas propostas, mas segue algumas que eu gostaria de ver lá. Eu sei que tem muita gente que já usa PostgreSQL há um tempão e acha que não teria nada de interessante para falar. Não se intimide, tenho certeza que se você usa o PostgreSQL há mais de um ano, deve se sentir à vontade para falar algum assunto como:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h4&gt;&lt;em&gt;Postgressssss&lt;/em&gt;, lendas urbanas sobre PostgreSQL e um apanhado da sua evolução nas últimas versões;&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;Casos de sucesso de quem não tem vergonha de revelar que usa o PostgreSQL em negócios críticos;&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;Porquê o PostgreSQL é cada vez mais amante predileta dos DBAs experientes;&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;&amp;#8220;&lt;a href=&quot;http://agajorte.blogspot.com/2009/03/meu-postgresql-nao-conecta.html&quot;&gt;Meu PostgreSQL não Conecta&lt;/a&gt;&amp;#8221; e outras coisas que alguém tem de escrever para a gente não repetir novamente na lista&amp;#8230;&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;Ops, minha base já tem mais de 1TB&amp;#8230; ;&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;BI, Data Mining, OLAP, PL/R e outros bichos;&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;&lt;a href=&quot;http://www.postgresql.org/docs/9.1/static/textsearch.html&quot;&gt;Full Text Search&lt;/a&gt;, particularmente como raios se montam Ranks e dicionários personalizados;&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;Funções de agregação personalizadas, operadores personalizados, tipos de dados personalizados e o que mais você tiver coragem de inventar;&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;Bancos de dados em pesquisas científicas, como em biologia, física e outras ciências ocultas;&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;Haks, muitos hacks! Queremos hacks em C, em Perl, Python, SPI, PL/pgSQL etc. Queremos nerds genuínos!!!&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;Vou te apresentar a uma tal de libpq&amp;#8230;&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;Tuning em bases OLTP  com fucking hight concorrência;&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;ETL (Extract Transform Load) em ambientes alucinógenos;&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;pgbench e outras técnicas para emular a carga da aplicação em ambiente de homologação ou &amp;#8220;hum&amp;#8230;. então dá para fazer isso antes de sentar a aplicação no cliente?&amp;#8221;&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;Versionamento de DDL e como controlar do demônio da tasmânia das alterações de estrutura em desenvolvimento e produção sem ir parar no hospital;&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;Segurem os trolls, vamos falar sobre sistemas de arquivos, tablespaces e discos de novo&amp;#8230;.&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;Como fazer poesia com SQL e parar de fazer caquinha com PL/você_não_precisa_usar_isto_aqui.&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;Técnicas (ok, se você gosta de buzzwords, pode chamar de &amp;#8220;design patterns&amp;#8221;) de otimização de processos e ajuste de SQL;&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;&amp;#8220;Rodei o &lt;a href=&quot;http://www.postgresql.org/docs/9.1/static/sql-explain.html&quot;&gt;EXPLAIN&lt;/a&gt;, e agora?&amp;#8221;;&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;Magia negra com &lt;a href=&quot;http://www.postgresql.org/docs/9.1/static/queries-table-expressions.html#QUERIES-WINDOW&quot;&gt;Window Function&lt;/a&gt;;&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;&lt;a href=&quot;http://www.postgresql.org/docs/9.1/static/queries-with.html&quot;&gt;CTE&lt;/a&gt;, recursividade e como não destruir a memória do seu servidor;&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;&lt;a href=&quot;http://www.postgresql.org/docs/9.1/static/charset.html&quot;&gt;Localização, codificação de caracteres&lt;/a&gt; e coisas que infelizmente você tem de aprender se não quiser sofrer por toda a eternamente com isso;&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;Segurança para preguiçosos (ou seja, para todo mundo);&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;Técnicas de monitoramento, administração que funcionam e fazem sentido para seres mortais;&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;Armadilhas no&lt;a href=&quot;http://www.postgresql.org/docs/9.1/static/different-replication-solutions.html&quot;&gt; zoológico das replicações&lt;/a&gt;;&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;Muito além das configurações do &lt;a href=&quot;http://www.postgresql.org/docs/9.1/static/runtime-config.html&quot;&gt;postgresql.conf&lt;/a&gt;: personalizando bases, roles , tabelas, tablespaces e até sessões para um ajuste perfeito;&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;Eu sei, eu sei&amp;#8230;. &lt;a href=&quot;http://pt.wikipedia.org/wiki/ACID&quot;&gt;ACID&lt;/a&gt;, blá, blá, blá, &lt;a href=&quot;http://en.wikipedia.org/wiki/Relational_model&quot;&gt;Teoria Relacional&lt;/a&gt;, etc e tal, mas o &lt;a href=&quot;http://en.wikipedia.org/wiki/Christopher_J._Date&quot;&gt;C. J. Date&lt;/a&gt; diz que bi, bi, bi, bó, bó, bó&amp;#8230;. mas eu quero muito ver &amp;#8220;Técnicas de &lt;a href=&quot;http://pt.wikipedia.org/wiki/NoSQL&quot;&gt;NoSQL&lt;/a&gt; integradas com PosgreSQL&amp;#8221;;&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;&lt;a href=&quot;http://www.postgresql.org/docs/9.1/static/backup.html&quot;&gt;Backup&lt;/a&gt; e o &amp;#8220;complexo de Chuck Norris&amp;#8221;. (Quem respondeu a &lt;a href=&quot;http://www.postgresql.org.br/node/7460&quot;&gt;pesquisa sobre uso de PostgreSQL&lt;/a&gt; sabe do que eu estou falando);&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;Técnicas de recuperação de desastres e como é chato ouvir &amp;#8220;mas eu já faço assim há 5 anos e nunca deu nenhum problema&amp;#8230;&amp;#8221;;&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;Não entendeu? Vou falar de novo: RECOVER, RECOVER, RECOVER!&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;Quer dizer então que para ter um banco de dados é preciso ter um DBA na equipe ou aprender como fazer o trabalho de um?&lt;/h4&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;OBS: Quem sabe este ano o indefectível Osvaldo Kussama não manda uma proposta?&lt;/p&gt;
&lt;p&gt;OBS2: Se tiver alguma outra sugestão de palestra que você gostaria de ver no PGBR201, não deixe de deixar um comentário aqui! Vai que alguém gosta da ideia e você acaba tendo uma aula sobre aquele tema que vem lhe assombrando há tempos&amp;#8230;&lt;/p&gt;</content:encoded>
	<dc:date>2011-08-14T03:21:53+00:00</dc:date>
</item>
<item rdf:about="tag:blogger.com,1999:blog-3371915898459901668.post-8492480916716847889">
	<title>Claudio Bezerra Leopoldino: A Função clock_timestamp()</title>
	<link>http://postgresqlbr.blogspot.com/2011/07/funcao-clocktimestamp.html</link>
	<content:encoded>Você já ouviu da função clock_timestamp? Ela retorna a data e hora com bastante precisão junto com a time zone do servidor, da mesma forma que as funções now() e current_timestamp. Então para quê implementar esta nova função? O interessante da clock_timestamp é que a mesma retorna o timestamp do término da transação, enquanto now e current timestamp retornam a data/hora do início da transação corrente.&lt;br /&gt;&lt;br /&gt;É uma função que pode ser importante para aqueles que necessitam de alta precisão ao lidar com variáveis temporais.&lt;br /&gt;&lt;br /&gt;Exemplos:&lt;br /&gt;&lt;br /&gt;1 - Sintaxe básica&lt;br /&gt;&lt;br /&gt;&lt;b&gt;teste=# SELECT clock_timestamp();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; clock_timestamp&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;-------------------------------&lt;br /&gt;&amp;nbsp;2011-07-21 09:34:12.645251-03&lt;br /&gt;(1 registro)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;2 - Extração de parte do valor retornado.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;teste=# SELECT SUBSTRING(CAST(now() AS VARCHAR) FROM 1 FOR 10);&lt;br /&gt;&amp;nbsp;substring&amp;nbsp; &lt;br /&gt;------------&lt;br /&gt;&amp;nbsp;2011-07-21&lt;br /&gt;(1 registro)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3 - Lado a lado o resultado de clock_timestamp() e now() na mesma transação. Observe que os valores são diferentes e indicam o timestamp de início e de término da transação.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;teste=# SELECT SUBSTRING(CAST(now() AS VARCHAR) FROM 1 FOR 10);&lt;br /&gt;&amp;nbsp;substring&amp;nbsp; &lt;br /&gt;------------&lt;br /&gt;&amp;nbsp;2011-07-21&lt;br /&gt;(1 registro)&lt;br /&gt;&lt;br /&gt;teste=# SELECT now() || '&amp;nbsp;&amp;nbsp; ' || clock_timestamp();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ?column?&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;---------------------------------------------------------------&lt;br /&gt;&amp;nbsp;2011-07-21 10:21:46.592655-03&amp;nbsp;&amp;nbsp; 2011-07-21 10:21:46.592828-03&lt;br /&gt;(1 registro)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;4 - Diferença entre clock_timestamp() e now(), mostrando o tempo decorrido entre o início e o término da transação.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;teste=# SELECT clock_timestamp() - now();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ?column?&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;-----------------&lt;br /&gt;&amp;nbsp;00:00:00.000099&lt;br /&gt;(1 registro)&lt;/b&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3371915898459901668-8492480916716847889?l=postgresqlbr.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2011-07-21T10:24:11+00:00</dc:date>
	<dc:creator>cbleopoldino</dc:creator>
</item>
<item rdf:about="http://andrecf.kinghost.net/freebsd/?p=222">
	<title>André Fernandes: Pequenas regras de boa modelagem – parte 1</title>
	<link>http://andrecf.kinghost.net/freebsd/2011/07/01/pequenas-regras-de-boa-modelagem-parte-1/</link>
	<content:encoded>Há muita coisa importante a se preocupar durante a modelagem de um banco de dados, contudo achei importante mostrar algumas delas. Sei que algumas pessoas não concordarão de imediato com todas as regras, mas ainda não vi muitos argumentos válidos contra as mesmas. Regra Nº1: evite valores Nulos em campos numéricos quando nulo for equivalente [...]</content:encoded>
	<dc:date>2011-07-01T22:20:09+00:00</dc:date>
</item>
<item rdf:about="tag:blogger.com,1999:blog-3371915898459901668.post-5550266604358404414">
	<title>Claudio Bezerra Leopoldino: Baixe os RPMs de Instalação da versão 9.1 Beta2!</title>
	<link>http://postgresqlbr.blogspot.com/2011/07/baixe-os-rpms-de-instalacao-da-versao.html</link>
	<content:encoded>Os instaladores para linux da versão 9.1 Beta 2 estão disponíveis para quem quiser testar. Esse é mais um indício de que a versão 9.1 logo será oficialmente lançada.&lt;br /&gt;&lt;br /&gt;Baixe os RPMs &lt;a href=&quot;http://www.openscg.com/se/postgresql/packages.jsp&quot;&gt;&lt;b&gt;aqui&lt;/b&gt;&lt;/a&gt; e teste à vontade!&lt;div class=&quot;blogger-post-footer&quot;&gt;Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3371915898459901668-5550266604358404414?l=postgresqlbr.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2011-07-01T07:48:31+00:00</dc:date>
	<dc:creator>cbleopoldino</dc:creator>
</item>
<item rdf:about="tag:blogger.com,1999:blog-3371915898459901668.post-6865408034305358545">
	<title>Claudio Bezerra Leopoldino: JMeter: Brincando de Testar seu Servidor PostgreSQL!</title>
	<link>http://postgresqlbr.blogspot.com/2011/06/jmeter-brincando-de-testar-seu-servidor.html</link>
	<content:encoded>&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-IiT0XelILKE/TgnVtWPpCWI/AAAAAAAAANc/8DhG1dFVmxw/s1600/Apache+JMeter+2+-+Cria%25C3%25A7%25C3%25A3o+de+Usu%25C3%25A1rios.png&quot;&gt;&lt;/a&gt;&lt;/div&gt;Testes de performance de servidores de bancos de dados são importantes para se avaliar ambientes de produção antes da implantação de projetos que envolvam muitos usuários e grande tráfego de informações. Uma ferramenta boa e estável para este tipo de teste é o &lt;a href=&quot;http://jakarta.apache.org/jmeter/&quot;&gt;Jakarta Jmeter&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Através do JMeter é possível configurar conexões ao servidor, criar requisições JDBC (comandos, chamadas de funções, etc.), submetê-las ao servidor e analisar o resultado da execução. A ferramenta permite ainda criar múltiplas &lt;i&gt;threads&lt;/i&gt; simulando um grande número de usuários simultâneos, e executar para cada &lt;i&gt;thread&lt;/i&gt; as requisições mais de uma vez, gerando uma grande carga de acessos que testa os limites de carga aceitos pelos bancos de dados.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Adicionalmente, é possível utilizar ouvintes (listeners) para apresentar os resultados da execução dos comandos na forma de tabelas, árvores e gráficos diversos. &lt;br /&gt;&lt;br /&gt;O JMeter é compatível com qualquer banco que aceite conexão JDBC, incluindo o postgres e pode testar ainda outros tipos de requisição como ftp e http. Baixe o &lt;a href=&quot;http://jakarta.apache.org/jmeter/&quot;&gt;jmeter&lt;/a&gt; agora! &lt;br /&gt;&lt;br /&gt;Vamos mostrar as principais etapas de utilização da ferramenta utilizando um teste feito no postgresql.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. Instalação&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Baixe a ferramenta, descompacte os arquivos em uma pasta. Observe que existem vários subdiretórios. As pastas mais relevantes são a LIB e a BIN.&lt;br /&gt;&lt;br /&gt;Copie o arquivo do driver jdbc do postgresql (e o dos demais bancos com os quais trabalhar) para a pasta LIB do JMeter.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. Execução&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;No windows pode ser utilizado o arquivo jmeter.bat, na pasta BIN da ferramenta (jakarta-jmeter-2.4/bin no meu caso). No Linux existe o arquivo jmeter.sh.&lt;br /&gt;&lt;br /&gt;Existe a opção de rodar diretamente do arquivo .JAR, digitando:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;java&amp;nbsp; -jar ApacheJMeter.jar&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;A tela inicial apresentada é bastante simples, com uma barra de menu e uma árvore onde são apresentados hierarquicamente os comandos dos planos de testes.&lt;br /&gt;&lt;br /&gt;A árvore apresenta duas grandes divisões: plano de testes e área de trabalho. A área de trabalho pode ser utilizada para colocar comandos que não serão executados, enquanto que o plano de testes é a parte da treeview que apresenta os comandos do plano que serão executados, sendo que comandos de teste podem ser arrastados livremente entre área de trabalho e plano de testes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-4s0aw0aPltY/TgnSeljrmAI/AAAAAAAAANY/2GdYULtbglc/s1600/Captura_de_tela-Apache+JMeter+%25282.4+r961953%2529.png&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;208&quot; src=&quot;http://1.bp.blogspot.com/-4s0aw0aPltY/TgnSeljrmAI/AAAAAAAAANY/2GdYULtbglc/s320/Captura_de_tela-Apache+JMeter+%25282.4+r961953%2529.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3. Número de Usuários Simulados no Teste&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;O primeiro passo é definir o número de usuários que seu teste deseja simular.&amp;nbsp; Se o seu teste tiver muitos usuários, pode ser caracterizado como teste de carga. Caso tenha apenas um, executando uma vez cada comando, pode ser entendido como um teste funcional. Cada plano de testes pode agregar dezenas de requisições (testes) de banco de dados (JDBC), FTP, HTTP, entre outras possibilidades.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Com o botão direito do mouse sobre o plano de trabalho acione o menu &quot;Plano de Testes\ Adicionar\ Threads (Users)\ Grupos de Usuários&quot;. A tela mostrada permite que se defina quantos usuários virtuais serão simulados, o tempo de inicialização de cada usuário e o número de vezes que cada usuário simulado executará os próximos comandos do plano de testes. Caso se deseje 100&amp;nbsp; usuários, executando 10 vezes cada teste, uma execução do plano de testes testará 10000 execuções do plano. &lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-IiT0XelILKE/TgnVtWPpCWI/AAAAAAAAANc/8DhG1dFVmxw/s1600/Apache+JMeter+2+-+Cria%25C3%25A7%25C3%25A3o+de+Usu%25C3%25A1rios.png&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;136&quot; src=&quot;http://2.bp.blogspot.com/-IiT0XelILKE/TgnVtWPpCWI/AAAAAAAAANc/8DhG1dFVmxw/s320/Apache+JMeter+2+-+Cria%25C3%25A7%25C3%25A3o+de+Usu%25C3%25A1rios.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4. Configurando o JDBC&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Para fazer testes de banco de dados, devemos configurar a conexão JDBC.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Com o botão direito do mouse sobre o plano de trabalho acione o  menu &quot;Plano de Testes\ Adicionar\ Elemento de Configuração\&amp;nbsp; Configuração da Conexão JDBC&quot;.&lt;br /&gt;&lt;br /&gt;A  tela mostrada permite que se defina os parâmetros de conexão com o servidor, tais como limite de conexões, tempo máximo de conexão, intervalo para &lt;i&gt;timeout&lt;/i&gt; de conexão, entre outros. A figura abaixo mostra os principais parâmetros utilizados.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-DEMBf3UENrg/TgnYGxe0ZuI/AAAAAAAAANg/l10P8kOmHFs/s1600/Apache+JMeter+3+-+Configura%25C3%25A7%25C3%25A3o+de+conexao+JDBC.png&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;176&quot; src=&quot;http://4.bp.blogspot.com/-DEMBf3UENrg/TgnYGxe0ZuI/AAAAAAAAANg/l10P8kOmHFs/s320/Apache+JMeter+3+-+Configura%25C3%25A7%25C3%25A3o+de+conexao+JDBC.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-DEMBf3UENrg/TgnYGxe0ZuI/AAAAAAAAANg/l10P8kOmHFs/s1600/Apache+JMeter+3+-+Configura%25C3%25A7%25C3%25A3o+de+conexao+JDBC.png&quot;&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;5. Criação do Teste de Banco&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Para criar os testes de banco de dados em si, basta se definir o SQL a ser submetido. O comando será executando tantas vezes forem definidas na seção &quot;Grupo de Usuários&quot; do plano de testes. &lt;br /&gt;&lt;br /&gt;Com o botão direito do mouse sobre o plano de trabalho acione o  menu &quot;Plano de Testes\ Adicionar\ Testador\ Requisição JDBC&quot;.&lt;br /&gt;&lt;br /&gt;A  tela mostrada permite que se forneça o comando SQL a ser testado. &lt;b&gt;Não utilize ponto e vírgula &quot;;&quot;, pois pode gerar erro de execução. &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-ur8dEmD-l6Y/TgneUa4VQ_I/AAAAAAAAAN0/EUxe4JUaxBo/s1600/comando+sql.png&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;133&quot; src=&quot;http://1.bp.blogspot.com/-ur8dEmD-l6Y/TgneUa4VQ_I/AAAAAAAAAN0/EUxe4JUaxBo/s320/comando+sql.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-7s2QULoMsao/TgnaZqqBrQI/AAAAAAAAANo/7V5FCuDEEUM/s1600/jakarta-jmeter+3+Requisi%25C3%25A7%25C3%25A3o+JDBC+OK.png&quot;&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-YwbNIvnaOsE/TgnZ_MTW7WI/AAAAAAAAANk/YbhL8STcVjY/s1600/Apache+JMeter+4+Select+a+ser+testado+no+Postgres.png&quot;&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;6. Adicionando Ouvintes (Listeners)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Antes de executar os testes, deve ser definido de que forma o resultado da execução será apresentado. Os ouvintes monitoram os testes e apresentam o resumo das execuções de várias formas.&lt;br /&gt;&lt;br /&gt;Um mesmo teste pode ser visualizado de mais de uma forma, o que facilita o entendimento, seja como árvore, tabela, gráfico ou geração de arquivo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Com o botão direito do mouse sobre o plano de trabalho acione o  menu &quot;Plano de Testes\ Adicionar\ Ouvinte\ Árvore de Resultados&quot;.&amp;nbsp; Acrescente outros ouvintes como &quot;Relatório Agregado&quot; e &quot;Ver Resultados em Tabela&quot;. As figuras abaixo mostra o resultado de um teste visto por mais de um ouvinte.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-XHpTU2L7czE/Tgnb1ksFF7I/AAAAAAAAANs/N8jCr8ZJFUc/s1600/listeners.png&quot;&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-BlZ98cQK-Bg/Tgne2W-oo9I/AAAAAAAAAN4/9Pn9NsGIxss/s1600/vasao.png&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;86&quot; src=&quot;http://3.bp.blogspot.com/-BlZ98cQK-Bg/Tgne2W-oo9I/AAAAAAAAAN4/9Pn9NsGIxss/s320/vasao.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-uY0Y6j9GBek/Tgne3GpEw8I/AAAAAAAAAN8/xPog9O6QEck/s1600/listeners.png&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;178&quot; src=&quot;http://2.bp.blogspot.com/-uY0Y6j9GBek/Tgne3GpEw8I/AAAAAAAAAN8/xPog9O6QEck/s320/listeners.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-pWH1IYUqd1M/Tgnb8tiAHJI/AAAAAAAAANw/KMN9vuqQ6hw/s1600/vasao.png&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-YwbNIvnaOsE/TgnZ_MTW7WI/AAAAAAAAANk/YbhL8STcVjY/s1600/Apache+JMeter+4+Select+a+ser+testado+no+Postgres.png&quot;&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;7. Executando Testes&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Utilize a barra de menu para executar os testes:&lt;br /&gt;- &quot;Executar\ Iniciar&quot; - Executa os testes do plano de trabalho atual&lt;br /&gt;- &quot;Executar\ Limpar Tudo&quot; - Limpa os resultados de testes anteriores para nova rodada de testes&lt;br /&gt;- &quot;Arquivo\ Salvar&quot; - Salva o Plano de Testes&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Independentemente de termos boas ferramentas como o JMeter, temos sempre de testar as nossas aplicações, e não podemos descuidar dos bancos de dados. O JMeter tem potencial para automatizar boa parte dos testes feitos com bancos de dados sem grande esforço, o que não elimina a necessidade de bons testadores e de cuidado na hora de se realizar e interpretar os resultados apresentados.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Teste o JMeter e me diga o que achou dele! &lt;/b&gt;Não se esqueça que a qualidade do seu teste é consequência de um bom plano de testes!&lt;div class=&quot;blogger-post-footer&quot;&gt;Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3371915898459901668-6865408034305358545?l=postgresqlbr.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2011-06-28T11:53:17+00:00</dc:date>
	<dc:creator>cbleopoldino</dc:creator>
</item>
<item rdf:about="tag:blogger.com,1999:blog-3371915898459901668.post-8776039077049815454">
	<title>Claudio Bezerra Leopoldino: Qual é a versão do seu Postgres?</title>
	<link>http://postgresqlbr.blogspot.com/2011/06/qual-e-versao-do-seu-postgres.html</link>
	<content:encoded>Você sabe qual é a versão do seu servidor Postgres? Sabe mesmo? E do cliente (estava pensando que é sempre a mesma?)? Ele é 32 ou 64 bits? Para muitos desenvolvedores a resposta é não, e em vários casos nem se sabe como recuperar estas informações.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A melhor maneira de se saber a versão de um servidor banco de dados é simplesmente consultando-a. E no caso do postgresql a função que retorna estas informações é a VERSION().&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Exemplo:&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;b&gt; - Consulta padrão:&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;SELECT version();&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Resultado:&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;PostgreSQL 9.0.4 on i486-pc-linux-gnu, compiled by GCC gcc-4.4.real (Ubuntu 4.4.3-4ubuntu5) 4.4.3, 32-bit&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Para recuperar informações de versionamento do cliente do banco deve se utilizar o utilitário psql:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Exemplo:&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;psql --version&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;Resultado:&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;psql (PostgreSQL) 9.0.4&lt;br /&gt;contém suporte a edição em linha de comando&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Agora você pode visualizar facilmente a versão atual do seu postgres. Então é bom passar mais alguma informação sobre como interpretar o número de versionamento.&lt;br /&gt;&lt;br /&gt;O postgres é versionado em um sistema de numeração com três números, no formato &quot;&lt;b&gt;A.B.C&lt;/b&gt;&quot;. A versão de produção atual, seguindo este formato, é a 9.0.4. A sistemática de numeração de versão do postgres pode ser conferida &lt;a href=&quot;http://it.toolbox.com/blogs/database-soup/guide-to-postgresql-version-numbers-19177&quot;&gt;aqui&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;A&lt;/b&gt; - Número de versão principal. Quando este número muda significa que aconteceram alterações radicais na estrutura e funcionamento do banco. A versão atual é 9, e não há planejamento para uma versão 10 no momento.&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;B&lt;/b&gt; - Número de versão secundário. Quando este número muda significa que aconteceram alterações na estrutura e funcionamento do banco que demandam. Os números A e B devem ser considerados em conjunto, e não apenas o primeiro número de versão, pois indicam uma versão em especial. O B da versão atual é 0, mas existe uma versão beta do postgres 9.1 e planejamento da versão 9.2. &lt;br /&gt;&lt;br /&gt;- &lt;b&gt;C&lt;/b&gt; - Número de atualizações aplicadas à versão &quot;A.B&quot;. Na versão 8.4, por exemplo, já foram aplicadas 10 atualizações. O valor inicial de C é 0 e atualmente estamos na versão 9.0.4, indicando que a versão 9.0 já sofreu 4 atualizações. É importante acompanhar os informes de atualização especialmente quando solucionam questões chave de segurança, performance e bugs que afetam de alguma forma o desenvolvimento dos sistemas e a disponibilidade dos servidores de banco.&lt;br /&gt;&lt;br /&gt;Que tal conferir agora a versão que está no seu sistema?&lt;div class=&quot;blogger-post-footer&quot;&gt;Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3371915898459901668-8776039077049815454?l=postgresqlbr.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2011-06-13T09:54:15+00:00</dc:date>
	<dc:creator>cbleopoldino</dc:creator>
</item>
<item rdf:about="tag:blogger.com,1999:blog-3371915898459901668.post-3046021978836504028">
	<title>Claudio Bezerra Leopoldino: Utilize o PSQL como Gerador de Relatórios!</title>
	<link>http://postgresqlbr.blogspot.com/2011/06/utilize-o-psql-como-gerador-de.html</link>
	<content:encoded>Uma boa maneira de utilizar o utilitário psql é como meio para executar scripts que recuperem informações e as armazenem em arquivos. Desta forma, podemos gerar relatórios de alta relevância e complexidade a um custo mínimo.&lt;br /&gt;&lt;br /&gt;A sintaxe abaixo, lê um script de um arquivo de entrada com o programa e o executa no PSQL:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;psql -U usuario -d banco_de_dados -f arquivo_de_entrada&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Mas como gerar relatórios de forma fácil com o psql? Simplesmente as opções são infinitas, pois podemos mesclar comandos SELECT, funções como a current_timestamp e comandos do psql. A solução depende da sua criatividade.&lt;br /&gt;&lt;br /&gt;Abaixo coloco um script simples que recupera informações sobre os objetos do banco. A opção &quot;\o&quot; especifica um arquivo de saída do relatório. Para se executar o script, o mesmo foi gravado no arquivo &quot;entrada.txt&quot; e foi executado no prompt do psql através da chamada &quot;psql -U postgres -d teste -f entrada.txt&quot;. O script foi testado no Postgresql 9.0.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;\o saida.txt&lt;br /&gt;\echo Cabecalho&lt;br /&gt;SELECT 'Inicio: ' || current_timestamp as Inicio; &lt;br /&gt;\echo Relatorio no Arquivo Saida.txt&lt;br /&gt;SELECT '#####################################################################' AS Titulo UNION ALL&lt;br /&gt;SELECT '### Relatorio de Banco de Dados 1.0 #################################' AS Titulo UNION ALL&lt;br /&gt;SELECT '### Claudio Leopoldino&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #################################' AS Titulo UNION ALL&lt;br /&gt;SELECT '### Script para livre distribuição e utilização #####################' AS Titulo UNION ALL&lt;br /&gt;SELECT '### http://postgresqlbr.blogspot.com/ ###############################' AS Titulo UNION ALL&lt;br /&gt;SELECT '#####################################################################' AS Titulo;&lt;br /&gt;\echo Lista de Bancos de Dados&lt;br /&gt;\qecho '#########################################################################################'&lt;br /&gt;\qecho '### Bancos de Dados #####################################################################'&lt;br /&gt;\qecho '#########################################################################################'&lt;br /&gt;\l&lt;br /&gt;\echo Lista de Bancos de Dados com Detalhe&lt;br /&gt;\l+&lt;br /&gt;\echo Lista de Usuarios&lt;br /&gt;\qecho '#########################################################################################'&lt;br /&gt;\qecho '### Lista de Usuarios ###################################################################'&lt;br /&gt;\qecho '#########################################################################################'&lt;br /&gt;\du&lt;br /&gt;\echo Lista de Tabelas&lt;br /&gt;\qecho '#########################################################################################'&lt;br /&gt;\qecho '### TABELAS #############################################################################'&lt;br /&gt;\qecho '#########################################################################################'&lt;br /&gt;\dt&lt;br /&gt;\echo Lista de Tabelas com Detalhe&lt;br /&gt;\dt+&lt;br /&gt;\echo Lista de Tabelas de Sistema&lt;br /&gt;\dtS&lt;br /&gt;\echo Lista de Tabelas de Sistema com Detalhe&lt;br /&gt;\dtS+&lt;br /&gt;\echo Lista de Indices&lt;br /&gt;\qecho '#########################################################################################'&lt;br /&gt;\qecho '### INDICES #############################################################################'&lt;br /&gt;\qecho '#########################################################################################'&lt;br /&gt;\di&lt;br /&gt;\echo Lista de Indices com Detalhe&lt;br /&gt;\di+&lt;br /&gt;\echo Lista de Sequencias&lt;br /&gt;\qecho '#########################################################################################'&lt;br /&gt;\qecho '### SEQUENCIAS###########################################################################'&lt;br /&gt;\qecho '#########################################################################################'&lt;br /&gt;\ds&lt;br /&gt;\echo Lista de Visoes&lt;br /&gt;\qecho '#########################################################################################'&lt;br /&gt;\qecho '### VISOES ##############################################################################'&lt;br /&gt;\qecho '#########################################################################################'&lt;br /&gt;\dv&lt;br /&gt;\echo Lista de Visoes com Detalhe&lt;br /&gt;\dv+&lt;br /&gt;\echo Lista de Visoes de Sistema&lt;br /&gt;\dvS&lt;br /&gt;\echo Lista de Visoes de Sistema com Detalhe&lt;br /&gt;\dvS+&lt;br /&gt;\echo Lista de Privilegios de Acesso&lt;br /&gt;\qecho '#########################################################################################'&lt;br /&gt;\qecho '### PRIVILEGIOS DE ACESSO ###############################################################'&lt;br /&gt;\qecho '#########################################################################################'&lt;br /&gt;\dp&lt;br /&gt;\echo Lista de Large Objects&lt;br /&gt;\qecho '#########################################################################################'&lt;br /&gt;\qecho '### LARGE OBJECTS #######################################################################'&lt;br /&gt;\qecho '#########################################################################################'&lt;br /&gt;\dl&lt;br /&gt;\echo Lista de Funcoes&lt;br /&gt;\qecho '#########################################################################################'&lt;br /&gt;\qecho '### FUNCOES #############################################################################'&lt;br /&gt;\qecho '#########################################################################################'&lt;br /&gt;\df&lt;br /&gt;\echo Lista de Operadores&lt;br /&gt;\qecho '#########################################################################################'&lt;br /&gt;\qecho '### OPERADORES ##########################################################################'&lt;br /&gt;\qecho '#########################################################################################'&lt;br /&gt;\do&lt;br /&gt;\echo Lista de Tipos de Dados&lt;br /&gt;\qecho '#########################################################################################'&lt;br /&gt;\qecho '### TIPOS DE DADOS ######################################################################'&lt;br /&gt;\qecho '#########################################################################################'&lt;br /&gt;\dT &lt;br /&gt;\echo Rodape&lt;br /&gt;SELECT 'Final: ' || current_timestamp as Final; \q&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Agora você pode executá-lo e incrementá-lo para extrair e formatar toda informação que você desejar. Pode ainda criar novos e melhores scripts! Explore opções para layouts mais agradáveis, consultas mais específicas e o que mais a sua necessidade exigir e a sua criatividade for capaz de propor!&lt;br /&gt;&lt;br /&gt;Como melhorar este relatório? Te convido a compartilhar com a comunidade nos comentários deste post. Sua contribuição é sempre bem vinda!&lt;div class=&quot;blogger-post-footer&quot;&gt;Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3371915898459901668-3046021978836504028?l=postgresqlbr.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2011-06-08T09:44:55+00:00</dc:date>
	<dc:creator>cbleopoldino</dc:creator>
</item>
<item rdf:about="http://www.postgresql.org.br/13049 at http://www.postgresql.org.br">
	<title>PostgreSQL Brasil: PGDay RS 2011</title>
	<link>http://www.postgresql.org.br/eventos/pgday/rs</link>
	<content:encoded>&lt;p class=&quot;rtecenter&quot;&gt;&lt;a href=&quot;https://picasaweb.google.com/112690003264111917562/PGDay#&quot;&gt;&lt;strong&gt;FOTOS PGDay/RS 2011&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;rtecenter&quot;&gt;&lt;a href=&quot;https://picasaweb.google.com/112690003264111917562/PGDay#&quot;&gt;&lt;img width=&quot;400&quot; height=&quot;300&quot; alt=&quot;&quot; src=&quot;https://lh4.googleusercontent.com/-ERumdkBjgV8/TlU-zuMEtiI/AAAAAAAAA08/ebMmSeso5Fo/s640/DSC01614.JPG&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;INCRI&amp;Ccedil;&amp;Otilde;ES ONLINE ENCERRADAS!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.postgresql.org.br/eventos/pgday/rs&quot; target=&quot;_blank&quot;&gt;leia mais&lt;/a&gt;&lt;/p&gt;</content:encoded>
	<dc:date>2011-06-02T22:10:57+00:00</dc:date>
</item>
<item rdf:about="tag:blogger.com,1999:blog-3371915898459901668.post-4714814243894759910">
	<title>Claudio Bezerra Leopoldino: Booktown e outros Bancos de Dados de Exemplo para PostgreSQL</title>
	<link>http://postgresqlbr.blogspot.com/2011/05/booktown-e-outros-bancos-de-dados-de.html</link>
	<content:encoded>Exemplos de bancos de dados são úteis para o ensino e a aprendizagem sobre as ferramentas e sobre situações práticas que ocorrem no cotidiano dos profissionais da área. Já falei previamente sobre o &lt;a href=&quot;http://postgresqlbr.blogspot.com/2008/03/crie-bases-de-dados-com-o-pagila.html&quot;&gt;pagila&lt;/a&gt;, mas é sempre bom ter mais opções.&lt;br /&gt;&lt;br /&gt;O Booktown é um script que cria o banco de dados de uma livraria completa, incluindo alguns registros e possibilitando um bom banco de dados para testes e ensino de banco de dados. Originalmente, a base booktown foi utilizada nos exemplos do livro &lt;a href=&quot;http://www.commandprompt.com/ppbook/&quot;&gt;&lt;i&gt;Practical PostgreSQL&lt;/i&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Baixe o script &lt;a href=&quot;http://www.commandprompt.com/ppbook/booktown.sql&quot;&gt;aqui&lt;/a&gt;.&lt;div class=&quot;blogger-post-footer&quot;&gt;Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3371915898459901668-4714814243894759910?l=postgresqlbr.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2011-05-31T09:10:33+00:00</dc:date>
	<dc:creator>cbleopoldino</dc:creator>
</item>
<item rdf:about="tag:blogger.com,1999:blog-3371915898459901668.post-7573788938958589060">
	<title>Claudio Bezerra Leopoldino: Automatize o seu Backup do PostgreSQL via Python!</title>
	<link>http://postgresqlbr.blogspot.com/2011/05/automatize-o-seu-backup-do-postgresql.html</link>
	<content:encoded>Vi esse script no site do &lt;a href=&quot;http://codepoets.co.uk/2011/postgresql-backup-script-python/&quot;&gt;David Goodwin&lt;/a&gt; e achei interessante. Mas ao executá-lo posteriormente tive outra boa surpresa: ele executa &quot;de primeira&quot;, sem a necessidade de se fazer qualquer correção. A idéia é através de um programa em python chamar os utilitários de backup do postgres para realizar o backup, e o código deste script pode ser alterado para automatizar outras tarefas de modo bastante simples.&lt;br /&gt;&lt;br /&gt;As etapas de utilização são simples:&lt;br /&gt;&lt;br /&gt;- Instale o &lt;a href=&quot;http://www.python.org/getit/&quot;&gt;python&lt;/a&gt; e o postgres. Esta etapa eu não precisei fazer, porque já o tinha instalado aqui. Teste a versão digitando: &quot;&lt;b&gt;python --version&lt;/b&gt;&quot;. A versão da minha máquina é a 2.6.5 e do postgres é 9.0.&lt;br /&gt;- Crie um arquivo de script com o código. Use a extensão &quot;.py&quot; como padrão para não misturar seus códigos python os de com outras aplicações.&lt;br /&gt;- Edite os campos &quot;usuário&quot;, &quot;senha&quot;, &quot;caminho do pg_dump&quot;, a &quot;lista de bancos que devem sofrer backup&quot; e salve o arquivo. Destaquei abaixo estes parâmetros em vermelho&lt;br /&gt;- Execute o script. Utilizei &quot;&lt;b&gt;python -v py_backup.py&lt;/b&gt;&quot;. A opção -v significa VERBOSE, isto é, gera uma descrição de tudo o que está sendo feito durante o backup. Existem outras boas opções do pg_dump e do python, mas isso fica como pesquisa paras os interessados. &lt;br /&gt;&lt;br /&gt;Abaixo coloco o código do script, mas acesse também o &lt;a href=&quot;http://codepoets.co.uk/2011/postgresql-backup-script-python/&quot;&gt;site original&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;code class=&quot;shell preprocessor bold&quot;&gt;#!/usr/bin/python&lt;/code&gt;&lt;/b&gt;&lt;br /&gt;&lt;div class=&quot;container&quot;&gt;&lt;div class=&quot;line number2 index1 alt1&quot;&gt;&lt;/div&gt;&lt;div class=&quot;line number3 index2 alt2&quot;&gt;&lt;b&gt;&lt;code class=&quot;shell plain&quot;&gt;from &lt;/code&gt;&lt;code class=&quot;shell functions&quot;&gt;time&lt;/code&gt; &lt;code class=&quot;shell functions&quot;&gt;import&lt;/code&gt; &lt;code class=&quot;shell plain&quot;&gt;gmtime, strftime&lt;/code&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;line number4 index3 alt1&quot;&gt;&lt;b&gt;&lt;code class=&quot;shell functions&quot;&gt;import&lt;/code&gt; &lt;code class=&quot;shell plain&quot;&gt;subprocess&lt;/code&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;line number5 index4 alt2&quot;&gt;&lt;b&gt;&lt;code class=&quot;shell functions&quot;&gt;import&lt;/code&gt; &lt;code class=&quot;shell plain&quot;&gt;os&lt;/code&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;line number6 index5 alt1&quot;&gt;&lt;/div&gt;&lt;div class=&quot;line number7 index6 alt2&quot;&gt;&lt;b&gt;&lt;code class=&quot;shell plain&quot;&gt;database_list = [ &lt;/code&gt;&lt;code class=&quot;shell string&quot;&gt;'&lt;span&gt;database1&lt;/span&gt;'&lt;/code&gt;&lt;code class=&quot;shell plain&quot;&gt;, &lt;/code&gt;&lt;code class=&quot;shell string&quot;&gt;'&lt;span&gt;database2&lt;/span&gt;'&lt;/code&gt;&lt;code class=&quot;shell plain&quot;&gt;, &lt;/code&gt;&lt;code class=&quot;shell string&quot;&gt;'&lt;span&gt;etc&lt;/span&gt;'&lt;/code&gt; &lt;code class=&quot;shell plain&quot;&gt;]&lt;/code&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;line number8 index7 alt1&quot;&gt;&lt;/div&gt;&lt;div class=&quot;line number9 index8 alt2&quot;&gt;&lt;b&gt;&lt;code class=&quot;shell plain&quot;&gt;USER = &lt;/code&gt;&lt;code class=&quot;shell string&quot;&gt;&quot;&lt;span&gt;postgres&lt;/span&gt;&quot;&lt;/code&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;line number10 index9 alt1&quot;&gt;&lt;b&gt;&lt;code class=&quot;shell plain&quot;&gt;PASS = &lt;/code&gt;&lt;code class=&quot;shell string&quot;&gt;&quot;&lt;span&gt;postgres-password&lt;/span&gt;&quot;&lt;/code&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;line number11 index10 alt2&quot;&gt;&lt;b&gt;&lt;code class=&quot;shell plain&quot;&gt;BACKUP_DIR = &lt;/code&gt;&lt;code class=&quot;shell string&quot;&gt;&quot;&lt;span&gt;e:\\postgresql_backups\\&lt;/span&gt;&quot;&lt;/code&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;line number12 index11 alt1&quot;&gt;&lt;b&gt;&lt;code class=&quot;shell comments&quot;&gt;# dump using PostgreSQL's custom format, with maximum compression. (-F c, -Z 9)&lt;/code&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;line number13 index12 alt2&quot;&gt;&lt;b&gt;&lt;code class=&quot;shell plain&quot;&gt;dumper = &lt;/code&gt;&lt;code class=&quot;shell string&quot;&gt;&quot;&quot;&lt;/code&gt;&lt;code class=&quot;shell string&quot;&gt;&quot; &quot;&lt;/code&gt;&lt;code class=&quot;shell plain&quot;&gt;c:\\program files\\postgresql\\8.1\\bin\\pg_dump&lt;/code&gt;&lt;code class=&quot;shell string&quot;&gt;&quot; -U %s -Z 9 -f %s -F c %s&amp;nbsp; &quot;&lt;/code&gt;&lt;code class=&quot;shell string&quot;&gt;&quot;&quot;&lt;/code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;line number14 index13 alt1&quot;&gt;&lt;/div&gt;&lt;div class=&quot;line number15 index14 alt2&quot;&gt;&lt;b&gt;&lt;code class=&quot;shell plain&quot;&gt;os.putenv(&lt;/code&gt;&lt;code class=&quot;shell string&quot;&gt;'PGPASSWORD'&lt;/code&gt;&lt;code class=&quot;shell plain&quot;&gt;, PASS)&lt;/code&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;line number16 index15 alt1&quot;&gt;&lt;/div&gt;&lt;div class=&quot;line number17 index16 alt2&quot;&gt;&lt;b&gt;&lt;code class=&quot;shell keyword&quot;&gt;for&lt;/code&gt; &lt;code class=&quot;shell plain&quot;&gt;database_name &lt;/code&gt;&lt;code class=&quot;shell keyword&quot;&gt;in&lt;/code&gt; &lt;code class=&quot;shell plain&quot;&gt;database_list :&lt;/code&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;line number18 index17 alt1&quot;&gt;&lt;b&gt;&lt;code class=&quot;shell spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;shell plain&quot;&gt;print strftime( &lt;/code&gt;&lt;code class=&quot;shell string&quot;&gt;&quot;%Y-%m-%d-%H-%M-%S&quot;&lt;/code&gt; &lt;code class=&quot;shell plain&quot;&gt;, gmtime()) + &lt;/code&gt;&lt;code class=&quot;shell string&quot;&gt;&quot;:dump started for %s&quot;&lt;/code&gt;&lt;code class=&quot;shell plain&quot;&gt;%database_name&lt;/code&gt;&lt;/b&gt; &lt;/div&gt;&lt;div class=&quot;line number19 index18 alt2&quot;&gt;&lt;b&gt;&lt;code class=&quot;shell spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;shell functions&quot;&gt;time&lt;/code&gt; &lt;code class=&quot;shell plain&quot;&gt;= str (strftime(&lt;/code&gt;&lt;code class=&quot;shell string&quot;&gt;&quot;%Y-%m-%d-%H-%M&quot;&lt;/code&gt;&lt;code class=&quot;shell plain&quot;&gt;))&lt;/code&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;line number20 index19 alt1&quot;&gt;&lt;b&gt;&lt;code class=&quot;shell spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;shell plain&quot;&gt;file_name = database_name + &lt;/code&gt;&lt;code class=&quot;shell string&quot;&gt;'_'&lt;/code&gt; &lt;code class=&quot;shell plain&quot;&gt;+ &lt;/code&gt;&lt;code class=&quot;shell functions&quot;&gt;time&lt;/code&gt; &lt;code class=&quot;shell plain&quot;&gt;+ &lt;/code&gt;&lt;code class=&quot;shell string&quot;&gt;&quot;.sql.pgdump&quot;&lt;/code&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;line number21 index20 alt2&quot;&gt;&lt;b&gt;&lt;code class=&quot;shell spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;shell comments&quot;&gt;#Run the pg_dump command to the right directory&lt;/code&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;line number22 index21 alt1&quot;&gt;&lt;b&gt;&lt;code class=&quot;shell spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;shell functions&quot;&gt;command&lt;/code&gt; &lt;code class=&quot;shell plain&quot;&gt;= dumper % (USER,&amp;nbsp; BACKUP_DIR + file_name, database_name)&lt;/code&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;line number23 index22 alt2&quot;&gt;&lt;b&gt;&lt;code class=&quot;shell spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;shell plain&quot;&gt;subprocess.call(&lt;/code&gt;&lt;code class=&quot;shell functions&quot;&gt;command&lt;/code&gt;&lt;code class=&quot;shell plain&quot;&gt;,shell = True)&lt;/code&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;line number24 index23 alt1&quot;&gt;&lt;b&gt;&lt;code class=&quot;shell spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;shell plain&quot;&gt;print strftime( &lt;/code&gt;&lt;code class=&quot;shell string&quot;&gt;&quot;%Y-%m-%d-%H-%M-%S&quot;&lt;/code&gt; &lt;code class=&quot;shell plain&quot;&gt;, gmtime()) + &lt;/code&gt;&lt;code class=&quot;shell string&quot;&gt;&quot;:finished&quot;&lt;/code&gt;&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Tente utilizar o python para chamar outros utilitários do postgres. Se quiser fazer um backup de todas as bases de dados, pode utilizar por exemplo o PG_DUMPALL. &lt;br /&gt;&lt;br /&gt;Tem sugestões de melhoria para este script? Poste aqui no nosso fórum!&lt;div class=&quot;blogger-post-footer&quot;&gt;Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3371915898459901668-7573788938958589060?l=postgresqlbr.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2011-05-30T10:54:17+00:00</dc:date>
	<dc:creator>cbleopoldino</dc:creator>
</item>
<item rdf:about="http://andrecf.kinghost.net/freebsd/?p=201">
	<title>André Fernandes: Revista em PDF de postgreSQL</title>
	<link>http://andrecf.kinghost.net/freebsd/2011/05/25/revista-em-pdf-de-postgresql/</link>
	<content:encoded>Acabo de ler o volume zero da nova revista de postgreSQL e é uma ótima iniciativa, se depender de mim terá muito futuro. Há uma entrevista com Bruce Momjian, uma apresentação de extensões (a nova forma de instalar e trabalhar com módulos do postgreSQL na versão 9.1, e que é uma das alterações mais bem [...]</content:encoded>
	<dc:date>2011-05-25T19:52:44+00:00</dc:date>
</item>
<item rdf:about="http://www.postgresql.org.br/12977 at http://www.postgresql.org.br">
	<title>PostgreSQL Brasil: PGBR 2011 - você vai perder?</title>
	<link>http://www.postgresql.org.br/eventos/2011/pgbr</link>
	<content:encoded>&lt;p class=&quot;rtecenter&quot;&gt;&lt;a href=&quot;http://pgbr.postgresql.org.br&quot;&gt;&lt;br /&gt;
&lt;img alt=&quot;PGBR 2011 - Conferência Brasileira PostgreSQL&quot; width=&quot;432&quot; height=&quot;60&quot; border=&quot;0&quot; src=&quot;http://pgbr.postgresql.org.br/2011/imgs/divulgue_horizontal_pequeno.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.postgresql.org.br/eventos/2011/pgbr&quot; target=&quot;_blank&quot;&gt;leia mais&lt;/a&gt;&lt;/p&gt;</content:encoded>
	<dc:date>2011-05-25T14:29:45+00:00</dc:date>
</item>
<item rdf:about="tag:blogger.com,1999:blog-3371915898459901668.post-4405999470421158432">
	<title>Claudio Bezerra Leopoldino: A Revista Oficial do PostgreSQL!</title>
	<link>http://postgresqlbr.blogspot.com/2011/05/revista-oficial-do-postgresql.html</link>
	<content:encoded>É apenas um teste, mas pode se concretizar. O primeiro número da revista oficial do PostgreSQL está no ar e você pode baixar gratuitamente. &lt;a href=&quot;http://pgmag.org/&quot;&gt;Acesse e confira&lt;/a&gt;! Caso a recepção seja boa, a revista ganhará novas edições.&lt;br /&gt;&lt;br /&gt;O primeiro número me agradou bastante, explorando vários itens sobre as futuras versões do Postgres, questões de performance e dicas específicas para&amp;nbsp; sistemas operacionais, o que nem sempre é fácil de se encontrar.&lt;br /&gt;&lt;br /&gt;Você pode colaborar adquirindo a versão impressa ou submetendo matérias para os editores. Confira!&lt;div class=&quot;blogger-post-footer&quot;&gt;Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3371915898459901668-4405999470421158432?l=postgresqlbr.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2011-05-23T08:32:57+00:00</dc:date>
	<dc:creator>cbleopoldino</dc:creator>
</item>
<item rdf:about="http://www.midstorm.org/~telles/?p=737">
	<title>Fabio Telles: PGCasts</title>
	<link>http://www.midstorm.org/~telles/2011/05/20/pgcasts/</link>
	<content:encoded>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;O Sr. &lt;a href=&quot;http://guedesoft.net/blog/&quot; target=&quot;_blank&quot;&gt;Dickson Guedes&lt;/a&gt; resurgiu das cinzas em grande estilo e com um projeto muito bacana. O &lt;a href=&quot;http://pgcasts.com&quot; target=&quot;_blank&quot;&gt;pgcasts&lt;/a&gt; é um &lt;a href=&quot;http://pt.wikipedia.org/wiki/Screencast&quot; target=&quot;_blank&quot;&gt;screencast&lt;/a&gt;, ou seja, áudio e vídeo com uma demonstração de como fazer alguma coisa no PostgreSQL. Ver a tela dele fazendo enquanto vai comentando, é muito mais simples do que ler um artigo enorme num blog como o meu&amp;#8230;. assuntos que eu levaria páginas para abordar ele mostra como fazer na prática com 20 a 30 minutos de screencast.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Muito bacana, eu recomendo. Até hoje (02/05/11) são 3 episódios e ele vem mantendo a média de um novo screencast por semana:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;http://pgcasts.com/episodes/1-instalando-postgresql-9-0&quot;&gt;Instalando PostgreSQL 9.0&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;http://pgcasts.com/episodes/2-trabalhando-com-datas-no-postgresql&quot; target=&quot;_blank&quot;&gt;Trabalhando com datas no PostgreSQL&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;http://pgcasts.com/episodes/3-alterando-colunas-de-tipos-conflitantes&quot; target=&quot;_blank&quot;&gt;Alterando colunas de tipos conflitantes&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Divirtam-se.&lt;/p&gt;</content:encoded>
	<dc:date>2011-05-20T12:18:12+00:00</dc:date>
</item>
<item rdf:about="tag:blogger.com,1999:blog-3371915898459901668.post-2511484191727932454">
	<title>Claudio Bezerra Leopoldino: Participe: Edital para Instrutor de PostgreSQL - UNESCO/ FUNAI</title>
	<link>http://postgresqlbr.blogspot.com/2011/05/participe-edital-para-instrutor-de.html</link>
	<content:encoded>&lt;div class=&quot;MsoNormal&quot;&gt;Aos instrutores de banco de dados, segue a notícia de edital para instrutor de PostgreSQL. A indicação foi do amigo Bruno Rebello. Participem e divulguem entre os possíveis candidatos! Os editais estão nos sites da &lt;a href=&quot;http://www.unesco.org.br/&quot;&gt;UNESCO&lt;/a&gt; e da &lt;a href=&quot;http://www.funai.gov.br/&quot;&gt;FUNAI&lt;/a&gt;.&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Avisem sempre que tiverem vagas de seleções e concursos relacionados como PostgreSQL para divulgação neste espaço! &lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;_______________________________________________________________&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;strong&gt;&lt;span&gt;EDITAL 002/2011&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; - A UNESCO e FUNAI, por meio do Projeto 914BRA4008 – “Impactos do Desenvolvimento e Salvaguarda de Comunidades Indígenas”, seleciona na modalidade &lt;strong&gt;&lt;span&gt;“PRODUTO”,&lt;/span&gt;&lt;/strong&gt; 01 profissional com Graduação na área de Tecnologia da Informação e/ou pós-graduação de, no mínimo, 360 horas, mestrado ou doutorado em área de Tecnologia da Informação fornecido por instituição reconhecida pelo Ministério da Educação para &lt;/span&gt;&lt;span&gt;Capacitação de técnicos/servidores da FUNAI, para operação e administração do banco de dados PostgreSQL, banco de dados utilizado para armazenar toda a estrutura de dados&amp;nbsp;projetada no desenvolvimento do Sistema&amp;nbsp;Indigenista de Informações - sistema esse que monitora a implantação dos Planos de Salvaguarda da FUNAI&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span&gt;Os interessados deverão enviar o CV do dia 16/maio/2011 até às 23h 59 do dia 23/maio/2011 para o endereço &lt;b&gt;&lt;a href=&quot;mailto:unescobra4008@gmail.com&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;unescobra4008@gmail.com&lt;/a&gt;&lt;/b&gt;, no formato Word, Open Office ou PDF , indicando o número do edital e o nome do perfil em que se candidata. Serão desconsiderados os CVs remetidos após a data limite indicada neste edital. Para mais informações, consultar o edital completo que será publicado nos sites &lt;b&gt;&lt;a href=&quot;http://www.funai.gov.br/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;www.funai.gov.br&lt;/a&gt;&lt;/b&gt; e &lt;b&gt;&lt;a href=&quot;http://www.unesco.org.br/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;www.unesco.org.br&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;strong&gt;&lt;span&gt;Acesso ao Edital&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;: 914BRA4008 Edital 002/2011, Anexo II (modelo padrão currículo). &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span&gt;Em atenção às disposições do Decreto nº 5.151, de 22 de julho de 2004 é vedada a contratação, a qualquer título, de servidores ativos da Administração Pública Federal, Estadual, do Distrito Federal ou Municipal, direta ou indireta, bem como de empregados de suas subsidiárias e controladas, no âmbito dos projetos de cooperação técnica internacional.&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span&gt;Estas contratações serão efetuadas mediante processo seletivo simplificado (análise de currículo e entrevista), a ser realizado com no mínimo 03 (três) candidatos, por vaga, com currículos válidos e maior pontuação, sendo exigida, destes profissionais, a comprovação da habilitação profissional e da capacidade técnica ou científica compatível com os trabalhos a serem executados. &lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span&gt;De acordo com a Portaria nº 717, de 09/12/2006, é vedada a contratação de consultor que já esteja cumprindo contrato de consultoria por produto vinculado a projeto de cooperação técnica internacional.&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;Data de Publicação do Edital: 16/05/2011&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3371915898459901668-2511484191727932454?l=postgresqlbr.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2011-05-19T09:45:37+00:00</dc:date>
	<dc:creator>cbleopoldino</dc:creator>
</item>
<item rdf:about="tag:blogger.com,1999:blog-3371915898459901668.post-4601113007530330001">
	<title>Claudio Bezerra Leopoldino: Squirrel Client: Suas Conexões em um Único Lugar!</title>
	<link>http://postgresqlbr.blogspot.com/2011/05/squirrel-client-suas-conexoes-em-um.html</link>
	<content:encoded>Conexões são muito importantes e temos de gerenciá-las. Quando temos conexões para vários bancos de dados distintos em múltiplos servidores e ambientes de desenvolvimento, produção e homologação, esta gestão pode se tornar complicada. O &lt;i&gt;&lt;a href=&quot;http://squirrel-sql.sourceforge.net/&quot;&gt;Squirrel Client&lt;/a&gt;&lt;/i&gt; é uma boa ferramenta que permite a gestão das conexões, a visualização e a manipulação de dados do PostgreSQL e da maioria dos bancos de dados livres e proprietários, unificando em um ponto esta função. (eles só não têm um logotipo decente, então ilustrei com esse que encontrei na internet)&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-Jb0ROWzkT_s/TdFVs5laarI/AAAAAAAAAM0/fWje_HjqZco/s1600/esquilo.jpeg&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-Jb0ROWzkT_s/TdFVs5laarI/AAAAAAAAAM0/fWje_HjqZco/s1600/esquilo.jpeg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;A instalação é bem fácil e se desejar baixar e executar direto do arquivo JAR ou do script .SH sem precisar instalar a ferramenta, não há segredos (é o que eu faço no cotidiano). No windows pode ser acionado pelo arquivo .BAT.&lt;br /&gt;&lt;br /&gt;Para utilizar o &lt;i&gt;Squirrel Client&lt;/i&gt;, basta baixar a ferramenta e o driver do banco de dados que se deseja acessar. A lista de bancos suportados pela ferramenta é muito vasta, e as configurações a serem feitas não são sofisticadas:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Primeiro passo: Configurar driver&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;No caso do PostgreSQL, o driver pode ser &lt;a href=&quot;http://www.postgresql.org/docs/current/static/external-interfaces.html&quot;&gt;baixado facilmente&lt;/a&gt;. Neste exemplo foi utilizado um driver jdbc, copiado para a pasta lib do &lt;i&gt;squirrel client&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Selecione a aba &quot;Drivers&quot; à esquerda da tela. Informe a string de conexão, dê uma descrição para o driver e confirme.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&lt;a href=&quot;http://2.bp.blogspot.com/-JFscqdndnsE/TdFZ5pVVllI/AAAAAAAAANE/Lb2bZ7rtV-c/s1600/Captura_de_tela.png&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;200&quot; src=&quot;http://2.bp.blogspot.com/-JFscqdndnsE/TdFZ5pVVllI/AAAAAAAAANE/Lb2bZ7rtV-c/s320/Captura_de_tela.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Segundo passo: Configurar conexão&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Uma vez que um&amp;nbsp; driver pode ser utilizado em várias conexões, deve-se configurar a conexão que utiliza o driver.&lt;br /&gt;&lt;br /&gt;Acione a aba&quot;Aliases&quot; e clique no ícone &quot;+&quot; para criar uma nova conexão. Informe o nome, o driver que você criou, a string de conexão, usuário e senha, conforme a figura e confirme.&lt;br /&gt;&lt;br /&gt;Para conectar, clique no primeiro ícone da aba &quot;Aliases&quot;.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-0eVb_8Bw884/TdFZ4wq_rxI/AAAAAAAAANA/GcT45HErxic/s1600/tela+2+-+ALIASES+POSTGRESQL.png&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;200&quot; src=&quot;http://2.bp.blogspot.com/-0eVb_8Bw884/TdFZ4wq_rxI/AAAAAAAAANA/GcT45HErxic/s320/tela+2+-+ALIASES+POSTGRESQL.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Visualizando o banco de dados&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;A conexão faz com que sejam mostradas duas abas: &quot;Objects&quot; e &quot;SQL&quot;.&amp;nbsp; A aba &quot;Objects&quot; permite a visualização do banco de dados através de uma treeview e de várias abas internas que são dinamicamente preenchidas à medida em que um objeto do banco de dados é selecionado.&lt;br /&gt;&lt;br /&gt;A interface é bem detalhada e são apresentadas informações detalhadas a respeito dos metadados que não são comumente mostradas em outras ferramentas similares como permissões de acesso de tabelas e colunas.&lt;br /&gt;&lt;br /&gt;Observe que as informações só serão 100% confiáveis se a coleta de estatísticas do banco de dados estiver atualizada.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-5LWgWghSynI/TdFZ4J69nRI/AAAAAAAAAM8/aNJp_kv_MvI/s1600/SQuirreL+SQL+Client+Version+3.2.1+-+Execu%25C3%25A7%25C3%25A3o+de+SQL.png&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;http://4.bp.blogspot.com/-5LWgWghSynI/TdFZ4J69nRI/AAAAAAAAAM8/aNJp_kv_MvI/s320/SQuirreL+SQL+Client+Version+3.2.1+-+Execu%25C3%25A7%25C3%25A3o+de+SQL.png&quot; width=&quot;279&quot; /&gt;&lt;/a&gt; &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Trabalhando com o banco de dados&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;A aba SQL permite a realização de consultas e a criação, salvamento e recuperação de scripts sql.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Funções como &lt;i&gt;auto correct/ abreviations&lt;/i&gt; e &lt;i&gt;bookmarks&lt;/i&gt; podem aumentar a produtividade do usuário.&lt;br /&gt;&lt;br /&gt;A execução simultânea de várias conexões é muito útil para evitar a abertura de vários visualizadores em ferramentas distintas.&lt;br /&gt;&lt;br /&gt;É possível &lt;b&gt;criar um ou mais diagramas&lt;/b&gt; utilizando o botão direito do mouse sobre as tabelas e selecionando a opção &quot;add to a graph&quot;, um bônus muito interessante, pois mostra os relacionamentos e permite imprimir de várias formas!&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-nfVZNFkPjdg/TdFZ3VPXLQI/AAAAAAAAAM4/nZJmDQaMDLs/s1600/SQuirreL+SQL+Client+Version+3.2.1+-+Conexao+OK.png&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;http://1.bp.blogspot.com/-nfVZNFkPjdg/TdFZ3VPXLQI/AAAAAAAAAM4/nZJmDQaMDLs/s320/SQuirreL+SQL+Client+Version+3.2.1+-+Conexao+OK.png&quot; width=&quot;279&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Limitações&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Por ser uma ferramenta de acesso a dados, não apresenta recursos de design mais avançados para a opção de elaboração de diagramas, que gera diagramas através do esquema SQL, mas não gera esquema SQL com base no diagrama. No entanto isso não chega a ser um limitador, apenas não é o propósito da ferramenta.&lt;br /&gt;&lt;br /&gt;O suporte a Hibernate não foi testado neste post, mas parece ser uma das &lt;i&gt;features&lt;/i&gt; mais interessantes para os usuários deste framework.&lt;br /&gt;&lt;br /&gt;A única restrição que encontrei foi o fato do sistema não apresentar o plano de execução das consultas que utilizei no teste (não testei outros bancos além do Postgresql). Possivelmente as novas versões supram esta necessidade futuramente. &lt;br /&gt;&lt;br /&gt;O &lt;i&gt;squirrel client&lt;/i&gt; se mostra adequado para manter e centralizar conexões a múltiplos bancos de dados, visualizar seus metadados e realizar operações no banco que demandem SQL. &lt;a href=&quot;http://www.squirrelsql.org/index.php?page=screenshots&quot;&gt;Veja os screenshots&lt;/a&gt;, baixe, instale e teste!&lt;div class=&quot;blogger-post-footer&quot;&gt;Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3371915898459901668-4601113007530330001?l=postgresqlbr.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2011-05-16T15:02:02+00:00</dc:date>
	<dc:creator>cbleopoldino</dc:creator>
</item>

</rdf:RDF>

