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

<channel>
	<title>SAVEPOINT &#187; Informática</title>
	<atom:link href="http://www.midstorm.org/~telles/category/informatica/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.midstorm.org/~telles</link>
	<description>Ideas not commited yet!</description>
	<lastBuildDate>Tue, 20 Dec 2011 02:17:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>3 regras do DBA</title>
		<link>http://www.midstorm.org/~telles/2011/12/19/3-regras-do-dba/</link>
		<comments>http://www.midstorm.org/~telles/2011/12/19/3-regras-do-dba/#comments</comments>
		<pubDate>Tue, 20 Dec 2011 02:06:20 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=826</guid>
		<description><![CDATA[Esse eu estou copiando do Database Cast sobre Disaster e Recovery (recomendo ouvir o episódio).  Bom, ei-las: 1ª O DBA deve educar o usuário. O DBA sempre diz o jeito certo de fazer as coisas. 2ª Meta medo no cara. &#8230; <a href="http://www.midstorm.org/~telles/2011/12/19/3-regras-do-dba/">Continuar lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Esse eu estou copiando do <a href="http://imasters.com.br/artigo/22531/banco-de-dados/databasecast-16-disaster-e-recovery">Database Cast sobre Disaster e Recovery</a> (recomendo ouvir o episódio).  Bom, ei-las:</p>
<ul>
<li>1ª O DBA deve educar o usuário. O DBA sempre diz o jeito certo de fazer as coisas.</li>
<li>2ª Meta medo no cara. Coisas ruins vão acontecer se ele não ouvir o DBA deles.</li>
<li>3ª Crie descontentamento. Se eles se recusarem a ouvir as 2 primeiras regras ferra eles, deixa o banco cair.</li>
</ul>
<p>OBS: em alguns casos, se o cara for muito chato, é OK pular direto para a 3ª regra.</p>
<p>&nbsp;</p>
<h2>Outra pérola no mesmo programa:</h2>
<ul>
<li>Qual DR é pior de madrugada?</li>
</ul>
<p>&#8220;Discutir a relação&#8221; com a patrôa ou &#8221;Disaster Recovery&#8221; ?</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2011/12/19/3-regras-do-dba/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Postgres, PGBR2011, Timbira e o universo.</title>
		<link>http://www.midstorm.org/~telles/2011/12/02/postgres-pgbr2011-timbira-e-o-universo/</link>
		<comments>http://www.midstorm.org/~telles/2011/12/02/postgres-pgbr2011-timbira-e-o-universo/#comments</comments>
		<pubDate>Fri, 02 Dec 2011 11:51:54 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[pgbr2011]]></category>
		<category><![CDATA[postgres]]></category>
		<category><![CDATA[Timbira]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=819</guid>
		<description><![CDATA[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 boa provocação do Fernando Ike. Ok, o &#8230; <a href="http://www.midstorm.org/~telles/2011/12/02/postgres-pgbr2011-timbira-e-o-universo/">Continuar lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>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 <a href="http://www.midstorm.org/~fike/weblog/2011/11/10/parabens-excelente-pgbr-2011/">boa provocação</a> 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&#8230;.</p>
<p>O #PGBR2011 foi um marco para mim. Morreu aquele jeito moleque de juntar a turma e ficou claro que a &#8220;pegada&#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).</p>
<p>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 <a href="http://www.timbira.com.br/timbira">Timbira</a>, 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 <strong>só</strong> 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 &#8220;Prêmio PGBR2011&#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.</p>
<p>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 &#8220;aparelhar&#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&#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.</p>
<p>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 &#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 &#8220;reinado&#8221;, como o centro do universo que muito DBA acha que é&#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.</p>
<p>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 <a href="http://pgbr.postgresql.org.br/2011/palestras.php?id=66">VMware</a> 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&#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 <a href="http://pt.wikipedia.org/wiki/Software_como_servi%C3%A7o">SaaS</a>, é notavel que as coisas estão mudando. E olha só, a Locaweb estava lá no evento&#8230;</p>
<p>É 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&#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.</p>
<p>Bom, agora tem um monte de coisas para fazer aqui, até a próxima cervejada pessoal!</p>
<p><strong>OBS</strong>: Antes que alguém pergunte&#8230; o <a href="http://pt.wikipedia.org/wiki/Timbira_(povos)">nome Timbira</a> foi escolhido pelo Euler que tem um <a href="http://www.timbira.com/">blog</a> com esse nome bem antes da &#8220;Empresa Timbira nascer&#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 &#8220;Empresa Brasileira de Postgres&#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 <a href="http://planeta.postgresql.org.br/">planeta</a> tupiniquim, <img src='http://www.midstorm.org/~telles/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  . De toda forma, quanto mais masterfucking é o cliente, mais legal é ver a Timbira entrando lá de verde e amarelo&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2011/12/02/postgres-pgbr2011-timbira-e-o-universo/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PGBR2011 &#8211; DONE</title>
		<link>http://www.midstorm.org/~telles/2011/11/08/pgbr2011-done/</link>
		<comments>http://www.midstorm.org/~telles/2011/11/08/pgbr2011-done/#comments</comments>
		<pubDate>Tue, 08 Nov 2011 13:09:37 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[PostgreSQL]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=816</guid>
		<description><![CDATA[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 &#8230; <a href="http://www.midstorm.org/~telles/2011/11/08/pgbr2011-done/">Continuar lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>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.</p>
<p>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 &#8220;<a href="http://www.flickr.com/photos/tellesr/6322484113/in/pool-1655373@N21/">foto do Bozo</a>&#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.</p>
<p>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. <a href="http://pyrseas.wordpress.com/2011/10/31/postgresql-conference-brasil-2011/">Joe Abbate</a> 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.</p>
<p>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).</p>
<p>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.</p>
<p>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.</p>
<p>Então vejamos alguns números:</p>
<ul>
<li>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 <a href="http://www.spi-inc.org/">SPI</a>.</li>
<li>Mais de 240 pessoas inscritas no evento;</li>
<li>Mais de 50 propostas de palestras na chamada de trabalhos e um total de 32 palestrantes presentes, fora os Lightning Talks.</li>
<li>400 ecobags, 200 chaveiros, 100 squeezes, 100 camisetas, 60 elefantes de pelúcia, 5 banners, 1000 cartazes, 1000 adesivos pequenos e 100 adesivos normais.</li>
<li>200 litros de chopp e inúmeras histórias para contar.</li>
</ul>
<div>É, não tem preço mesmo.</div>
<div>Foi muito bom ver todos vocês novamente, eu realmente estava com saudades do pessoal. Até a próxima gente. <img src='http://www.midstorm.org/~telles/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </div>
<div>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.</div>
]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2011/11/08/pgbr2011-done/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>#PGBR2011 &#8211; Tudo ao mesmo tempo agora</title>
		<link>http://www.midstorm.org/~telles/2011/10/06/pgbr2011-tudo-ao-mesmo-tempo-agora/</link>
		<comments>http://www.midstorm.org/~telles/2011/10/06/pgbr2011-tudo-ao-mesmo-tempo-agora/#comments</comments>
		<pubDate>Thu, 06 Oct 2011 12:13:15 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[pgbr2011]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=809</guid>
		<description><![CDATA[Zilhões de coisas rolando ao mesmo tempo: Saiu a lista dos palestrantes do PGBR2011. A grade ainda estamos montando. Sim, uma palestra minha foi aprovada (não, eu não faço parte da banca avaliadora), vou falar sobre processos de melhoria de &#8230; <a href="http://www.midstorm.org/~telles/2011/10/06/pgbr2011-tudo-ao-mesmo-tempo-agora/">Continuar lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Zilhões de coisas rolando ao mesmo tempo:</p>
<ul>
<li>Saiu a lista dos palestrantes do PGBR2011. A grade ainda estamos montando.</li>
<li>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: &#8220;Fazendo uma manada passar debaixo da porta&#8221;</li>
<li>O link onde o site do PGBR está hospedado está com problemas sérios no link. Esperamos que isto esteja normalizado em breve.</li>
<li>Foi publicada a minha participação no #DatabaseCast sobre PostgreSQL, no Imasters.</li>
<li>Estamos mandando bala no material promocional. Tirando a sacola, tudo será vendido praticamente a preço de custo. Até agora serão:</li>
<ul>
<li> 400 ecobags para o material do evento;</li>
<li>100 squeezes em alumínio;</li>
<li>100 elefantes de pelúcia;</li>
<li>100 camisetas pólo;</li>
<li>200 chaveiros;</li>
<li>1000 adesivos;</li>
</ul>
<li>Um mês antes do evento ocorrer, temos 120 inscritos. Sim, brasileiro deixa tudo para a última hora&#8230; então devemos ter um número bem superior até lá.</li>
<li>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.</li>
</ul>
<div>Bom, muita coisa ao mesmo tempo&#8230; não dá para falar tudo que eu gostaria, mas o mais importante de tudo:</div>
<h2>O chopp está garantido no final do evento!!!</h2>
<p>(ok, vai ter refrigerante também&#8230; mas não consegui achar o Guaraná Jesus por aqui)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2011/10/06/pgbr2011-tudo-ao-mesmo-tempo-agora/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Sprint criativo</title>
		<link>http://www.midstorm.org/~telles/2011/10/01/sprint-criativo/</link>
		<comments>http://www.midstorm.org/~telles/2011/10/01/sprint-criativo/#comments</comments>
		<pubDate>Sun, 02 Oct 2011 00:23:42 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[Delírios, viagens e alucinações]]></category>
		<category><![CDATA[Informática]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=802</guid>
		<description><![CDATA[Sugestão que pode revolucionar a &#8220;indústria do software&#8221;: Pegue uma grande fábrica de software, tipo CMMI 5. Convoque todos os desenvolvedores para uma longa e tediosa reunião, sem direito a comida. Lá pelas tantas, libere uma generosa porção de space &#8230; <a href="http://www.midstorm.org/~telles/2011/10/01/sprint-criativo/">Continuar lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Sugestão que pode revolucionar a &#8220;indústria do software&#8221;:</p>
<p>Pegue uma grande fábrica de software, tipo <a href="http://pt.wikipedia.org/wiki/CMMI">CMMI</a> 5. Convoque todos os desenvolvedores para uma longa e tediosa reunião, sem direito a comida. Lá pelas tantas, libere uma generosa porção de <a href="http://en.wikipedia.org/wiki/Cannabis_foods">space cake</a> para todo mundo e veja o que acontece. Vai que a empresa começa a ter um surto criativo&#8230;.</p>
<p>Na dúvida, é melhor tirar um backup de algumas coisas e cortar o acesso aos servidores de produção por um tempo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2011/10/01/sprint-criativo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PGBR2011 &#8211; Inscrições abertas!</title>
		<link>http://www.midstorm.org/~telles/2011/09/03/pgbr2011-inscricoes-abertas/</link>
		<comments>http://www.midstorm.org/~telles/2011/09/03/pgbr2011-inscricoes-abertas/#comments</comments>
		<pubDate>Sat, 03 Sep 2011 13:00:39 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[pgbr2011]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=795</guid>
		<description><![CDATA[Este ano tudo será diferente&#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 &#8230; <a href="http://www.midstorm.org/~telles/2011/09/03/pgbr2011-inscricoes-abertas/">Continuar lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a title="PGBR2011 - Inscrições abertas!" href="http://pgbr.postgresql.org.br/"><img class="aligncenter" style="border-style: initial; border-color: initial; border-width: 0px;" title="PGBR2011 - Inscrições abertas" src="http://pgbr.postgresql.org.br/2011/imgs/divulgue_inscricoes.png" alt="" width="168" height="80" /></a></p>
<p>Este ano tudo será diferente&#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&#8230;. se a gente faz isso ninguém vai no evento, <img src='http://www.midstorm.org/~telles/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> </p>
<p>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 &#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.</p>
<p>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 <a href="http://softwarelivre.org/asl">ASL</a> (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 <a href="http://www.comprasnet.gov.br/">SICAF</a>. 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&#8230; e os nossos fornecedores não trabalham assim.</p>
<p>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.</p>
<p>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 <em>confirmados</em> 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 <em>confirmar</em> (a.k.a. <em>pagar</em>) suas inscrições.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2011/09/03/pgbr2011-inscricoes-abertas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>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>
		<comments>http://www.midstorm.org/~telles/2011/08/15/pgday-rs-no-dia-19-de-agosto-de-2011/#comments</comments>
		<pubDate>Mon, 15 Aug 2011 11:26:35 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[PostgreSQL]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=791</guid>
		<description><![CDATA[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. Os palestrantes, a programação e o local estão todos publicados no site do evento. Infelizmente &#8230; <a href="http://www.midstorm.org/~telles/2011/08/15/pgday-rs-no-dia-19-de-agosto-de-2011/">Continuar lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>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.</p>
<p>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.</p>
<p>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.</p>
<p>Não esqueçam de mandarem as fotos, publicarem as palestas, ok?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2011/08/15/pgday-rs-no-dia-19-de-agosto-de-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PGBR2011 &#8211; Chamada de trabalhos</title>
		<link>http://www.midstorm.org/~telles/2011/08/14/pgbr2011-chamada-de-trabalhos/</link>
		<comments>http://www.midstorm.org/~telles/2011/08/14/pgbr2011-chamada-de-trabalhos/#comments</comments>
		<pubDate>Sun, 14 Aug 2011 03:21:53 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[pgbr2011]]></category>
		<category><![CDATA[postgres]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=784</guid>
		<description><![CDATA[Nesta semana foi aberta a Chamada de Trabalhos do PGBR2011. 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 &#8230; <a href="http://www.midstorm.org/~telles/2011/08/14/pgbr2011-chamada-de-trabalhos/">Continuar lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h2>Nesta semana foi aberta a <a href="http://pgbr.postgresql.org.br/2011/chamada.php">Chamada de Trabalhos</a> do <a href="http://pgbr.postgresql.org.br/">PGBR2011</a>.</h2>
<p>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.</p>
<p>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:</p>
<ul>
<li>
<h4><em>Postgressssss</em>, lendas urbanas sobre PostgreSQL e um apanhado da sua evolução nas últimas versões;</h4>
</li>
<li>
<h4>Casos de sucesso de quem não tem vergonha de revelar que usa o PostgreSQL em negócios críticos;</h4>
</li>
<li>
<h4>Porquê o PostgreSQL é cada vez mais amante predileta dos DBAs experientes;</h4>
</li>
<li>
<h4>&#8220;<a href="http://agajorte.blogspot.com/2009/03/meu-postgresql-nao-conecta.html">Meu PostgreSQL não Conecta</a>&#8221; e outras coisas que alguém tem de escrever para a gente não repetir novamente na lista&#8230;</h4>
</li>
<li>
<h4>Ops, minha base já tem mais de 1TB&#8230; ;</h4>
</li>
<li>
<h4>BI, Data Mining, OLAP, PL/R e outros bichos;</h4>
</li>
<li>
<h4><a href="http://www.postgresql.org/docs/9.1/static/textsearch.html">Full Text Search</a>, particularmente como raios se montam Ranks e dicionários personalizados;</h4>
</li>
<li>
<h4>Funções de agregação personalizadas, operadores personalizados, tipos de dados personalizados e o que mais você tiver coragem de inventar;</h4>
</li>
<li>
<h4>Bancos de dados em pesquisas científicas, como em biologia, física e outras ciências ocultas;</h4>
</li>
<li>
<h4>Haks, muitos hacks! Queremos hacks em C, em Perl, Python, SPI, PL/pgSQL etc. Queremos nerds genuínos!!!</h4>
</li>
<li>
<h4>Vou te apresentar a uma tal de libpq&#8230;</h4>
</li>
<li>
<h4>Tuning em bases OLTP  com fucking hight concorrência;</h4>
</li>
<li>
<h4>ETL (Extract Transform Load) em ambientes alucinógenos;</h4>
</li>
<li>
<h4>pgbench e outras técnicas para emular a carga da aplicação em ambiente de homologação ou &#8220;hum&#8230;. então dá para fazer isso antes de sentar a aplicação no cliente?&#8221;</h4>
</li>
<li>
<h4>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;</h4>
</li>
<li>
<h4>Segurem os trolls, vamos falar sobre sistemas de arquivos, tablespaces e discos de novo&#8230;.</h4>
</li>
<li>
<h4>Como fazer poesia com SQL e parar de fazer caquinha com PL/você_não_precisa_usar_isto_aqui.</h4>
</li>
<li>
<h4>Técnicas (ok, se você gosta de buzzwords, pode chamar de &#8220;design patterns&#8221;) de otimização de processos e ajuste de SQL;</h4>
</li>
<li>
<h4>&#8220;Rodei o <a href="http://www.postgresql.org/docs/9.1/static/sql-explain.html">EXPLAIN</a>, e agora?&#8221;;</h4>
</li>
<li>
<h4>Magia negra com <a href="http://www.postgresql.org/docs/9.1/static/queries-table-expressions.html#QUERIES-WINDOW">Window Function</a>;</h4>
</li>
<li>
<h4><a href="http://www.postgresql.org/docs/9.1/static/queries-with.html">CTE</a>, recursividade e como não destruir a memória do seu servidor;</h4>
</li>
<li>
<h4><a href="http://www.postgresql.org/docs/9.1/static/charset.html">Localização, codificação de caracteres</a> e coisas que infelizmente você tem de aprender se não quiser sofrer por toda a eternamente com isso;</h4>
</li>
<li>
<h4>Segurança para preguiçosos (ou seja, para todo mundo);</h4>
</li>
<li>
<h4>Técnicas de monitoramento, administração que funcionam e fazem sentido para seres mortais;</h4>
</li>
<li>
<h4>Armadilhas no<a href="http://www.postgresql.org/docs/9.1/static/different-replication-solutions.html"> zoológico das replicações</a>;</h4>
</li>
<li>
<h4>Muito além das configurações do <a href="http://www.postgresql.org/docs/9.1/static/runtime-config.html">postgresql.conf</a>: personalizando bases, roles , tabelas, tablespaces e até sessões para um ajuste perfeito;</h4>
</li>
<li>
<h4>Eu sei, eu sei&#8230;. <a href="http://pt.wikipedia.org/wiki/ACID">ACID</a>, blá, blá, blá, <a href="http://en.wikipedia.org/wiki/Relational_model">Teoria Relacional</a>, etc e tal, mas o <a href="http://en.wikipedia.org/wiki/Christopher_J._Date">C. J. Date</a> diz que bi, bi, bi, bó, bó, bó&#8230;. mas eu quero muito ver &#8220;Técnicas de <a href="http://pt.wikipedia.org/wiki/NoSQL">NoSQL</a> integradas com PosgreSQL&#8221;;</h4>
</li>
<li>
<h4><a href="http://www.postgresql.org/docs/9.1/static/backup.html">Backup</a> e o &#8220;complexo de Chuck Norris&#8221;. (Quem respondeu a <a href="http://www.postgresql.org.br/node/7460">pesquisa sobre uso de PostgreSQL</a> sabe do que eu estou falando);</h4>
</li>
<li>
<h4>Técnicas de recuperação de desastres e como é chato ouvir &#8220;mas eu já faço assim há 5 anos e nunca deu nenhum problema&#8230;&#8221;;</h4>
</li>
<li>
<h4>Não entendeu? Vou falar de novo: RECOVER, RECOVER, RECOVER!</h4>
</li>
<li>
<h4>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?</h4>
</li>
</ul>
<p>OBS: Quem sabe este ano o indefectível Osvaldo Kussama não manda uma proposta?</p>
<p>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&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2011/08/14/pgbr2011-chamada-de-trabalhos/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Clonando bases no ORACLE RAC 10G</title>
		<link>http://www.midstorm.org/~telles/2011/06/02/clonando-bases-no-oracle-rac-10g/</link>
		<comments>http://www.midstorm.org/~telles/2011/06/02/clonando-bases-no-oracle-rac-10g/#comments</comments>
		<pubDate>Thu, 02 Jun 2011 19:04:14 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[clone]]></category>
		<category><![CDATA[duplicate]]></category>
		<category><![CDATA[rman]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=743</guid>
		<description><![CDATA[Eu sempre fui fã do backup feito na mão. Gosto de ter controle do processo, adaptar um script para demandas específicas etc e tal. Mas quando utilizamos o Oracle RAC, em geral estamos utilizando o ASM e neste caso, a unica forma &#8230; <a href="http://www.midstorm.org/~telles/2011/06/02/clonando-bases-no-oracle-rac-10g/">Continuar lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Eu sempre fui fã do backup feito na mão. Gosto de ter controle do processo, adaptar um script para demandas específicas etc e tal. Mas quando utilizamos o Oracle RAC, em geral estamos utilizando o ASM e neste caso, a unica forma de se fazer backup físico é pelo RMAN.</p>
<p>Clonar uma base guardada em file system é simples. Você copia os datafiles, gera um controlfile, edita ele, faz um PITR e pronto. Mas com ASM você não pode fazer isso. Você vai ter de utilizar o nosso amigo DUPLICATE.</p>
<p>Bom eu queria escrever algo detalhado, explicando cada passo, mas a preguiça me impediu. Então vamos apenas mostrar o cenário do exemplo e mandar bala logo:</p>
<ul>
<li>Oracle RAC 10.2.0.5 com 2 nós.</li>
<li>A base a ser clonada é a &#8216;producao&#8217; com as instâncias &#8216;producao1&#8242; e &#8216;producao2&#8242;</li>
<li>A base que vai ser atualizada/criada com os dados da&#8217;producao&#8217; é a base&#8217;teste&#8217; cin as instâncias &#8216;teste1&#8242; e &#8216;teste2&#8242;.</li>
<li>As duas bases tem suas instâncias nos dois servidores, ora1 e ora2 utilizando um SO UNIX like.</li>
<li>A base &#8216;produção&#8217; está utilizando o diskgroup ASMGRP01 e ASMGRP02.</li>
<li>A base &#8216;teste&#8217; utiliza apenas o diskgroup ASMGRP03</li>
<li>Estou supondo que a base &#8216;teste&#8217; já existe, e vai ser atualizada. Se a base não existir, o processo muda. Você não precisa apagar a base antes, mas precisa criar o init e os diretórios nos nós. Não vou abordar estes detalhes aqui.</li>
</ul>
<h2>Preparação</h2>
<h3>Passo1 - Verificar em quais diskgroups os arquivos da base teste estão</h3>

<div class="wp_syntax"><div class="code"><pre class="oracle11" style="font-family:monospace;">export ORACLE_SID<span style="color: #66cc66;">=</span>teste
sqlplus <span style="color: #ff0000;">&quot;/ as sysdba&quot;</span>
<span style="color: #993333; font-weight: bold; text-transform: uppercase;">SELECT</span> name <span style="color: #993333; font-weight: bold; text-transform: uppercase;">FROM</span> v$datafile;
<span style="color: #993333; font-weight: bold; text-transform: uppercase;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">FROM</span> v$logfile;
<span style="color: #993333; font-weight: bold; text-transform: uppercase;">SELECT</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">VALUE</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">FROM</span> v$parameter
  <span style="color: #993333; font-weight: bold; text-transform: uppercase;">WHERE</span> name <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'control_files'</span>;
<span style="color: #993333; font-weight: bold; text-transform: uppercase;">EXIT</span></pre></div></div>

<h3>Passo2 - baixar a base no RAC</h3>
<pre>srvctl stop database -d teste</pre>
<h3><strong>Passo3</strong> &#8211; Apagar a base no ASM</h3>
<p>Tome cuidado aqui. Vamos excluir os arquivos dos  diskgroups observados no passo 1.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">ORACLE_SID</span>=+ASM
asmcmd
<span style="color: #7a0874; font-weight: bold;">cd</span> asmgrp03
<span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #660033;">-r</span> teste
<span style="color: #7a0874; font-weight: bold;">exit</span></pre></div></div>

<h3>Passo 4 &#8211; Editar init</h3>
<p>Aqui não estou utilizando SPFILE, pois o 10g tem um bug que ocorre com o SPFILE durante o duplicate no 10g)</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #007800;">$ORACLE_HOME</span><span style="color: #000000; font-weight: bold;">/</span>dbs
<span style="color: #c20cb9; font-weight: bold;">vi</span> initteste.ora</pre></div></div>

<ul>
<li>Alterar os seguintes parâmetros :</li>
</ul>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">*</span>.control_files                 = <span style="color: #ff0000;">'+ASMGRP03'</span>
<span style="color: #000000; font-weight: bold;">*</span>.cluster_database              = FALSE</pre></div></div>

<ul>
<li>Verifique o nome do parâmetro UNDO_TABLESPACE. O nome da tablespace deve ser idêntico ao UNDO da produção. No caso deste duplicate, tive de fazer um ajuste, pois o parâmetro do UNDO estava errado no init.</li>
<li>Configure os parâmetros para alterar o diretório de destino. Neste caso, vamos mandar os datafiles e REDO dos diskgroups ASMGRP01 e ASMGRP02 todos para ASMGRP03:</li>
</ul>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">db_file_name_convert   =
    <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">'+ASMGRP01/producao'</span>,<span style="color: #ff0000;">'+ASMGRP03/teste'</span>,
     <span style="color: #ff0000;">'+ASMGRP02/producao'</span>,<span style="color: #ff0000;">'+ASMGRP03/teste'</span>,
     <span style="color: #ff0000;">'+ASMGRP03/producao'</span>,<span style="color: #ff0000;">'+ASMGRP03/teste'</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
log_file_name_convert  =
    <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">'+ASMGRP01/producao'</span>,<span style="color: #ff0000;">'+ASMGRP03/teste'</span>,
     <span style="color: #ff0000;">'+ASMGRP02/producao'</span>,<span style="color: #ff0000;">'+ASMGRP03/teste'</span>,
     <span style="color: #ff0000;">'+ASMGRP03/producao'</span>,<span style="color: #ff0000;">'+ASMGRP03/teste'</span><span style="color: #7a0874; font-weight: bold;">&#41;</span></pre></div></div>

<ul>
<li>Configure o parâmetro para evitar um bug durante o RESETLOGS do DUPLICATE:</li>
</ul>
<pre>_no_recovery_through_resetlogs=TRUE</pre>
<h3>Passo 5 &#8211; Fazer o backup em disco da base de produção</h3>
<p>Se já houver um backup recente, pode pular esta etapa. É fundamental que no backup tenha ocorrido um</p>

<div class="wp_syntax"><div class="code"><pre class="oracle11" style="font-family:monospace;"><span style="color: #993333; font-weight: bold; text-transform: uppercase;">SQL</span> ‘<span style="color: #993333; font-weight: bold; text-transform: uppercase;">ALTER</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">SYSTEM</span> archive <span style="color: #993333; font-weight: bold; text-transform: uppercase;">LOG</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">CURRENT</span>’;</pre></div></div>

<p>No caso abaixo o</p>
<pre>backup database plus archivelog</pre>
<p>faz isso implicitamente. Se resolver fazer o backup de outra forma, sembre-se disso.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">ORACLE_SID</span>=producao
rman target <span style="color: #000000; font-weight: bold;">/</span> <span style="color: #cc0000; font-style: italic;">&lt;&lt;EOF
backup database plus archivelog;
exit
EOF</span></pre></div></div>

<h2>Enfim o DUPLICATE</h2>
<h3>Passo 6 - Realizar o DUPLICATE com o nohup</h3>
<p>É importante rodar isto com o nohup para evitar surpresas. Na verdade no próprio backup também é importante. Então eu crio o script:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">ORACLE_SID</span>=teste
rman TARGET sys<span style="color: #000000; font-weight: bold;">/</span>sua_senha<span style="color: #000000; font-weight: bold;">@</span>producao NOCATALOG AUXILIARY sys<span style="color: #000000; font-weight: bold;">/</span>sua_senha <span style="color: #cc0000; font-style: italic;">&lt;&lt;EOF
RUN
{
    ALLOCATE AUXILIARY CHANNEL aux1 DEVICE TYPE DISK;
    DUPLICATE TARGET DATABASE TO teste;
    RELEASE AUXILIARY CHANNEL aux1;
}
EXIT
EOF</span></pre></div></div>

<p>e rodo ele com o comando:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">nohup</span> atualizaTeste.sh</pre></div></div>

<p>Verifique o log do nohup.out e veja se está ok.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">tail</span> <span style="color: #660033;">-f</span> nohup.out</pre></div></div>

<h3>Passo 7 &#8211;  Verificar o controlfile gerado:</h3>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">ORACLE_SID</span>=teste
sqlplus <span style="color: #ff0000;">&quot;/ as sysdba&quot;</span> <span style="color: #cc0000; font-style: italic;">&lt;&lt;EOF
SELECT value
  FROM v$parameter
  WHERE name = 'control_files';
exit
EOF</span></pre></div></div>

<h3>Passo 8 &#8211; Baixar a base</h3>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">ORACLE_SID</span>=teste
sqlplus <span style="color: #ff0000;">&quot;/ as sysdba&quot;</span> <span style="color: #cc0000; font-style: italic;">&lt;&lt;EOF
shutdown immediate
exit
EOF</span></pre></div></div>

<h3>Passo 9 &#8211; Editar novamente o init</h3>
<p>Colocar o parâmetro &#8216;control_files&#8217; com o valor encontrado no passo 7.<br />
Colocar o parâmetro &#8216;cluster_database&#8217; com o valor TRUE.<br />
Copiar o init editado para o nó 2:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">scp</span> initteste01.ora ora2:<span style="color: #007800;">$ORACLE_HOME</span><span style="color: #000000; font-weight: bold;">/</span>dbs<span style="color: #000000; font-weight: bold;">/</span>initteste2.ora</pre></div></div>

<h3>Passo 10 &#8211; Subir a base no modo NOARCHIVE</h3>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">ORACLE_SID</span>=teste
sqlplus <span style="color: #ff0000;">&quot;/ as sysdba&quot;</span> <span style="color: #cc0000; font-style: italic;">&lt;&lt;EOF
startup mount
ALTER database noarchivelog;
ALTER database open;
EOF</span></pre></div></div>

<h2>Habilitando a base no 2º nó</h2>
<p>Se você chegou aqui, parabéns. Eu demorei um tempinho até fazer isso com sucesso pleno. Mas tem um detalhe importante, ao duplicar a base, apenas um nó é duplicado, o outro nó continua inativo.</p>
<h3>Passo 11 &#8211; Verificar o UNDO</h3>
<p>Verifique se o UNDO dos 2 nós estão presentes.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">ORACLE_SID</span>=teste
sqlplus <span style="color: #ff0000;">&quot;/ as sysdba&quot;</span> <span style="color: #cc0000; font-style: italic;">&lt;&lt;EOF
SELECT tablespace_name, status
  FROM dba_tablespaces
  WHERE contents = 'UNDO';
exit
EOF</span></pre></div></div>

<p>Se não estiver, criar para o nó 2</p>
<h3>Passo 12 &#8211; Criar o REDO para o nó 2</h3>
<p>Antes verifique como os logs de REDO estão:</p>

<div class="wp_syntax"><div class="code"><pre class="oracle11" style="font-family:monospace;"><span style="color: #993333; font-weight: bold; text-transform: uppercase;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">FROM</span> v$log; <span style="color: #808080; font-style: italic;">-- olhar o tamanho dos logs</span>
<span style="color: #993333; font-weight: bold; text-transform: uppercase;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">FROM</span> v$logfile; <span style="color: #808080; font-style: italic;">-- olhar o destino e quantidade dos logs;</span></pre></div></div>

<p>Depois crie os logs para a <em>thread</em> 2 segundo as informações encontradas. Neste caso, serão 4 REDOs, de 512M com um membro por grupo utilizando o diskgroup ASMGRP03.</p>

<div class="wp_syntax"><div class="code"><pre class="oracle11" style="font-family:monospace;"><span style="color: #993333; font-weight: bold; text-transform: uppercase;">ALTER</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">DATABASE</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">ADD</span> logfile thread <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'+asmgrp03'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">SIZE</span> 512M;
<span style="color: #993333; font-weight: bold; text-transform: uppercase;">ALTER</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">DATABASE</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">ADD</span> logfile thread <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'+asmgrp03'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">SIZE</span> 512M;
<span style="color: #993333; font-weight: bold; text-transform: uppercase;">ALTER</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">DATABASE</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">ADD</span> logfile thread <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'+asmgrp03'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">SIZE</span> 512M;
<span style="color: #993333; font-weight: bold; text-transform: uppercase;">ALTER</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">DATABASE</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">ADD</span> logfile thread <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'+asmgrp03'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">SIZE</span> 512M;</pre></div></div>

<h3>Passo 13 &#8211; Habilitar o nó 2</h3>
<p>ALTER database enable thread 2;</p>
<h3>Passo 14 &#8211; baixar a base</h3>

<div class="wp_syntax"><div class="code"><pre class="oracle11" style="font-family:monospace;">shutdown <span style="color: #993333; font-weight: bold; text-transform: uppercase;">IMMEDIATE</span></pre></div></div>

<h3>Passo 15 Verificar se a base está cadastrada no cluster</h3>
<p>Como a base em geral está sendo atualizada, este problema não ocorre, pois já deverá estar OK. Mas se você estiver criando uma nova, com certeza vai precisar mexer nisso. De qualquer forma, é sempre bom checar.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #007800;">$CRS_HOME</span><span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>crs_stat</pre></div></div>

<p>Tem de aparecer algo como:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">NAME</span>=ora.teste.db
<span style="color: #007800;">TYPE</span>=application
<span style="color: #007800;">TARGET</span>=OFFLINE
<span style="color: #007800;">STATE</span>=OFFLINE on ora02
&nbsp;
<span style="color: #007800;">NAME</span>=ora.teste.teste1.inst
<span style="color: #007800;">TYPE</span>=application
<span style="color: #007800;">TARGET</span>=OFFLINE
<span style="color: #007800;">STATE</span>=OFFLINE on ora01
&nbsp;
<span style="color: #007800;">NAME</span>=ora.teste.teste2.inst
<span style="color: #007800;">TYPE</span>=application
<span style="color: #007800;">TARGET</span>=OFFLINE
<span style="color: #007800;">STATE</span>=OFFLINE on ora02</pre></div></div>

<p>Se não aparecerem as linhas, cadastrar a base no cluster:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">srvctl add database <span style="color: #660033;">-d</span> teste <span style="color: #660033;">-o</span> <span style="color: #007800;">$ORACLE_HOME</span>
srvctl add instance <span style="color: #660033;">-d</span> teste <span style="color: #660033;">-i</span>  teste1 <span style="color: #660033;">-n</span> ora01
srvctl add instance <span style="color: #660033;">-d</span> teste <span style="color: #660033;">-i</span>  teste2 <span style="color: #660033;">-n</span> ora02</pre></div></div>

<p>Legenda:</p>
<ul>
<li>-d = nome da base</li>
<li>-o = local do $ORACLE_HOME</li>
<li>-I = instância</li>
<li>-n = mome do servidor onde a instância está.</li>
</ul>
<h3>Passo 16 &#8211; Subir a base nos 2 nós pelo cluster</h3>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">srvctl start database <span style="color: #660033;">-d</span> teste</pre></div></div>

<h3>Passo 17 &#8211; Verificar nos 2 nós</h3>
<p>Você pode ignorar alguns erros logo depois do recover, no momento do resetlogs, mas fique atendo a todo o restante.</p>
<p>Na verdade, durante todo o processo é uma boa idéia ir acompanhando o alerta.</p>
<h2>E se a base de testes não está no mesmo servidor, não está em RAC e ASM?</h2>
<p>Bom, aí meu caro, você vai ter que tomar alguns cuidados adicionais:</p>
<div>
<ol>
<li>Você vai rodar o duplicate no servidor onde está a base de testes. Então precisa configurar o tnsnames.ora para a produção neste servidor. Configure para se conectar em um nó apenas.</li>
<li>Você vai ter que tomar mais cuidado ainda no FILE_NAME_CONVERT.</li>
<li>Você vai ter de criar os logs de REDO no próprio comando DUPLICATE.</li>
<li>Você provavelmente vai pegar o backup da fita, então pegue a string de conexão do backup, mas altere o canal (channel em inglês) para auxiliar.</li>
<li>Você vai poder apagar o tablespace UNDO do nó 2 que você não vai precisar.</li>
<li>Você vai ter de tomar um mega cuidado com os archives. Quando o DUPLICATE roda com a produção e testes no mesmo servidor, nós configuramos o archive_dest da base teste igual ao da base de produção e não nos preocupamos mais com isso. Agora estão em servidores diferentes&#8230;</li>
</ol>
</div>
<h3>Exemplo 1</h3>
<p>Ao invés de ficar aqui explicando tudo novamente, vou mostrar 2 exemplos de DUPLICATE de uma base em RAC para uma base de testes sem RAC:</p>

<div class="wp_syntax"><div class="code"><pre class="oracle11" style="font-family:monospace;">rman TARGET sys<span style="color: #66cc66;">/</span>sua_senha@producao NOCATALOG AUXILIARY <span style="color: #66cc66;">/</span> <span style="color: #66cc66;">&lt;&lt;</span>EOF
run <span style="color: #66cc66;">&#123;</span>
allocate auxiliary channel <span style="color: #ff0000;">'dev_0'</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">TYPE</span> <span style="color: #ff0000;">'sbt_tape'</span>
parms <span style="color: #ff0000;">'SBT_LIBRARY=/opt/omni/lib/libob2oracle8_64bit.so,
    ENV=(OB2BARTYPE=Oracle8,
    OB2APPNAME=producao01,
    OB2BARLIST=PRODUCAO_DIARIO)'</span>;
send device <span style="color: #993333; font-weight: bold; text-transform: uppercase;">TYPE</span> <span style="color: #ff0000;">'sbt_tape'</span> <span style="color: #ff0000;">'OB2BARHOSTNAME=ora1'</span>;
     DUPLICATE TARGET <span style="color: #993333; font-weight: bold; text-transform: uppercase;">DATABASE</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">TO</span> teste
	UNTIL <span style="color: #993333; font-weight: bold; text-transform: uppercase;">TIME</span> <span style="color: #ff0000;">&quot;TRUNC(SYSDATE) + 3/24 + 40/1440&quot;</span>
        DB_FILE_NAME_CONVERT <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#40;</span>
		<span style="color: #ff0000;">'+ASMGRP01/producao/datafile/'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'/u01/oradata/teste/'</span><span style="color: #66cc66;">,</span>
		<span style="color: #ff0000;">'+ASMGRP01/producao/tempfile/'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'/u01/oradata/teste/'</span><span style="color: #66cc66;">&#41;</span>
        LOGFILE
            <span style="color: #993333; font-weight: bold; text-transform: uppercase;">GROUP</span> <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'/u01/oradata/teste/redo01.log'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">SIZE</span> 128M REUSE<span style="color: #66cc66;">,</span>
            <span style="color: #993333; font-weight: bold; text-transform: uppercase;">GROUP</span> <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'/u01/oradata/teste/redo02.log'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">SIZE</span> 128M REUSE<span style="color: #66cc66;">,</span>
            <span style="color: #993333; font-weight: bold; text-transform: uppercase;">GROUP</span> <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'/u01/oradata/teste/redo03.log'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">SIZE</span> 128M REUSE<span style="color: #66cc66;">,</span>
	    <span style="color: #993333; font-weight: bold; text-transform: uppercase;">GROUP</span> <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'/u01/oradata/teste/redo04.log'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">SIZE</span> 128M REUSE;
<span style="color: #993333; font-weight: bold; text-transform: uppercase;">RELEASE</span> auxiliary channel <span style="color: #ff0000;">'dev_0'</span>;
<span style="color: #66cc66;">&#125;</span>
<span style="color: #993333; font-weight: bold; text-transform: uppercase;">EXIT</span>
EOF</pre></div></div>

<p>Algumas observações:</p>
<ul>
<li>Este backup está vindo de uma fita, então estou passando alguns parâmetros específicos para um software de backup, que não vem ao caso aqui. Mas fique atento que sem os dados de um log de backup para fita da sua ferramenta de backup, você não tem como pegar os parâmetros em &#8220;params&#8221; logo no começo;</li>
<li>O parâmetro &#8220;UNTIL TIME&#8221; está ajustado para um horário bem específico, referente à janela de backup da unidade de fitas, e é um horário depois do término do backup normal e antes do horário em que eu rodei um backup dos archives na mão;</li>
<li>Eu coloquei o DB_FILE_NAME_CONVERT aqui no DUPLICATE e não no INIT. Se estiver configurado este parâmetro no init também, vale o do DUPLICATE.</li>
<li>O LOGFILE é um dos segredos do sucesso. Ao invés de configurar o LOG_FILE_NAME_CONVERT, eu digo logo como ele tem de ficar. Me poupa o trabalho de arrumar isso depois.</li>
<li>Você não precisa, mas seria bom remover o tablespace de UNDO do nó 2, que não estará sendo utilizado.</li>
</ul>
<h3>Exemplo 2</h3>
<p>Agora vou mostrar um script que utilizo para uma base D-1. Ou seja, uma base que faz o restore do backup da produção todo dia:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">ORACLE_HOME</span>=<span style="color: #000000; font-weight: bold;">/</span>opt<span style="color: #000000; font-weight: bold;">/</span>app<span style="color: #000000; font-weight: bold;">/</span>oracle<span style="color: #000000; font-weight: bold;">/</span>product<span style="color: #000000; font-weight: bold;">/</span>10.2.0<span style="color: #000000; font-weight: bold;">/</span>db_1
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">PATH</span>=<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>bin:<span style="color: #000000; font-weight: bold;">/</span>bin:<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin:<span style="color: #007800;">$ORACLE_HOME</span><span style="color: #000000; font-weight: bold;">/</span>bin
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">ORACLE_SID</span>=teste
sqlplus <span style="color: #ff0000;">&quot;/ as sysdba&quot;</span> <span style="color: #000000; font-weight: bold;">&amp;</span>lt;<span style="color: #000000; font-weight: bold;">&amp;</span>lt;EOF
shutdown abort
startup nomount
EOF
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #660033;">-fr</span> <span style="color: #000000; font-weight: bold;">/</span>u01<span style="color: #000000; font-weight: bold;">/</span>oradata<span style="color: #000000; font-weight: bold;">/</span>teste<span style="color: #000000; font-weight: bold;">/</span>
&nbsp;
rman TARGET sys<span style="color: #000000; font-weight: bold;">/</span>sua_senha<span style="color: #000000; font-weight: bold;">@</span>producao NOCATALOG AUXILIARY sys<span style="color: #000000; font-weight: bold;">/</span>sua_senha<span style="color: #000000; font-weight: bold;">@</span>teste <span style="color: #cc0000; font-style: italic;">&lt;&lt;EOF
CONFIGURE DEVICE TYPE SBT_TAPE PARALLELISM 1 BACKUP TYPE TO BACKUPSET;
CONFIGURE CHANNEL DEVICE TYPE 'SBT_TAPE' PARMS     
    'ENV=(OB2BARTYPE=Oracle8,
     OB2APPNAME=producao1,
     OB2BARLIST=PRODUCAO FULL)';
CONFIGURE DEFAULT DEVICE TYPE TO 'SBT_TAPE';
RUN
{
     DUPLICATE TARGET DATABASE TO teste
	UNTIL TIME &quot;TRUNC(SYSDATE) + 2/24 + 50/1440&quot;
        OPEN RESTRICTED
        DB_FILE_NAME_CONVERT = (
		'+ASMGRP01/producao/datafile/', '/u01/oradata/teste/',
		'+ASMGRP02/producao/datafile/', '/u01/oradata/teste/',
		'+ASMGRP01/producao/tempfile/', '/u01/oradata/teste/')
        LOGFILE
            GROUP 1 ('/u01/oradata/teste/redo01.log') SIZE 128M REUSE,
            GROUP 2 ('/u01/oradata/teste/redo02.log') SIZE 128M REUSE,
            GROUP 3 ('/u01/oradata/teste/redo03.log') SIZE 128M REUSE,
	    GROUP 4 ('/u01/oradata/teste/redo04.log') SIZE 128M REUSE;
}
EXIT
EOF</span></pre></div></div>

<p>Comentários:</p>
<ul>
<li>Este script é uma forma simplificada de um script que fica agendado no crontab e roda toda noite.</li>
<li>Note que a base abre no modo restrito.</li>
</ul>
<h3> Exemplo 3</h3>
<p>Agora um exemplo diferente, um clone de uma base sem ASM e sem RAC. O backup via RMAN é feito toda a noite para disco e utilizamos este backup para o clone. Só que a base de produção e testes estão em servidores diferentes.</p>
<p>Para isso criei um arquivo no servidor de produção para ajudar em ~/script/copia_backup.sh com:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">find</span> <span style="color: #000000; font-weight: bold;">/</span>u01<span style="color: #000000; font-weight: bold;">/</span>backup<span style="color: #000000; font-weight: bold;">/</span>producao<span style="color: #000000; font-weight: bold;">/</span> <span style="color: #660033;">-name</span> <span style="color: #ff0000;">'backup_db_*'</span> <span style="color: #660033;">-daystart</span> <span style="color: #660033;">-mtime</span> <span style="color: #660033;">-1</span>
 <span style="color: #660033;">-exec</span> rsync <span style="color: #660033;">-av</span>  \<span style="color: #7a0874; font-weight: bold;">&#123;</span>\<span style="color: #7a0874; font-weight: bold;">&#125;</span> 192.168.0.x:<span style="color: #000000; font-weight: bold;">/</span>u01<span style="color: #000000; font-weight: bold;">/</span>backup<span style="color: #000000; font-weight: bold;">/</span>producao  \;</pre></div></div>

<p>Este arquivo serve só para copiar o backup da produção para o servidor de teste.</p>
<p>Agora vamos ao script para a atualização da base:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">ORACLE_SID</span>=teste
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">ORACLE_SID_ORIGEM</span>=producao
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">ORACLE_HOME</span>=<span style="color: #000000; font-weight: bold;">/</span>opt<span style="color: #000000; font-weight: bold;">/</span>app<span style="color: #000000; font-weight: bold;">/</span>oracle<span style="color: #000000; font-weight: bold;">/</span>product<span style="color: #000000; font-weight: bold;">/</span>10.2.0<span style="color: #000000; font-weight: bold;">/</span>db_1
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">PATH</span>=<span style="color: #007800;">$PATH</span>:<span style="color: #007800;">$ORACLE_HOME</span><span style="color: #000000; font-weight: bold;">/</span>bin
&nbsp;
sqlplus <span style="color: #ff0000;">&quot;/ as sysdba&quot;</span> <span style="color: #cc0000; font-style: italic;">&lt;&lt; EOF
shutdown abort
exit 0
EOF</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$?</span> <span style="color: #660033;">-ne</span> <span style="color: #000000;">0</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
  <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot; ERRO: Banco de dados invalido !&quot;</span>
  <span style="color: #7a0874; font-weight: bold;">exit</span>;
<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Limpando a área de backup&quot;</span>
<span style="color: #c20cb9; font-weight: bold;">find</span> <span style="color: #000000; font-weight: bold;">/</span>u01<span style="color: #000000; font-weight: bold;">/</span>backup<span style="color: #000000; font-weight: bold;">/</span><span style="color: #007800;">$ORACLE_SID_ORIGEM</span><span style="color: #000000; font-weight: bold;">/</span> <span style="color: #ff0000;">'backup_db_*'</span> <span style="color: #660033;">-mtime</span> +<span style="color: #000000;">2</span> <span style="color: #660033;">-exec</span> <span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #660033;">-fv</span> \<span style="color: #7a0874; font-weight: bold;">&#123;</span>\<span style="color: #7a0874; font-weight: bold;">&#125;</span> \;
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Limpando a área de archive&quot;</span>
<span style="color: #c20cb9; font-weight: bold;">find</span> <span style="color: #000000; font-weight: bold;">/</span>u01<span style="color: #000000; font-weight: bold;">/</span>archive<span style="color: #000000; font-weight: bold;">/</span><span style="color: #007800;">$ORACLE_SID_ORIGEM</span><span style="color: #000000; font-weight: bold;">/</span> <span style="color: #ff0000;">'*.arc'</span> <span style="color: #660033;">-mtime</span> +<span style="color: #000000;">1</span> <span style="color: #660033;">-exec</span> <span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #660033;">-fv</span> \<span style="color: #7a0874; font-weight: bold;">&#123;</span>\<span style="color: #7a0874; font-weight: bold;">&#125;</span> \;
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Backup dos archives&quot;</span>
rman target sys<span style="color: #000000; font-weight: bold;">/</span>sua_senha<span style="color: #000000; font-weight: bold;">@</span><span style="color: #007800;">$ORACLE_SID_ORIGEM</span> <span style="color: #cc0000; font-style: italic;">&lt;&lt;EOF
backup archivelog all;
exit
EOF</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Copiando o backup da produção&quot;</span>
<span style="color: #c20cb9; font-weight: bold;">ssh</span> 192.168.0.y ~<span style="color: #000000; font-weight: bold;">/</span>script<span style="color: #000000; font-weight: bold;">/</span>copia_backup.sh
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Limpando a base <span style="color: #007800;">$ORACLE_SID</span>&quot;</span>
<span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #660033;">-Rfv</span> <span style="color: #000000; font-weight: bold;">/</span>u01<span style="color: #000000; font-weight: bold;">/</span>oradata<span style="color: #000000; font-weight: bold;">/</span><span style="color: #800000;">${ORACLE_SID}</span><span style="color: #000000; font-weight: bold;">/*</span>.dbf
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Subindo a base <span style="color: #007800;">$ORACLE_SID</span> no modo NOMOUNT&quot;</span>
sqlplus  <span style="color: #ff0000;">&quot;/ as sysdba&quot;</span> <span style="color: #cc0000; font-style: italic;">&lt;&lt; EOF
startup nomount;
exit
EOF</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Iniciando o DUPLICATE&quot;</span>
rman target <span style="color: #ff0000;">'sys/sua_senha@$ORACLE_SID_ORIGEM'</span> auxiliary <span style="color: #000000; font-weight: bold;">/</span> <span style="color: #cc0000; font-style: italic;">&lt;&lt;EOF
CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT
    '/u01/backup/$ORACLE_SID_ORIGEM/backup_db_%U_%T' MAXPIECESIZE 8192 M;
run {
  allocate auxiliary channel dsk11 device type disk;
  duplicate target database to $INSTANCE_NAME until time &quot;sysdate - 12/24&quot;;
  release auxiliary channel dsk11;
}
exit
EOF</span>
&nbsp;
sqlplus  <span style="color: #ff0000;">&quot;/ as sysdba&quot;</span> <span style="color: #cc0000; font-style: italic;">&lt;&lt; EOF
shutdown immediate;
startup mount;
ALTER DATABASE NOARCHIVELOG;
ALTER DATABASE OPEN;
exit
EOF</span></pre></div></div>

<p>Comentários:</p>
<ul>
<li>A troca de chaves SSH foi realizada para podermos rodar comandos SSH sem senha;</li>
<li>O backup via RMAN tem de ser copiado do servidor de produção para o servidor de teste para exatamente o mesmo diretório.</li>
<li>Sempre cuidado com os archives. Fazemos um backup via RMAN dos archives e copiamos ele junto antes de iniciar o DUPLICATE;</li>
<li>Colocamos a base no modo noarchive, algumas pessoas fazem isso em bases de testes.</li>
</ul>
<p>&nbsp;</p>
<h2>Referências</h2>
<ul>
<li><a href="http://download.oracle.com/docs/cd/B19306_01/backup.102/b14191/rcmdupdb.htm#i1008564" target="_blank">Backup and Recovery Advanced User&#8217;s Guide &#8211; Cap 13: Creating and Updating Duplicate Databases with RMAN</a></li>
<li><a href="http://download.oracle.com/docs/cd/B19306_01/backup.102/b14194/rcmsynta028.htm#sthref466" target="_blank">Backup and Recovery Reference &#8211; DUPLICATE</a></li>
</ul>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2011/06/02/clonando-bases-no-oracle-rac-10g/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PGCasts</title>
		<link>http://www.midstorm.org/~telles/2011/05/20/pgcasts/</link>
		<comments>http://www.midstorm.org/~telles/2011/05/20/pgcasts/#comments</comments>
		<pubDate>Fri, 20 May 2011 12:18:12 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[PostgreSQL]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=737</guid>
		<description><![CDATA[&#160; O Sr. Dickson Guedes resurgiu das cinzas em grande estilo e com um projeto muito bacana. O pgcasts é um screencast, ou seja, áudio e vídeo com uma demonstração de como fazer alguma coisa no PostgreSQL. Ver a tela dele &#8230; <a href="http://www.midstorm.org/~telles/2011/05/20/pgcasts/">Continuar lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>&nbsp;</p>
<p>O Sr. <a href="http://guedesoft.net/blog/" target="_blank">Dickson Guedes</a> resurgiu das cinzas em grande estilo e com um projeto muito bacana. O <a href="http://pgcasts.com" target="_blank">pgcasts</a> é um <a href="http://pt.wikipedia.org/wiki/Screencast" target="_blank">screencast</a>, 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&#8230;. assuntos que eu levaria páginas para abordar ele mostra como fazer na prática com 20 a 30 minutos de screencast.</p>
<p>&nbsp;</p>
<p>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:</p>
<ol>
<li><span style="font-size: 20px; font-weight: bold;"><a href="http://pgcasts.com/episodes/1-instalando-postgresql-9-0">Instalando PostgreSQL 9.0</a></span></li>
<li><span style="font-size: 20px; font-weight: bold;"><a href="http://pgcasts.com/episodes/2-trabalhando-com-datas-no-postgresql" target="_blank">Trabalhando com datas no PostgreSQL</a></span></li>
<li><span style="font-size: 20px; font-weight: bold;"><a href="http://pgcasts.com/episodes/3-alterando-colunas-de-tipos-conflitantes" target="_blank">Alterando colunas de tipos conflitantes</a></span></li>
</ol>
<p>Divirtam-se.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2011/05/20/pgcasts/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PGBR2011</title>
		<link>http://www.midstorm.org/~telles/2011/05/09/pgbr2011/</link>
		<comments>http://www.midstorm.org/~telles/2011/05/09/pgbr2011/#comments</comments>
		<pubDate>Mon, 09 May 2011 12:31:26 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[pgbr2011]]></category>
		<category><![CDATA[postgres]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=732</guid>
		<description><![CDATA[Para quem não sabe, o PGBR2011 (nome novo para o PGCon Brasil) está à pleno vapor e em sua 4ª edição estamos novamente dando um bom salto de qualidade. Vejamos algumas novidades: 5 Palestrantes internacionais Confirmados Álvaro Herrera (Chile) Bruce &#8230; <a href="http://www.midstorm.org/~telles/2011/05/09/pgbr2011/">Continuar lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://pgbr.postgresql.org.br"><img class="aligncenter" src="http://pgbr.postgresql.org.br/2011/imgs/divulgue_horizontal_pequeno.jpg" alt="PGBR 2011 - Conferência Brasileira PostgreSQL" width="432" height="60" /></a></p>
<p>Para quem não sabe, o <a href="http://pgbr.postgresql.org.br" target="_blank">PGBR2011</a> (nome novo para o PGCon Brasil) está à pleno vapor e em sua 4ª edição estamos novamente dando um bom salto de qualidade. Vejamos algumas novidades:</p>
<h3>5 Palestrantes internacionais Confirmados</h3>
<ul>
<li><a href="http://www.commandprompt.com/blogs/alvaro_herrera" target="_blank">Álvaro Herrera (Chile)</a></li>
<li><a href="http://momjian.us" target="_blank">Bruce Momjian (EUA)</a></li>
<li><a href="http://pgsnake.blogspot.com" target="_blank">Dave Page (Inglaterra)</a></li>
<li><a href="http://www.westnet.com/~gsmith" target="_blank">Greg Smith (EUA)</a></li>
<li><a href="http://www.westnet.com/~gsmith" target="_blank"></a>Koichi Suziki (Japão)</li>
</ul>
<p>Todos eles são desenvolvedores do PostgreSQL e tem grandes <a href="http://www.postgresql.org/community/contributors" target="_blank">contribuições para a comunidade</a>.</p>
<h3>O evento será realizado no conforto do <a href="http://www.centuryflat.com.br/" target="_blank">Hotel Century Paulista</a>, em São Paulo</h3>
<p>Os detalhes do local já estão acertados. A decisão de fazer o evento num hotel deverá ajudar bastante quem vem de longe. Você poderá se hospedar no mesmo local do evento. Assim as pessoas gastam menos com deslocamento e perdem menos tempo. Para quem for se hospedar, confira os <a href="http://pgbr.postgresql.org.br/2011/local.php" target="_blank">preços especiais</a> para quem for participar do evento. Recomendo fazer a sua reserva o quanto antes para evitar surpresas na última hora.</p>
<p>Para quem mora em São Paulo, também será uma grande vantagem, o local fica a apenas algumas quadras da estação Brigadeiro do metrô. Se você preferir vir de carro até o local, há um estacionamento com preço fechado para participantes do evento.</p>
<p>Serão 3 salas simultâneas que juntas comportam 470 pessoas, uma sala de apoio, um salão de exposições e um local para o famoso coffee break à tarde. Estamos esperando um público de 400 pessoas nos 2 dias do evento, que cairão numa 5ª e 6ª feira, diferente das edições anteriores. Notem que na 4ª, haverá um feriado.</p>
<h3>Participe</h3>
<p>Você pode ajudar:</p>
<ol>
<li>Venha ao evento. Sua presença é o mais importante para nós. As inscrições deverão abrir em agosto. Como sempre, quem se inscrever com antecedência, vai poder aproveitar um preço especial.</li>
<li>Mande uma proposta de palestra. A chamada de trabalhos será aberta em meados de junho ou julho, fique atento.</li>
<li>Divulgue o evento:
<ul>
<li> Se você tem um blog, um site, pode divulgar um <a href="http://pgbr.postgresql.org.br/2011/divulgacao.php" target="_blank">banner do evento</a> ou falar sobre ele.</li>
<li>Se você utiliza o Twitter, fale sobre o evento e utilize a hash tag #PGBR2011.</li>
<li>Se você participa de alguma lista de discussão por e-mail, informe as pessoas sobre o evento. Não esqueça das boas maneiras e coloque um <em>[off-topic]</em> no assunto.</li>
<li>Se você estuda numa faculdade, estaremos fazendo alguns cartazes sobre o evento que você poderá afixar no mural.</li>
</ul>
</li>
<li>Se você trabalha numa empresa de TI ou utiliza muito o PostgreSQL no seu trabalho, considere a possibilidade da sua empresa <a href="http://pgbr.postgresql.org.br/2011/patrocinio.php" target="_blank">patrocinar o evento</a>.</li>
<li>Se você gostaria de dar sugestões ou ajudar na organização do evento, entre na <a href="https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-dev" target="_blank">lista da comunidade</a>.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2011/05/09/pgbr2011/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>O guro Oracle Thomas Kyte mostra os argumentos para usar o PostgreSQL</title>
		<link>http://www.midstorm.org/~telles/2011/02/17/o-guro-oracle-thomas-kyte-mostra-os-argumentos-para-usar-o-postgresql/</link>
		<comments>http://www.midstorm.org/~telles/2011/02/17/o-guro-oracle-thomas-kyte-mostra-os-argumentos-para-usar-o-postgresql/#comments</comments>
		<pubDate>Thu, 17 Feb 2011 19:39:46 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[PostgreSQL]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=722</guid>
		<description><![CDATA[Sim, é verdade! Estava lendo uma thread no blog do respeitável Thomas Kyte sobre comparações do Oracle com outros bancos de dados aqui.  Claro, o Thomas não cita o PostgreSQL em momento algum, ele cita apenas o Informix, Ingres, Sybase, &#8230; <a href="http://www.midstorm.org/~telles/2011/02/17/o-guro-oracle-thomas-kyte-mostra-os-argumentos-para-usar-o-postgresql/">Continuar lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Sim, é verdade! Estava lendo uma thread no blog do respeitável Thomas Kyte sobre comparações do Oracle com outros bancos de dados <a href="http://asktom.oracle.com/pls/asktom/f?p=100:11:0::NO::P11_QUESTION_ID:1886476148373#tom2778014300346061501">aqui</a>.  Claro, o Thomas não cita o PostgreSQL em momento algum, ele cita apenas o Informix, Ingres, Sybase, DB2 e o MS SQL Server.</p>
<p>Bom, vale a pena ler o artigo. Você verá que nos comentários o PostgreSQL começa a aparecer, e com boas avaliações. Mais interessante ainda é que o Thomas ignora ao máximo o PostgreSQL nos comentários. Claro, ele não é estúpido, não seria inteligente nem diplomático da parte dele. O máximo que ele chega a citar é que a Oracle tem o XE, que quem conhece sabe que é algo limitado e certamente foi lançado (a exemplo do que fez a MicroSoft e IBM) para retardar o avanço dos bancos de dados livres.</p>
<p>O post é de 2001 e os comentários perduram até 2010. De qualquer forma, fica claro, que os mesmos argumentos que ele utiliza para mostrar a superioridade do Oracle, serviriam para o PostgreSQL&#8230;. vale a pena ler.</p>
<h3><a href="http://asktom.oracle.com/pls/asktom/f?p=100:11:0::NO::P11_QUESTION_ID:1886476148373#tom2778014300346061501">Comparison between Oracle and Others</a></h3>
]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2011/02/17/o-guro-oracle-thomas-kyte-mostra-os-argumentos-para-usar-o-postgresql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SQL para DBAs</title>
		<link>http://www.midstorm.org/~telles/2011/01/25/sql-para-dbas/</link>
		<comments>http://www.midstorm.org/~telles/2011/01/25/sql-para-dbas/#comments</comments>
		<pubDate>Tue, 25 Jan 2011 15:40:55 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[regex]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[window funcitions]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=707</guid>
		<description><![CDATA[Quem me conhece, sabe que eu sempre implico com os vícios dos DBAs que iniciam a sua carreira no desenvolvimento. Mas os DBAs que começam como sysadmin também tem seus vícios. Um dos pontos fracos costuma ser a baixa familiaridade &#8230; <a href="http://www.midstorm.org/~telles/2011/01/25/sql-para-dbas/">Continuar lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Quem me conhece, sabe que eu sempre implico com os vícios dos DBAs que iniciam a sua carreira no desenvolvimento. Mas os DBAs que começam como sysadmin também tem seus vícios. Um dos pontos fracos costuma ser a baixa familiaridade com o SQL.</p>
<p>Bom, vou mostrar aqui um alguns exemplos de SQLs que tive que desenvolver recentemente. Alguns foram feitos para ajudar a equipe de desenvolvimento, outros para resolverem problemas de performance e tem um que foi feito por solicitação dos  sysadmins. Na verdade, eu deveria mesmo é organizar estes scripts de uma forma lógica, mas são coisas realmente simples para merecerem tanto coidado&#8230;</p>
<p>Então chega de blá, blá, blá e vamos a eles:</p>
<ul>
<li>Conversão de NOT IN em NOT EXISTS numa carga de dados. É muito comum você precisar carregar periodicamente uma tabela com os dados de uma outra. Isso ocorre muito na integração entre sistemas. Eu sei, eu sei, usar visões materializadas pode ser um processo bem mais inteligente. Infelizmente nem sempre estas decisões estão na nossa mão. Vejamos o caso:</li>
</ul>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> tabela2
    <span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> tabela1 t1
        <span style="color: #993333; font-weight: bold;">WHERE</span> campo_pk <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">IN</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">SELECT</span> campo_pk <span style="color: #993333; font-weight: bold;">FROM</span> tabela_origem<span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>Você tem de carregar a tabela2, com os dados da tabela1 sem repetir os dados que já estejam lá. Utilizar o NOT IN é bem intuitivo, mas quando a tabela2 é grande, se torna um pesadelo, pois a subconsulta uma vez para cada registro na tabela1 e não consegue utilizar índices para isso. Um verdadeiro pesadelo. Então vamos a solução clássica:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> tabela2
    <span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> tabela1 t1
        <span style="color: #993333; font-weight: bold;">WHERE</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">EXISTS</span> <span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">FROM</span> tabela2 t2 <span style="color: #993333; font-weight: bold;">WHERE</span> t2<span style="color: #66cc66;">.</span>campo_pk <span style="color: #66cc66;">=</span> t1<span style="color: #66cc66;">.</span>campo_pk <span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<ul>
<li>Pegar apenas o primeiro e o último nome de um campo com nome completo:</li>
</ul>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span>
        SUBSTR<span style="color: #66cc66;">&#40;</span>nome<span style="color: #66cc66;">,</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">,</span>INSTR<span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">TRIM</span><span style="color: #66cc66;">&#40;</span>nome<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">' '</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> primeiro_nome
        SUBSTR<span style="color: #66cc66;">&#40;</span>nome<span style="color: #66cc66;">,</span>INSTR<span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">TRIM</span><span style="color: #66cc66;">&#40;</span>nome<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">' '</span><span style="color: #66cc66;">,-</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> ultimo_nome<span style="color: #66cc66;">,</span>
    <span style="color: #993333; font-weight: bold;">FROM</span> tabela_cadastro;</pre></div></div>

<ul>
<li>Limpar caracteres inválidos de telefones. Sim, tem muita gente que gosta de armazenar telefones, CEP, RG, CPF com caracteres não numéricos. Não é o correto, mas muita gente faz. Então, para fazer uma limpeza, vamos utilizar um pouco de <a href="pt.wikipedia.org/wiki/Expressão_regular">expressões regulares</a>, que são pouco exploradas por muitos DBAs e até mesmo desenvolvedores:</li>
</ul>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> SUBSTR<span style="color: #66cc66;">&#40;</span>LTRIM<span style="color: #66cc66;">&#40;</span>regexp_replace<span style="color: #66cc66;">&#40;</span>telefone<span style="color: #66cc66;">,</span><span style="color: #ff0000;">'[^0-9]'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span> fone_tratado
    <span style="color: #993333; font-weight: bold;">FROM</span> tabela_cadastro;</pre></div></div>

<ul>
<li>Selecionar apenas e-mails válidos. Eu sei, a validação deveria ser feita na carga dos dados, mas nem sempre acontece. Aqui, mais um caso clássico de uso de expressões regulares:</li>
</ul>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #993333; font-weight: bold;">TRIM</span><span style="color: #66cc66;">&#40;</span>email<span style="color: #66cc66;">&#41;</span> email
    <span style="color: #993333; font-weight: bold;">FROM</span> tabela_cadastro
    <span style="color: #993333; font-weight: bold;">WHERE</span> REGEXP_LIKE <span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">TRIM</span><span style="color: #66cc66;">&#40;</span>email<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'^[A-Z0-9._%+-]+@[A-Z0-9.-]+<span style="color: #000099; font-weight: bold;">\.</span>[A-Z]{2,4}$'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'i'</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<ul>
<li>Agora uma forma de saber se o número de sessões num nó do Oracle RAC estão relativamente bem balanceadas. Aqui estou utilizando <a href="en.wikipedia.org/wiki/Select_(SQL)#Window_function">funções de janelas</a> (que já <a href="http://www.midstorm.org/~telles/2010/10/26/brincando-com-funcoes-de-janelas-window-functions/">abordamos aqui</a> antes, mas com o Postgres), algo muito bacana, utilizado exaustivamente em consultas complexas com BI:</li>
</ul>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span>
        i<span style="color: #66cc66;">.</span>instance_name<span style="color: #66cc66;">,</span>
        l<span style="color: #66cc66;">.</span>sessions_current<span style="color: #66cc66;">,</span>
        ROUND<span style="color: #66cc66;">&#40;</span>l<span style="color: #66cc66;">.</span>sessions_current <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">COUNT</span><span style="color: #66cc66;">&#40;</span>l<span style="color: #66cc66;">.</span>inst_id<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">OVER</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">/</span> <span style="color: #993333; font-weight: bold;">SUM</span><span style="color: #66cc66;">&#40;</span>l<span style="color: #66cc66;">.</span>sessions_current<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">OVER</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span> var
    <span style="color: #993333; font-weight: bold;">FROM</span> gv$license l<span style="color: #66cc66;">,</span> gv$instance i
    <span style="color: #993333; font-weight: bold;">WHERE</span> l<span style="color: #66cc66;">.</span>inst_id <span style="color: #66cc66;">=</span> i<span style="color: #66cc66;">.</span>inst_id;</pre></div></div>

<p>Aqui, um valor entre digamos 0,9 e 1,1 para o campo VAR significa que o nó está relativamente bem balanceado. Esta consulta foi utilizada para uma ferramenta de monitoramento do Oracle RAC.</p>
<p><em>OBS: Os scripts aqui foram escritos e testados em Oracle 10g e 11g, sorry.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2011/01/25/sql-para-dbas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rodando scrips de um usuário específico com segurança</title>
		<link>http://www.midstorm.org/~telles/2011/01/21/rodando-scrips-de-um-usuario-especifico-com-seguranca/</link>
		<comments>http://www.midstorm.org/~telles/2011/01/21/rodando-scrips-de-um-usuario-especifico-com-seguranca/#comments</comments>
		<pubDate>Fri, 21 Jan 2011 13:35:22 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=703</guid>
		<description><![CDATA[A história é recorrente: o desenvolvedor mandou para você  um mega script (ou um pacote com dezenas deles) para rodar no banco de dados Oracle. Em 99% dos casos o desenvolvedor vai dizer que o script precisa ser executado com você &#8230; <a href="http://www.midstorm.org/~telles/2011/01/21/rodando-scrips-de-um-usuario-especifico-com-seguranca/">Continuar lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>A história é recorrente: o desenvolvedor mandou para você  um mega script (ou um pacote com dezenas deles) para rodar no banco de dados Oracle. Em 99% dos casos o desenvolvedor vai dizer que o script precisa ser executado com você conectado no banco de dados utilizando o usuário XYZ, que é o dono dos objetos que vão ser criados/alterados/apagados.</p>
<p>Aí o que o DBA faz? Pega a senha do usuário numa listinha &#8220;cuidadosamente&#8221; guardada e roda o script em questão. Então, pare e pense: qual é o problema nisso?</p>
<ul>
<li>Você tem que guardar a senha dos usuários da base. Isso vai lhe levar a uma das seguintes situações:
<ul>
<li>Você vai colocar senhas fáceis (como o mesmo nome do usuário ou a mesma senha para todos usuários), o que representa uma brecha de segurança;</li>
<li>Você vai anotar num papel, txt ou algo do tipo todas as senhas. E esse papel, txt, etc não vai estar guardado num cofre, pois você precisa disso com frequência. Nova falha de segurança.</li>
<li>Você vai criar um banco de dados para guardar as senhas&#8230; e ter mais uma base para administrar, gênio.</li>
<li>Você vai deixar o próprio desenvolvedor/fornecedor rodar o script para você. Tá louco? Jamais faça isso num ambiente de produção!!!</li>
</ul>
</li>
<li>Você vai ter que conceder permissões para este usuário além do necessário. Se precisa criar uma tabela, precisa conceder permissão de CREATE TABLE. Precisa criar uma sequência? CREATE VIEW. E por aí vai. Não é raro o DBA usar logo uma daquelas mega permissões como DBA, RESOURCE, etc. Afinal, perder tempo com segurança é coisa de DBA chato, certo?</li>
</ul>
<p>Ok, você é um DBA esperto&#8230; muitos anos de praia, já sabe que existem outras alternativas:</p>
<ul>
<li>Rodar o script como DBA, mas antes abrir o script num editor e sair colocando o nome do esquema antes do nome do objeto. Isso dá certo, mas dá muito trabalho. Não é algo que se possa automatizar sem cometer alguns erros. Acredite, há casos em que isso pode levar horas e está sujeito a muitos erros.</li>
<li>Você pode pegar a senha criptografada em DBA_USERS, alterar a senha do usuário, rodar o script e depois voltar a senha original. É também uma forma de bloquear o acesso deste usuário enquanto você está atualizando os objetos. Claro que idealmente um usuário dono de objetos não deveria nunca ser utilizado para acesso pela aplicação&#8230; mas não é o que os desenvolvedores tem a mania de fazer. Por mim esse usuário não deveria sequer ter permissão para se conectar na base. Eu realmente não acho esta uma solução elegante, e você precisa manter o usuário com um monte de privilégios desnecessários da mesma forma que antes. Já vi também pessoas colocando permissões de DBA enquanto rodam o script e depois que terminam removem a permissão. Não, não é uma boa idéia. Você também tem de anotar com cuidado a senha criptografada para alterar a senha de volta para a original qualquer caracter bizarro que você erre, já era. Por fim você  tem conhecer o impacto de alterar a senha, mesmo que provisóriamente. Experimenta por exemplo trocar a senha do usuário APPS no EBS para ver o que acontece&#8230;</li>
</ul>
<p>Então qual é o procedimento que 10 entre 10 DBAs experientes utilizam? Simples:</p>
<pre>ALTER SESSION SET current_schema=foo;</pre>
<p><strong>Simples assim</strong>. O esquema padrão passa a ser foo. Todos os objetos criados, alterados e apagados serão neste esquema.</p>
<p>Mas calma,<strong> existem alguns problemas sim</strong>: alguns comandos não trabalham bem com outro CURRENT_SCHEMA. Um deles é a criação de DB Links. Não é possível criar um DB Link para outro esquema, você tem de estar realmente conectado com o usuário em questão para criar este DB Link. Claro que você não cria DB Links no ambiente de produção com frequência (pela sua sanidade mental, eu espero que não). DB Links públicos não tem esse problema, é claro. Outro problema é a criação de JOBs com o DBMS_JOB. Você pode utilizar o DBMS_IJOB, para contornar este problema ou pelo bem da humanidade migrar para o Scheduler.</p>
<p>Bom, de qualquer forma é sempre obrigação do DBA revisar os scripts, verificar os parâmetros de Storage, etc.</p>
<p><em><strong>OBS:</strong></em><em> Este post é dedicado a um DBA velho de guerra que ainda guarda velhos hábitos dos tempos que era desenvolvedor e insiste em me trazer mais problemas do que soluções.</em></p>
<p><em><strong>OBS2:</strong></em><em> No PostgreSQL existe uma não conformidade com o padrão SQL (você pode trabalhar no padrão se quiser, mas não vejo vantagem) que permite que os usuários e os esquemas não sejam diretamente relacionados.  Então esta cultura ruim do Oracle não é tão comum entre os desenvolvedores/DBAs do PostgreSQL. Além disso o PostgreSQL tem o SEARCH_PATH que é mais refinado que o CURRENT_SCHEMA, e os comandos DDL permitem a troca do dono de qualquer objeto (que não seja um objeto de sistema, claro).</em></p>
<ul>
<li><strong>ATUALIZAÇÃO (em 16/02/2011):</strong></li>
</ul>
<p><em><span style="font-style: normal;">Para aqueles que ainda precisam utilizar o DBMS_JOB e precisam criar JOBs para outro usuário, segue uma dica de como fazer, utilizando o DBMS_IJOB.SUBMIT. O DBMS_IJOB.REMOVE é fácil de utilizar, mas para criar um novo JOB, você vai precisar passar todos os parâmetros, como em:</span></em></p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">DECLARE</span>
    job_num <span style="color: #993333; font-weight: bold;">NUMBER</span>;
    nlsvar varchar2<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">4000</span><span style="color: #66cc66;">&#41;</span>;
    envvar raw<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">32</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">BEGIN</span>
    <span style="color: #993333; font-weight: bold;">SELECT</span> nls_env<span style="color: #66cc66;">,</span>misc_env
        <span style="color: #993333; font-weight: bold;">INTO</span> nlsvar<span style="color: #66cc66;">,</span>envvar
        <span style="color: #993333; font-weight: bold;">FROM</span> dba_jobs
        <span style="color: #993333; font-weight: bold;">WHERE</span>
            rownum&amp;lt;<span style="color: #cc66cc;">2</span> <span style="color: #993333; font-weight: bold;">AND</span>
            nls_env <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">AND</span>
            misc_env <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span>;
    <span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #993333; font-weight: bold;">MAX</span><span style="color: #66cc66;">&#40;</span>job<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">+</span><span style="color: #cc66cc;">1</span>
        <span style="color: #993333; font-weight: bold;">INTO</span> job_num
        <span style="color: #993333; font-weight: bold;">FROM</span> dba_jobs;
    sys<span style="color: #66cc66;">.</span>dbms_ijob<span style="color: #66cc66;">.</span>submit<span style="color: #66cc66;">&#40;</span>         job<span style="color: #66cc66;">=</span>&amp;gt;job_num<span style="color: #66cc66;">,</span>
        luser<span style="color: #66cc66;">=</span>&amp;gt;<span style="color: #ff0000;">'MEU_USUARIO'</span><span style="color: #66cc66;">,</span>
        puser<span style="color: #66cc66;">=</span>&amp;gt;<span style="color: #ff0000;">'MEU_USUARIO'</span><span style="color: #66cc66;">,</span>
        cuser<span style="color: #66cc66;">=</span>&amp;gt;<span style="color: #ff0000;">'MEU_USUARIO'</span><span style="color: #66cc66;">,</span>
        what<span style="color: #66cc66;">=</span>&amp;gt;<span style="color: #ff0000;">'meu_usuario.roda_procedure_xyz;'</span><span style="color: #66cc66;">,</span>
        next_date<span style="color: #66cc66;">=</span>&amp;gt;TRUNC<span style="color: #66cc66;">&#40;</span>SYSDATE<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
        <span style="color: #993333; font-weight: bold;">INTERVAL</span><span style="color: #66cc66;">=</span>&amp;gt;<span style="color: #ff0000;">'TRUNC(SYSDATE) + 1'</span><span style="color: #66cc66;">,</span>
        broken<span style="color: #66cc66;">=</span>&amp;gt;FALSE<span style="color: #66cc66;">,</span>
        nlsenv<span style="color: #66cc66;">=</span>&amp;gt;nlsvar<span style="color: #66cc66;">,</span>
        env<span style="color: #66cc66;">=</span>&amp;gt;envvar<span style="color: #66cc66;">&#41;</span>;
    dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span>job_num<span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">END</span>;
<span style="color: #66cc66;">/</span>
COMMIT;</pre></div></div>

<p>Já aqueles que desejam criar um DB LINK privado, a única alternativa é recorrer ao DBMS_SYS_SQL, que assim como o DBMS_IJOB não está na documentação oficial:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">DECLARE</span>
    uid <span style="color: #993333; font-weight: bold;">NUMBER</span>;
    sqltext varchar2<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1000</span><span style="color: #66cc66;">&#41;</span> :<span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'CREATE DATABASE LINK test_dblink
CONNECT TO dblink_user IDENTIFIED BY dblink_user_password
USING '</span><span style="color: #ff0000;">'nome_da_base_no_tnsnames'</span><span style="color: #ff0000;">''</span>;
    myint <span style="color: #993333; font-weight: bold;">INTEGER</span>;
<span style="color: #993333; font-weight: bold;">BEGIN</span>
    <span style="color: #993333; font-weight: bold;">SELECT</span> user_id <span style="color: #993333; font-weight: bold;">INTO</span> uid <span style="color: #993333; font-weight: bold;">FROM</span> all_users <span style="color: #993333; font-weight: bold;">WHERE</span> username <span style="color: #993333; font-weight: bold;">LIKE</span> <span style="color: #ff0000;">'SCOTT'</span>;
    myint:<span style="color: #66cc66;">=</span>sys<span style="color: #66cc66;">.</span>dbms_sys_sql<span style="color: #66cc66;">.</span>open_cursor<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
    sys<span style="color: #66cc66;">.</span>dbms_sys_sql<span style="color: #66cc66;">.</span>parse_as_user<span style="color: #66cc66;">&#40;</span>myint<span style="color: #66cc66;">,</span>sqltext<span style="color: #66cc66;">,</span>dbms_sql<span style="color: #66cc66;">.</span>native<span style="color: #66cc66;">,</span>UID<span style="color: #66cc66;">&#41;</span>;
    sys<span style="color: #66cc66;">.</span>dbms_sys_sql<span style="color: #66cc66;">.</span>close_cursor<span style="color: #66cc66;">&#40;</span>myint<span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">END</span>;
<span style="color: #66cc66;">/</span></pre></div></div>

<p>Note que você pode utilizar o DBMS_SYS_SQL para rodar qualquer comando SQL como outro usuário. No exemplo, estamos utilizando o usuário SCOTT.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2011/01/21/rodando-scrips-de-um-usuario-especifico-com-seguranca/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Habilitar e desabilitar todos os JOBS do Oracle</title>
		<link>http://www.midstorm.org/~telles/2010/12/10/habilitar-e-desabilitar-todos-os-jobs-do-oracle/</link>
		<comments>http://www.midstorm.org/~telles/2010/12/10/habilitar-e-desabilitar-todos-os-jobs-do-oracle/#comments</comments>
		<pubDate>Fri, 10 Dec 2010 17:35:56 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[job]]></category>
		<category><![CDATA[scheduler]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=691</guid>
		<description><![CDATA[Ao migrar uma base via DUMP (seja com expdp/impdp ou exp/imp) ou realizar algumas manutenções como atualizações de aplicação, é sempre uma boa idéia parar todos os JOBS que estão rodando no banco antes de começar o trabalho. Não basta &#8230; <a href="http://www.midstorm.org/~telles/2010/12/10/habilitar-e-desabilitar-todos-os-jobs-do-oracle/">Continuar lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ao migrar uma base via DUMP (seja com expdp/impdp ou exp/imp) ou realizar algumas manutenções como atualizações de aplicação, é sempre uma boa idéia parar todos os JOBS que estão rodando no banco antes de começar o trabalho. Não basta matar os processos ativos(ou mesmo reiniciar a base), você tem de cuidar para que os JOBs não sejam iniciados no meio do processo e este é um erro muito comum.</p>
<p>Para facilitar este trabalho criei o pequeno script abaixo que cria dois arquivos, um para desabilitar os JOBs e outro para habilitar novamente. Outro erro comum é desabilitar os JOBs e depois não saber quais estavam ativos antes, na hora de habilita-los.</p>
<p>Um último adendo, aqui eu estou utilizando o DBMS_IJOB (que não está bem documentado, mas permite trabalhar com jobs de outros usuários) e o DBMS_SCHEDULER para aqueles que utilizam este recurso introduzido no 10g.</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">sqlplus <span style="color: #66cc66;">-</span>s <span style="color: #66cc66;">/</span> <span style="color: #993333; font-weight: bold;">AS</span> sysdba <span style="color: #66cc66;">&lt;&lt;</span>EOF
<span style="color: #993333; font-weight: bold;">SET</span> heading off
<span style="color: #993333; font-weight: bold;">SET</span> trimspool <span style="color: #993333; font-weight: bold;">ON</span>
<span style="color: #993333; font-weight: bold;">SET</span> term off
<span style="color: #993333; font-weight: bold;">SET</span> echo off
<span style="color: #993333; font-weight: bold;">SET</span> feed off
&nbsp;
SPOOL <span style="color: #ff0000;">'jobs_to_broken.sql'</span>
<span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #ff0000;">'EXEC dbms_ijob.broken('</span> <span style="color: #66cc66;">||</span> job <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">',TRUE);'</span> 
    <span style="color: #993333; font-weight: bold;">FROM</span> dba_jobs 
    <span style="color: #993333; font-weight: bold;">WHERE</span> broken <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'N'</span>;
&nbsp;
<span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #ff0000;">'EXEC dbms_scheduler.disable ('</span><span style="color: #ff0000;">''</span> <span style="color: #66cc66;">||</span> owner <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">'.'</span> <span style="color: #66cc66;">||</span> job_name <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">''</span><span style="color: #ff0000;">');'</span> 
    <span style="color: #993333; font-weight: bold;">FROM</span> dba_scheduler_jobs 
    <span style="color: #993333; font-weight: bold;">WHERE</span> enabled <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'TRUE'</span>
    <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> owner<span style="color: #66cc66;">,</span> job_name;
&nbsp;
SPOOL OFF
SPOOL <span style="color: #ff0000;">'jobs_to_run.sql'</span>
<span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #ff0000;">'EXEC dbms_ijob.broken('</span> <span style="color: #66cc66;">||</span> job <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">',FALSE);'</span> 
    <span style="color: #993333; font-weight: bold;">FROM</span> dba_jobs 
    <span style="color: #993333; font-weight: bold;">WHERE</span> broken <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'N'</span>;
&nbsp;
<span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #ff0000;">'EXEC dbms_scheduler.enable ('</span><span style="color: #ff0000;">''</span> <span style="color: #66cc66;">||</span> owner <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">'.'</span> <span style="color: #66cc66;">||</span> job_name <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">''</span><span style="color: #ff0000;">');'</span> 
    <span style="color: #993333; font-weight: bold;">FROM</span> dba_scheduler_jobs 
    <span style="color: #993333; font-weight: bold;">WHERE</span> enabled <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'TRUE'</span>
    <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> owner<span style="color: #66cc66;">,</span> job_name;
SPOOL OFF
<span style="color: #808080; font-style: italic;">-- rodar '@jobs_to_broken' para desabilitar os JOBs'</span>
<span style="color: #808080; font-style: italic;">-- rodar '@jobs_to_run' para restaurar os JOBs</span>
EOF</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2010/12/10/habilitar-e-desabilitar-todos-os-jobs-do-oracle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Brincando com funções de janelas (Window Functions)</title>
		<link>http://www.midstorm.org/~telles/2010/10/26/brincando-com-funcoes-de-janelas-window-functions/</link>
		<comments>http://www.midstorm.org/~telles/2010/10/26/brincando-com-funcoes-de-janelas-window-functions/#comments</comments>
		<pubDate>Tue, 26 Oct 2010 14:58:17 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[window funcitions]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=682</guid>
		<description><![CDATA[&#60;pre lang=&#8221;sql&#8221;&#62;Tempos atrás me deparei com um problema que era criar uma função para gerar uma CURVA ABC. Eu não tinha a menor idéia do que ser tratava, mas resumindo, uma Curva ABC é uma separação entre faixas de valores, &#8230; <a href="http://www.midstorm.org/~telles/2010/10/26/brincando-com-funcoes-de-janelas-window-functions/">Continuar lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>&lt;pre lang=&#8221;sql&#8221;&gt;Tempos atrás me deparei com um problema que era criar uma função para gerar uma CURVA ABC. Eu não tinha a menor idéia do que ser tratava, mas resumindo, uma Curva ABC é uma separação entre faixas de valores, como os 20% mais ricos e o 20% mais pobres. Se quiser mais detalhes, veja a <a href="http://pt.wikipedia.org/wiki/Curva_ABC">definição do Wikipédia</a>. Apesar do conceito ser simples, fazer isso com SQL convencional não é. E quem me conhece, sabe que eu só utilizo PL no banco de dados, quando é absolutamente necessário. O motivo é simples, o PL não deixa muita margem para o otimizador do banco de dados encontrar a melhor forma de agrupar os dados. E eu sei que o otimizador é muito mais inteligente que eu.</p>
<p>Bom, resumindo a história, eu precisei lançar mão das novas funções de janela, incorporadas na versão 8.4 do PostgreSQL. Para exemplificar aqui, vou utilizar uma base de exemplo conhecida de todos, o <a href="http://pgfoundry.org/projects/dbsamples/">PAGILA</a>. Eu tentei o <a href="http://pgfoundry.org/projects/dbsamples/">DELLSTORE</a>, mas os dados não apareceram tão bem distribuídos para efeito de visualização.</p>
<p>Bom, depois de criar uma base e importar os dados do PAGILA, eu criei uma visão para facilitar a minha vida e simplificar a análise, deixando de lado detalhes desnecessários:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">OR</span> <span style="color: #993333; font-weight: bold;">REPLACE</span> <span style="color: #993333; font-weight: bold;">VIEW</span> sales_pgday <span style="color: #993333; font-weight: bold;">AS</span>
    <span style="color: #993333; font-weight: bold;">SELECT</span>
        f<span style="color: #66cc66;">.</span>title<span style="color: #66cc66;">,</span>
        c<span style="color: #66cc66;">.</span>name <span style="color: #993333; font-weight: bold;">AS</span> category<span style="color: #66cc66;">,</span>
        <span style="color: #993333; font-weight: bold;">SUM</span><span style="color: #66cc66;">&#40;</span>p<span style="color: #66cc66;">.</span>amount<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> total_sales
        <span style="color: #993333; font-weight: bold;">FROM</span>
            <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>payment p <span style="color: #993333; font-weight: bold;">JOIN</span> rental r <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>p<span style="color: #66cc66;">.</span>rental_id <span style="color: #66cc66;">=</span> r<span style="color: #66cc66;">.</span>rental_id<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                <span style="color: #993333; font-weight: bold;">JOIN</span> inventory i <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>r<span style="color: #66cc66;">.</span>inventory_id <span style="color: #66cc66;">=</span> i<span style="color: #66cc66;">.</span>inventory_id<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                <span style="color: #993333; font-weight: bold;">JOIN</span> film f <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>i<span style="color: #66cc66;">.</span>film_id <span style="color: #66cc66;">=</span> f<span style="color: #66cc66;">.</span>film_id<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                <span style="color: #993333; font-weight: bold;">JOIN</span> film_category fc <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>f<span style="color: #66cc66;">.</span>film_id <span style="color: #66cc66;">=</span> fc<span style="color: #66cc66;">.</span>film_id<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                <span style="color: #993333; font-weight: bold;">JOIN</span> category c <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>fc<span style="color: #66cc66;">.</span>category_id <span style="color: #66cc66;">=</span> c<span style="color: #66cc66;">.</span>category_id<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #993333; font-weight: bold;">GROUP</span> <span style="color: #993333; font-weight: bold;">BY</span> c<span style="color: #66cc66;">.</span>name<span style="color: #66cc66;">,</span> f<span style="color: #66cc66;">.</span>title
    ;</pre></div></div>

<p>Com um select você verá os dados mais ou menos assim:</p>
<pre>           title            |  category   | total_sales
-----------------------------+-------------+-------------
 AMADEUS HOLY                | Action      |       33.79
 AMERICAN CIRCUS             | Action      |      167.78
 ANTITRUST TOMATOES          | Action      |       37.90
 BAREFOOT MANCHURIAN         | Action      |       66.82
 BERETS AGENT                | Action      |       78.78
 BRIDE INTRIGUE              | Action      |       21.81
 BULL SHAWSHANK              | Action      |       21.84
 CADDYSHACK JEDI             | Action      |       51.84
 CAMPUS REMEMBER             | Action      |       90.81
 CASUALTIES ENCINO           | Action      |       72.91
 CELEBRITY HORN              | Action      |       32.76
 CLUELESS BUCKET             | Action      |      112.75
 CROW GREASE                 | Action      |       18.88
 DANCES NONE                 | Action      |       31.86
 DARKO DORADO                | Action      |       82.89
 DARN FORRESTER              | Action      |       93.82
 DEVIL DESIRE                | Action      |       83.85
 DRAGON SQUAD                | Action      |       27.89
 DREAM PICKUP                | Action      |       81.78
 DRIFTER COMMANDMENTS        | Action      |      141.76
...</pre>
<p>O primeiro passo para calcular a curva ABC sobre as vendas de cada filme, para cada categoria de filme (os filmes mais vendidos e os menos vendidos em cada categoria) é calcular o total de vendas. Uma vez que queremos os 20% mais vendidos e os 20% menos vendidos, precisamos do total (100%) para calcular a porcentagem:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> category<span style="color: #66cc66;">,</span> <span style="color: #993333; font-weight: bold;">SUM</span><span style="color: #66cc66;">&#40;</span>total_sales<span style="color: #66cc66;">&#41;</span>
    <span style="color: #993333; font-weight: bold;">FROM</span> sales_pgday
    <span style="color: #993333; font-weight: bold;">GROUP</span> <span style="color: #993333; font-weight: bold;">BY</span> category;</pre></div></div>

<p>E assim teremos:</p>
<pre>  category   |   sum
-------------+---------
 Action      | 4375.85
 Animation   | 4656.30
 Children    | 3655.55
 Classics    | 3639.59
 Comedy      | 4383.58
 Documentary | 4217.52
 Drama       | 4587.39
 Family      | 4226.07
 Foreign     | 4270.67
 Games       | 4281.33
 Horror      | 3722.54
 Music       | 3417.72
 New         | 4361.57
 Sci-Fi      | 4756.98
 Sports      | 5314.21
 Travel      | 3549.64
(16 linhas)</pre>
<p>Agora vejamos uma função de janela em ação aqui. Ainda não é a que vamos utilizar, é apenas um exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span>
    title<span style="color: #66cc66;">,</span>
    category<span style="color: #66cc66;">,</span>
    total_sales<span style="color: #66cc66;">,</span>
    rank<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">OVER</span> <span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> total_sales <span style="color: #993333; font-weight: bold;">DESC</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> rank
<span style="color: #993333; font-weight: bold;">FROM</span> sales_pgday;</pre></div></div>

<p>Agora vejamos o resultado:</p>
<pre>            title            |  category   | total_sales | rank
-----------------------------+-------------+-------------+------
 TELEGRAPH VOYAGE            | Music       |      231.73 |    1
 WIFE TURN                   | Documentary |      223.69 |    2
 ZORRO ARK                   | Comedy      |      214.69 |    3
 GOODFELLAS SALUTE           | Sci-Fi      |      209.69 |    4
 SATURDAY LAMBS              | Sports      |      204.72 |    5
 TITANS JERK                 | Sci-Fi      |      201.71 |    6
 TORQUE BOUND                | Drama       |      198.72 |    7
 HARRY IDAHO                 | Drama       |      195.70 |    8
 INNOCENT USUAL              | Foreign     |      191.74 |    9
 HUSTLER PARTY               | Comedy      |      190.78 |   10
 PELICAN COMFORTS            | Documentary |      188.74 |   11
 CAT CONEHEADS               | Comedy      |      181.70 |   12
 ENEMY ODDS                  | Music       |      180.71 |   13
 BUCKET BROTHERHOOD          | Travel      |      180.66 |   14
 RANGE MOONWALKER            | Family      |      179.73 |   15
 MASSACRE USUAL              | Games       |      179.70 |   16
 VIDEOTAPE ARSENIC           | Games       |      178.71 |   17
 DOGMA FAMILY                | Animation   |      178.70 |   18
 APACHE DIVINE               | Family      |      178.69 |   19
 VELVET TERMINATOR           | Comedy      |      177.74 |   20
...</pre>
<p>Agora vamos olhar com calma os dados (tirei aqui apenas as 20 primeiras linhas) e a parte do SELECT que diz:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">rank<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">OVER</span> <span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> total_sales <span style="color: #993333; font-weight: bold;">DESC</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> rank</pre></div></div>

<p>Veja, o campo está utilizando a função RANK, sobre uma janela de dados ordenados pelo total de vendas. O campo RANK simplesmente diz qual é mais significativo, sobre a amostra (OVER) determinada. Agora queremos saber quais são os mais vendidos por categoria. O curioso é que ao invés de utilizar o GROUP BY que afetaria todas as colunas, vamos utilizar o PARTITION BY dentro da definição da janela, assim, isto afetará apenas a nossa última coluna:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span>
    title<span style="color: #66cc66;">,</span>
    category<span style="color: #66cc66;">,</span>
    total_sales<span style="color: #66cc66;">,</span>
    rank<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">OVER</span> <span style="color: #66cc66;">&#40;</span>PARTITION <span style="color: #993333; font-weight: bold;">BY</span> category <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> total_sales <span style="color: #993333; font-weight: bold;">DESC</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> rank
<span style="color: #993333; font-weight: bold;">FROM</span> sales_pgday;</pre></div></div>

<p>Assim teremos:</p>
<pre>            title            |  category   | total_sales | rank
-----------------------------+-------------+-------------+------
 FOOL MOCKINGBIRD            | Action      |      175.77 |    1
 AMERICAN CIRCUS             | Action      |      167.78 |    2
 STAGECOACH ARMAGEDDON       | Action      |      154.74 |    3
 EASY GLADIATOR              | Action      |      150.77 |    4
 MINDS TRUMAN                | Action      |      149.80 |    5
 KISSING DOLLS               | Action      |      147.80 |    6
 TRIP NEWTON                 | Action      |      145.72 |    7
 DRIFTER COMMANDMENTS        | Action      |      141.76 |    8
 SUSPECTS QUILLS             | Action      |      133.70 |    9
 WATERFRONT DELIVERANCE      | Action      |      121.83 |   10
...
 DRAGON SQUAD                | Action      |       27.89 |   56
 BULL SHAWSHANK              | Action      |       21.84 |   57
 BRIDE INTRIGUE              | Action      |       21.81 |   58
 CROW GREASE                 | Action      |       18.88 |   59
 LAWRENCE LOVE               | Action      |       15.87 |   60
 MONTEZUMA COMMAND           | Action      |       11.91 |   61
 DOGMA FAMILY                | Animation   |      178.70 |    1
 SUNRISE LEAGUE              | Animation   |      170.76 |    2
 TITANIC BOONDOCK            | Animation   |      154.77 |    3
 FORRESTER COMANCHEROS       | Animation   |      146.73 |    4
 FALCON VOLUME               | Animation   |      127.77 |    5
...</pre>
<p>Notem que agora o rank é realizado para cada categoria, o rank é ordenado pelas vendas. Vale a pena executar o SQL no seu computador para verificar os dados com mais calma.</p>
<p>Bom, mas eu quero saber dos 20% mais vendidos. O problema aqui é que você precisaria ir somando o total de vendas de cada produto até chegar em 20% do total. Ocorre que você pode utilizar as funções de agregação como SUM, COUNT e outras junto com a sua janela. Vejamos como isso funciona:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span>
    title<span style="color: #66cc66;">,</span>
    category<span style="color: #66cc66;">,</span>
    total_sales<span style="color: #66cc66;">,</span>
    rank<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">OVER</span> <span style="color: #66cc66;">&#40;</span>PARTITION <span style="color: #993333; font-weight: bold;">BY</span> category <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> total_sales <span style="color: #993333; font-weight: bold;">DESC</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> rank<span style="color: #66cc66;">,</span>
    <span style="color: #993333; font-weight: bold;">SUM</span><span style="color: #66cc66;">&#40;</span>total_sales<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">OVER</span> <span style="color: #66cc66;">&#40;</span>PARTITION <span style="color: #993333; font-weight: bold;">BY</span> category <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> total_sales <span style="color: #993333; font-weight: bold;">DESC</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #993333; font-weight: bold;">SUM</span>
<span style="color: #993333; font-weight: bold;">FROM</span> sales_pgday;</pre></div></div>

<p>E teremos os seguintes dados:</p>
<pre>            title            |  category   | total_sales | rank |   sum
-----------------------------+-------------+-------------+------+---------
 FOOL MOCKINGBIRD            | Action      |      175.77 |    1 |  175.77
 AMERICAN CIRCUS             | Action      |      167.78 |    2 |  343.55
 STAGECOACH ARMAGEDDON       | Action      |      154.74 |    3 |  498.29
 EASY GLADIATOR              | Action      |      150.77 |    4 |  649.06
 MINDS TRUMAN                | Action      |      149.80 |    5 |  798.86
 KISSING DOLLS               | Action      |      147.80 |    6 |  946.66
 TRIP NEWTON                 | Action      |      145.72 |    7 | 1092.38
 DRIFTER COMMANDMENTS        | Action      |      141.76 |    8 | 1234.14
 SUSPECTS QUILLS             | Action      |      133.70 |    9 | 1367.84
 WATERFRONT DELIVERANCE      | Action      |      121.83 |   10 | 1489.67
 TRUMAN CRAZY                | Action      |      121.77 |   11 | 1611.44
 CLUELESS BUCKET             | Action      |      112.75 |   12 | 1724.19
 SOUTH WAIT                  | Action      |      107.78 |   13 | 1831.97
 DARN FORRESTER              | Action      |       93.82 |   14 | 1925.79
 CAMPUS REMEMBER             | Action      |       90.81 |   15 | 2016.60
 FORREST SONS                | Action      |       87.82 |   16 | 2104.42
 DEVIL DESIRE                | Action      |       83.85 |   17 | 2188.27
 DARKO DORADO                | Action      |       82.89 |   18 | 2271.16
 DREAM PICKUP                | Action      |       81.78 |   19 | 2352.94
 WEREWOLF LOLA               | Action      |       78.86 |   20 | 2431.80
...
 REAR TRADING                | Action      |       32.83 |   52 | 4163.15
 CELEBRITY HORN              | Action      |       32.76 |   53 | 4195.91
 DANCES NONE                 | Action      |       31.86 |   54 | 4227.77
 SIDE ARK                    | Action      |       29.88 |   55 | 4257.65
 DRAGON SQUAD                | Action      |       27.89 |   56 | 4285.54
 BULL SHAWSHANK              | Action      |       21.84 |   57 | 4307.38
 BRIDE INTRIGUE              | Action      |       21.81 |   58 | 4329.19
 CROW GREASE                 | Action      |       18.88 |   59 | 4348.07
 LAWRENCE LOVE               | Action      |       15.87 |   60 | 4363.94
 MONTEZUMA COMMAND           | Action      |       11.91 |   61 | 4375.85
 DOGMA FAMILY                | Animation   |      178.70 |    1 |  178.70
 SUNRISE LEAGUE              | Animation   |      170.76 |    2 |  349.46
 TITANIC BOONDOCK            | Animation   |      154.77 |    3 |  504.23
 FORRESTER COMANCHEROS       | Animation   |      146.73 |    4 |  650.96
 FALCON VOLUME               | Animation   |      127.77 |    5 |  778.73
 MISSION ZOOLANDER           | Animation   |      126.82 |    6 |  905.55
 DOORS PRESIDENT             | Animation   |      123.81 |    7 | 1029.36
 SLEEPLESS MONSOON           | Animation   |      121.80 |    8 | 1151.16
 THIEF PELICAN               | Animation   |      117.81 |    9 | 1268.97
 HORN WORKING                | Animation   |      112.76 |   10 | 1381.73
...</pre>
<p>Note que o valor da soma (SUM) vai acumulando registro a registro até que uma nova categoria apareça. Isto é uma coisa muito difícil de se fazer com SQL puro, você não consegue fazer cálculos com base nos registros anteriores.</p>
<p>Agora nós podemos juntar esta última consulta com a primeira para calcular a porcentagem de vendas sobre o total da categoria. Vamos colocar cada uma das consultas como uma entrada em FROM:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span>
    sales<span style="color: #66cc66;">.</span>category<span style="color: #66cc66;">,</span>
    title<span style="color: #66cc66;">,</span>
    somatorio<span style="color: #66cc66;">,</span>
    total<span style="color: #66cc66;">,</span>
    <span style="color: #66cc66;">&#40;</span>somatorio <span style="color: #66cc66;">/</span> total<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">*</span> <span style="color: #cc66cc;">100</span> <span style="color: #993333; font-weight: bold;">AS</span> porcentagem
    <span style="color: #993333; font-weight: bold;">FROM</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">SELECT</span>
            category<span style="color: #66cc66;">,</span>
            <span style="color: #993333; font-weight: bold;">SUM</span><span style="color: #66cc66;">&#40;</span>total_sales<span style="color: #66cc66;">&#41;</span> total
          <span style="color: #993333; font-weight: bold;">FROM</span> sales_pgday
          <span style="color: #993333; font-weight: bold;">GROUP</span> <span style="color: #993333; font-weight: bold;">BY</span> category<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> tot<span style="color: #66cc66;">,</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">SELECT</span>
            title<span style="color: #66cc66;">,</span>
            category<span style="color: #66cc66;">,</span>
            <span style="color: #993333; font-weight: bold;">SUM</span><span style="color: #66cc66;">&#40;</span>total_sales<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">OVER</span> <span style="color: #66cc66;">&#40;</span>PARTITION <span style="color: #993333; font-weight: bold;">BY</span> category <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> total_sales <span style="color: #993333; font-weight: bold;">DESC</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> somatorio
          <span style="color: #993333; font-weight: bold;">FROM</span> sales_pgday<span style="color: #66cc66;">&#41;</span> sales
    <span style="color: #993333; font-weight: bold;">WHERE</span> tot<span style="color: #66cc66;">.</span>category <span style="color: #66cc66;">=</span> sales<span style="color: #66cc66;">.</span>category;</pre></div></div>

<p>O resultado será:</p>
<pre>  category   |            title            | somatorio |  total  |       porcentagem
-------------+-----------------------------+-----------+---------+--------------------------
 Action      | FOOL MOCKINGBIRD            |    175.77 | 4375.85 |   4.01681958933692882500
 Action      | AMERICAN CIRCUS             |    343.55 | 4375.85 |   7.85104608247540477900
 Action      | STAGECOACH ARMAGEDDON       |    498.29 | 4375.85 |  11.38727332975307654500
 Action      | EASY GLADIATOR              |    649.06 | 4375.85 |  14.83277534650410777300
 Action      | MINDS TRUMAN                |    798.86 | 4375.85 |  18.25611024143880617500
 Action      | KISSING DOLLS               |    946.66 | 4375.85 |  21.63373973056663276800
 Action      | TRIP NEWTON                 |   1092.38 | 4375.85 |  24.96383559765531268200
 Action      | DRIFTER COMMANDMENTS        |   1234.14 | 4375.85 |  28.20343476124638641600
 Action      | SUSPECTS QUILLS             |   1367.84 | 4375.85 |  31.25884113943576676500
 Action      | WATERFRONT DELIVERANCE      |   1489.67 | 4375.85 |  34.04298593416136293500
 Action      | TRUMAN CRAZY                |   1611.44 | 4375.85 |  36.82575956671275295100
 Action      | CLUELESS BUCKET             |   1724.19 | 4375.85 |  39.40240181907515111300
 Action      | SOUTH WAIT                  |   1831.97 | 4375.85 |  41.86546613800747283400
 Action      | DARN FORRESTER              |   1925.79 | 4375.85 |  44.00950672440782933600
 Action      | CAMPUS REMEMBER             |   2016.60 | 4375.85 |  46.08476067506884376700
...
 Action      | REAR TRADING                |   4163.15 | 4375.85 |  95.13923009243918324400
 Action      | CELEBRITY HORN              |   4195.91 | 4375.85 |  95.88788463955574345600
 Action      | DANCES NONE                 |   4227.77 | 4375.85 |  96.61597175405921135300
 Action      | SIDE ARK                    |   4257.65 | 4375.85 |  97.29881051681387616100
 Action      | DRAGON SQUAD                |   4285.54 | 4375.85 |  97.93617240079070352000
 Action      | BULL SHAWSHANK              |   4307.38 | 4375.85 |  98.43527543220174366100
 Action      | BRIDE INTRIGUE              |   4329.19 | 4375.85 |  98.93369288252568072500
 Action      | CROW GREASE                 |   4348.07 | 4375.85 |  99.36515191334255059000
 Action      | LAWRENCE LOVE               |   4363.94 | 4375.85 |  99.72782430842007838500
 Action      | MONTEZUMA COMMAND           |   4375.85 | 4375.85 | 100.00000000000000000000
 Animation   | DOGMA FAMILY                |    178.70 | 4656.30 |   3.83781113759852243200
 Animation   | SUNRISE LEAGUE              |    349.46 | 4656.30 |   7.50510061636922019600
 Animation   | TITANIC BOONDOCK            |    504.23 | 4656.30 |  10.82898438674484032400
 Animation   | FORRESTER COMANCHEROS       |    650.96 | 4656.30 |  13.98019887034770096400
 Animation   | FALCON VOLUME               |    778.73 | 4656.30 |  16.72422309559091982900
 Animation   | MISSION ZOOLANDER           |    905.55 | 4656.30 |  19.44784485535725790900
 Animation   | DOORS PRESIDENT             |   1029.36 | 4656.30 |  22.10682301398105792200
 Animation   | SLEEPLESS MONSOON           |   1151.16 | 4656.30 |  24.72263385091166806300
...</pre>
<p>O resultado é a porcentagem do total de vendas sendo acumulado até 100% e depois começando novamente para outra categoria. Com isso fica fácil atribuir A para os 20% mais significativos, B para os próximos 60% e C para os 20% menos significativos. Aqui, irei utilizar uma função CASE, que embora ocupe um bom espaço no nosso SQL é algo bastante trivial:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span>
    sales<span style="color: #66cc66;">.</span>category<span style="color: #66cc66;">,</span>
    title<span style="color: #66cc66;">,</span>
    TRUNC<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>somatorio <span style="color: #66cc66;">/</span> total<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">*</span> <span style="color: #cc66cc;">100</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> porcentagem<span style="color: #66cc66;">,</span>
    <span style="color: #993333; font-weight: bold;">CASE</span>
        <span style="color: #993333; font-weight: bold;">WHEN</span> <span style="color: #66cc66;">&#40;</span>somatorio <span style="color: #66cc66;">/</span> total<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&lt;=</span> <span style="color: #cc66cc;">0.2</span> <span style="color: #993333; font-weight: bold;">THEN</span> <span style="color: #ff0000;">'A'</span>
        <span style="color: #993333; font-weight: bold;">WHEN</span> <span style="color: #66cc66;">&#40;</span>somatorio <span style="color: #66cc66;">/</span> total<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">0.2</span>  <span style="color: #993333; font-weight: bold;">AND</span>  <span style="color: #66cc66;">&#40;</span>somatorio <span style="color: #66cc66;">/</span> total<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&lt;=</span> <span style="color: #cc66cc;">0.8</span> <span style="color: #993333; font-weight: bold;">THEN</span> <span style="color: #ff0000;">'B'</span>
        <span style="color: #993333; font-weight: bold;">ELSE</span> <span style="color: #ff0000;">'C'</span> <span style="color: #993333; font-weight: bold;">END</span> <span style="color: #993333; font-weight: bold;">AS</span> curva_abc
    <span style="color: #993333; font-weight: bold;">FROM</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">SELECT</span>
            category<span style="color: #66cc66;">,</span>
            <span style="color: #993333; font-weight: bold;">SUM</span><span style="color: #66cc66;">&#40;</span>total_sales<span style="color: #66cc66;">&#41;</span> total
          <span style="color: #993333; font-weight: bold;">FROM</span> sales_pgday
          <span style="color: #993333; font-weight: bold;">GROUP</span> <span style="color: #993333; font-weight: bold;">BY</span> category<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> tot<span style="color: #66cc66;">,</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">SELECT</span>
            title<span style="color: #66cc66;">,</span>
            category<span style="color: #66cc66;">,</span>
            <span style="color: #993333; font-weight: bold;">SUM</span><span style="color: #66cc66;">&#40;</span>total_sales<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">OVER</span> <span style="color: #66cc66;">&#40;</span>PARTITION <span style="color: #993333; font-weight: bold;">BY</span> category <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> total_sales <span style="color: #993333; font-weight: bold;">DESC</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> somatorio
          <span style="color: #993333; font-weight: bold;">FROM</span> sales_pgday<span style="color: #66cc66;">&#41;</span> sales
    <span style="color: #993333; font-weight: bold;">WHERE</span> tot<span style="color: #66cc66;">.</span>category <span style="color: #66cc66;">=</span> sales<span style="color: #66cc66;">.</span>category;</pre></div></div>

<p>E finalmente temos a nossa curva ABC:</p>
<pre>  category   |            title            | porcentagem | curva_abc
-------------+-----------------------------+-------------+-----------
 Action      | FOOL MOCKINGBIRD            |           4 | A
 Action      | AMERICAN CIRCUS             |           7 | A
 Action      | STAGECOACH ARMAGEDDON       |          11 | A
 Action      | EASY GLADIATOR              |          14 | A
 Action      | MINDS TRUMAN                |          18 | A
 Action      | KISSING DOLLS               |          21 | B
 Action      | TRIP NEWTON                 |          24 | B
 Action      | DRIFTER COMMANDMENTS        |          28 | B
 Action      | SUSPECTS QUILLS             |          31 | B
 Action      | WATERFRONT DELIVERANCE      |          34 | B
 Action      | TRUMAN CRAZY                |          36 | B
...
 Action      | EXCITEMENT EVE              |          69 | B
 Action      | BAREFOOT MANCHURIAN         |          70 | B
 Action      | HANDICAP BOONDOCK           |          72 | B
 Action      | PARK CITIZEN                |          73 | B
 Action      | UPRISING UPTOWN             |          74 | B
 Action      | MOCKINGBIRD HOLLYWOOD       |          76 | B
 Action      | PATRIOT ROMAN               |          77 | B
 Action      | GRAIL FRANKENSTEIN          |          78 | B
 Action      | SHRUNK DIVINE               |          79 | B
 Action      | CADDYSHACK JEDI             |          81 | C
 Action      | GOSFORD DONNIE              |          82 | C
 Action      | ENTRAPMENT SATISFACTION     |          83 | C
 Action      | SPEAKEASY DATE              |          84 | C
 Action      | MIDNIGHT WESTWARD           |          85 | C
 Action      | FANTASY TROOPERS            |          86 | C
 Action      | WOMEN DORADO                |          87 | C
...
 Action      | DRAGON SQUAD                |          97 | C
 Action      | BULL SHAWSHANK              |          98 | C
 Action      | BRIDE INTRIGUE              |          98 | C
 Action      | CROW GREASE                 |          99 | C
 Action      | LAWRENCE LOVE               |          99 | C
 Action      | MONTEZUMA COMMAND           |         100 | C
 Animation   | DOGMA FAMILY                |           3 | A
 Animation   | SUNRISE LEAGUE              |           7 | A
 Animation   | TITANIC BOONDOCK            |          10 | A
 Animation   | FORRESTER COMANCHEROS       |          13 | A
 Animation   | FALCON VOLUME               |          16 | A
 Animation   | MISSION ZOOLANDER           |          19 | A
 Animation   | DOORS PRESIDENT             |          22 | B
 Animation   | SLEEPLESS MONSOON           |          24 | B
 Animation   | THIEF PELICAN               |          27 | B
 Animation   | HORN WORKING                |          29 | B
 Animation   | GANGS PRIDE                 |          32 | B
...</pre>
<p>É claro que existem N coisas que você pode fazer com funções de janela. A documentação possui <a href="http://www.postgresql.org/docs/current/static/queries-table-expressions.html#QUERIES-WINDOW">algumas explicações</a> sobre este recurso e também uma <a href="http://www.postgresql.org/docs/current/static/functions-window.html">lista com várias funções</a> que você pode testar com a sua base, aproveitando como ponto de partida os exemplos mostrados aqui.</p>
<h3>Boa diversão!</h3>
]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2010/10/26/brincando-com-funcoes-de-janelas-window-functions/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Sobre o PGCon Brasil, ou melhor PGBR</title>
		<link>http://www.midstorm.org/~telles/2010/10/23/sobre-o-pgcon-brasil-ou-melhor-pgbr/</link>
		<comments>http://www.midstorm.org/~telles/2010/10/23/sobre-o-pgcon-brasil-ou-melhor-pgbr/#comments</comments>
		<pubDate>Sat, 23 Oct 2010 11:38:50 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[PostgreSQL]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=680</guid>
		<description><![CDATA[A notícia agora é oficial, o PGBR 2010 foi cancelado. Isso exige um pouco de reflexão. E como faz tempo que eu não faço isso por aqui, lá vai&#8230; Bom, quem acompanha o blog aqui está careca de saber que &#8230; <a href="http://www.midstorm.org/~telles/2010/10/23/sobre-o-pgcon-brasil-ou-melhor-pgbr/">Continuar lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>A notícia agora é oficial, o <a href="http://www.postgresql.org.br/node/118">PGBR 2010 foi cancelado.</a></p>
<p>Isso exige um pouco de reflexão. E como faz tempo que eu não faço isso por aqui, lá vai&#8230;</p>
<p>Bom, quem acompanha o blog aqui está careca de saber que em 2009 eu fui uma das pessoas que colaborou na organização da &#8220;<a href="http://pgbr.postgresql.org.br/2009/index.php">III Conferência Brasileira de PostgreSQL</a>&#8220;, também conhecida como PGCon Brasil 2009. Bom a organização de um evento deste porte não é nem de perto algo como a organização de um FISL. Mas não é nada simples. Quando você cobra R$ 100,00 pora alguém entrar num evento, tem que fazer este investimento voltar para a pessoa. É um compromisso que você assume. Não pode pisar na bola.</p>
<p>Para quem não sabe, existem 3 tipos de eventos que se encaixam aqui no Brasil:</p>
<ul>
<li>O PG Metting, que seria algo como um Happy Hour com uma palestra e um convite para tomar uma cerveja depois. Em São Francisco, CA, o povo do PostgreSQL se encontra toda  na 3ª quinta-feira de cada mês. É algo que São Paulo, Brasília, Porto Alegre, Fortaleza, teriam todas as condições de fazer. Basta achar um local e criar a tradição. Tenho muita vontade de criar algo deste tipo aqui em São Paulo, mas não pode ser no dia do meu rodízio, hehehe.</li>
<li>O PGDay, que é um dia de palestras em um evento em geral direcionado para novatos. Assim como o PG Metting, pode ser organizado com custo zero, sem cobrar ingresso e sem patrocínio. Se tiver patrocínio, ótimo, mas não é preciso. Já foram vários PGDays com muito sucesso até agora. No ano passado tivemos: Brasília, São Paulo-SP, Porto Velho-RO, Ji-Paraná-RO, Porto Alegre-RS e ainda Florianópolis-SC. Este ano foram Ilheus-BA, Manaus-AM e São Paulo-SP, mas ainda deverá acontecer um no Rio de Janeiro-RJ. Vejam que não é pouca coisa. A simplicidade na organização e o aproveitamento de palestrantes locais é a chave do sucesso. E é a porta de entrada para novos colaboradores na comunidade.</li>
<li>O PGBR, antes era chamado de PGCon Brasil, mas atendendo ao pedido do Dan Languile, trocamos o nome. Questões internas, não vale a pena discutir e não é nenhum problema para nós. É o grande evento da comunidade nacional e tem tudo para ser referência em toda a América do Sul e é também um dos maiores eventos de usuários de PostgreSQL do mundo. Ele não é voltado para novatos, é voltado para quem já trabalha ou esta avaliando seriamente a possibilidade de trabalhar com o PostgreSQL. Aqui o nível das palestras vai de intermediário para avançado, passando por uma sala reservada aos Hackers onde o nível é para quem quer fazer coisas realmente divertidas.</li>
</ul>
<p><em>&lt;mimimi mode ON&gt;<br />
No ano passado a organização do PGCon Brasil 2009 tomou muito do meu tempo assim como o tempo de muitos outros como o Euler Taveira, Diogo Biazus, Leonardo Cezar, Fernando Ike, Marcelo Costa, a equipe da 4Linux e muitos outros mais. Mas houve algo curioso em 2009, que não houve nas outras 2 edições do evento em 2007 e 2008: pouca repercussão. Antes de depois do evento, vi pouca divulgação, comentários, posts em blogs, fotos, etc. E o mais estranho é que o evento deve defeitos mas não se pode dizer que foi pior que os anteriores, então o que aconteceu? Eu não sei exatamente o que aconteceu, só posso especular aqui. Uma pista é o que houve com muitos organizadores este ano: eu, Euler, Fike e Diogo, nos afastamos um pouco da comunidade. E isto teve um peso forte. Mas nós temos trabalhado juntos há alguns anos, o que houve? Bom, quando começamos, o PostgreSQL era quase um hobby para alguns de nós, hoje começa a ser meio de vida. Isso acontece em várias comunidades, eu vi isso claramente aqui no PSL-ABCD. Veja que por outro lado, este anos foram 3 palestrantes brasileiros no PGCon 2010, lá no Canadá! O nível tem crescido, e o nosso tempo disponível está indo para o ralo. De toda forma, depois de ralar muito, ver uma repercussão baixa após o PGCon 2009 também me desanimou um pouco.<br />
&lt;mimimi mode off&gt;</em></p>
<h3>O que aprendemos no passado</h3>
<ul>
<li>A burocracia é nosso inimigo número 1. Projeto de captação, contratos de patrocínio, notas fiscais, as inscrições, notas de empenho, prestação de contas, etc, etc, etc. Conseguir tirar esta parte burocrática da frente é uma meta que pode mudar tudo. A burocracia é o nosso maior inimigo. Ele nos leva ao próximo ponto:</li>
<li>As inscrições não podem ser realizadas pela comunidade. Receber dinheiro dá muito trabalho e fazer isso do jeito certo dá um absurdo de trabalho. Se tivéssemos patrocinadores em abundância, seria muito, mas muito mais fácil não cobrar nada. Não se trata apenas de ter um bom sistema para fazer as inscrições (coisa que o Euler fez do zero), não se trata apenas de ter banco, nota, recibo, documentação, etc. Se trata de ter alguém que atenda a meleca do telefone o tempo todo e resolva as dúvidas, encaminhe os processos bizarros de alguns órgãos públicos e suas notas de empenho from hell.</li>
<li>Patrocínio em troca de serviços é um bom negócio. Ao invés de receber dinheiro, receber o serviço. Foi assim com os brindes (canecas, pins, chaveiros, etc), com o credenciamento e com o Coffee Break. Tira uma boa parte da carga de burocracia e preocupação das nossas costas.</li>
<li>Começar a organização com pelo menos um ano antes e adiantar ao máximo as coisas no começo, garante que o evento saia, pois:
<ul>
<li>Reservar auditório com menos de 6 meses de antecedência é quase impossível, com 12 meses também não é tão fácil assim;</li>
<li>Ter o plano de captação pronto, com local e data definidos com mais de 6 meses de antecedência torna possível conseguir patrocínio. Com isso na mão, muitas portas vão bater na sua cara, mas outras vão se abrir. Sem isso, só na base da amizade mesmo, nem pense em órgãos públicos;</li>
<li>Os palestrantes internacionais precisam se agendar com muita antecedência e comprar passagens adiantado sai bem mais barato;</li>
<li>Com local, data e plano de captação prontos com um ano de antecedência, você tem tempo de se dedicar aos zilhões de detalhes que vão surgir nos 6 meses que antecedem o evento;</li>
<li>As inscrições tem de abrir cedo, para você começar a ter dinheiro em caixa cedo.</li>
</ul>
</li>
<li>O valor das incrições tem de cobrir pelo menos os dois maiores custos do evento: a locação dos auditórios e o coffee-break.</li>
<li>Receber dinheiro de patrocinadores estrangeiros é um inferno. Então peça a eles que ajudem no pagamento de viagens de palestrantes internacionais;</li>
</ul>
<h3>Que venha o PGBR 2011!</h3>
<p>Bom, e porquê o PGBR 2010 não deu certo? De certo não vale a pena entrar nesta questão. Pessoas, trabalharam muito para tentar organizar o evento mas isso não foi sificiente. A única coisa realmente óbivia é que a organização começou muito tarde. Mas de fato houveram pessoas que trabalharam bastante e imagino o quanto elas estejam frustradas agora. Muito mais do que aqueles que já aguardavam com expectativa o evento deste ano.</p>
<p>Agora é hora de pensar em 2011 e nos PGMettings e PGDays que podemos fazer em breve. Não temos tempo para ficar se remoendo mais, já estamos em cima da hora para começar o PGBR 2011. O mercado de PostgreSQL está crescendo, com o 9.0 está aparecendo um novo Standby em cada esquina. Vamos que vamos gente, que atrás vem muita gente!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2010/10/23/sobre-o-pgcon-brasil-ou-melhor-pgbr/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>O quanto você está ferrado com seu SGDB</title>
		<link>http://www.midstorm.org/~telles/2010/08/26/o-quanto-voce-esta-ferrado-com-seu-sgdb/</link>
		<comments>http://www.midstorm.org/~telles/2010/08/26/o-quanto-voce-esta-ferrado-com-seu-sgdb/#comments</comments>
		<pubDate>Thu, 26 Aug 2010 19:10:21 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=677</guid>
		<description><![CDATA[Sem comentários, entre no site e teste você mesmo: http://howfuckedismydatabase.com/ Indicação do Marcelo Costa na lista do pgbr-geral.]]></description>
			<content:encoded><![CDATA[<p>Sem comentários, entre no site e teste você mesmo:</p>
<h3><a href="http://howfuckedismydatabase.com/">http://howfuckedismydatabase.com/</a></h3>
<address>Indicação do Marcelo Costa na lista do pgbr-geral.</address>
]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2010/08/26/o-quanto-voce-esta-ferrado-com-seu-sgdb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Projeto PGXN</title>
		<link>http://www.midstorm.org/~telles/2010/08/13/projeto-pgxn/</link>
		<comments>http://www.midstorm.org/~telles/2010/08/13/projeto-pgxn/#comments</comments>
		<pubDate>Fri, 13 Aug 2010 22:29:57 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[PostgreSQL]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=665</guid>
		<description><![CDATA[Todo usuário do PostgreSQL deveria conhecer o PgFoundry, lar de inúmeros projetos e extensões que tornam o nosso banco de dados ainda mais poderoso. Muitos programadores já devem ter ouvido falar do CPAN, um repositório com mais de 20 mil &#8230; <a href="http://www.midstorm.org/~telles/2010/08/13/projeto-pgxn/">Continuar lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Todo usuário do PostgreSQL deveria conhecer o <a href="http://pgfoundry.org/">PgFoundry</a>, lar de inúmeros projetos e extensões que tornam o nosso banco de dados ainda mais poderoso. Muitos programadores já devem ter ouvido falar do <a href="http://www.cpan.org/">CPAN</a>, um repositório com mais de 20 mil  módulos para o <a href="http://www.perl.org/">PERL</a>. Pois bem, o pessoal da PGExperts teve a ideia de criar um repositório no mesmo estilo para o Postgres.</p>
<p>Esta com certeza é uma funcionalidade muito interessante para a comunidade como um todo, além de facilitar a vida de muita gente. Mas é aí que VOCÊ entra. Eles montaram um site e estão pedindo a doação para financiar o desenvolvimento desta ferramenta.</p>
<p>A doação pode ser algo vultoso como USD5000 ou algo simples como 25 dólares. Então você, que sempre diz que gostaria de ajudar a comunidade, mas não tem tempo ou diz que não conhece tão bem assim programação e coisa e tal&#8230; chegou a sua vez de retribuir um pouco e fazer a sua doação.</p>
<p>Um dia nós brasileiros precisamos perder aquela fama de sanguessugas do Software Livre. Eu já fiz, <a href="http://pgxn.org/contributors.html">minha doação</a>, agora é a sua vez. Conheça o projeto e faça a sua parte:</p>
<h3><a href="http://pgxn.org/">PostgreSQL Extension network</a></h3>
]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2010/08/13/projeto-pgxn/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Enviando e-mail autenticado pelo Oracle</title>
		<link>http://www.midstorm.org/~telles/2010/05/28/enviando-e-mail-autenticado-pelo-oracle/</link>
		<comments>http://www.midstorm.org/~telles/2010/05/28/enviando-e-mail-autenticado-pelo-oracle/#comments</comments>
		<pubDate>Fri, 28 May 2010 18:56:44 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=657</guid>
		<description><![CDATA[Enviar e-mail utilizando PL/SQL dentro do Oracle é realmente uma tarefa razoavelmente simples com o UTL_SMTP ou mesmo com o UTL_TCP. O que não aparece de forma simples na documentação é como mandar um e-mail com usuário e senha autenticados. &#8230; <a href="http://www.midstorm.org/~telles/2010/05/28/enviando-e-mail-autenticado-pelo-oracle/">Continuar lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Enviar e-mail utilizando PL/SQL dentro do Oracle é realmente uma tarefa razoavelmente simples com o UTL_SMTP ou mesmo com o UTL_TCP. O que não aparece de forma simples na documentação é como mandar um e-mail com usuário e senha autenticados.</p>
<p>Bom, não é algo do outro mundo, mas segue aqui um pequeno script que mostra como fazer isso. Você só precisa editar os parâmetros iniciais e só chamando ele, já temos um teste. Depois é só passar o assunto e mensagem como parâmetro na procedure e você já pode enviar seus alertas para todo mundo.</p>
<p>Segue abaixo o script:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">&nbsp;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">OR</span> <span style="color: #993333; font-weight: bold;">REPLACE</span> <span style="color: #993333; font-weight: bold;">PROCEDURE</span> envia_email<span style="color: #66cc66;">&#40;</span>
  p_assunto          VARCHAR2      :<span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'Teste de envio'</span><span style="color: #66cc66;">,</span>
  p_mensagem         <span style="color: #993333; font-weight: bold;">CLOB</span>          :<span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'Teste'</span>
<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">IS</span>
  v_remetente        VARCHAR2<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">50</span><span style="color: #66cc66;">&#41;</span>  :<span style="color: #66cc66;">=</span><span style="color: #ff0000;">'fabio.telles@midstorm.org'</span>;  <span style="color: #808080; font-style: italic;">-- Remetente</span>
  v_destinatario     VARCHAR2<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">50</span><span style="color: #66cc66;">&#41;</span>  :<span style="color: #66cc66;">=</span><span style="color: #ff0000;">'cliente@midstorm.org'</span>;       <span style="color: #808080; font-style: italic;">-- Destinatário</span>
  v_destinatario_cc  VARCHAR2<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">50</span><span style="color: #66cc66;">&#41;</span>  :<span style="color: #66cc66;">=</span><span style="color: #ff0000;">'dba@savepoint.org'</span>;          <span style="color: #808080; font-style: italic;">-- Com cópia</span>
  v_smtp             VARCHAR2<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">20</span><span style="color: #66cc66;">&#41;</span>  :<span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'192.168.0.1'</span>;               <span style="color: #808080; font-style: italic;">-- Endereco IP do SMTP</span>
  v_smtp_user        VARCHAR2<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">50</span><span style="color: #66cc66;">&#41;</span>  :<span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'dba@midstorm.org'</span>;          <span style="color: #808080; font-style: italic;">-- Usuário autenticado no SMTP</span>
  v_smtp_user_pass   VARCHAR2<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">50</span><span style="color: #66cc66;">&#41;</span>  :<span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'sua_senha'</span>;                 <span style="color: #808080; font-style: italic;">-- Senha do usuário SMTP</span>
  v_conn             utl_smtp<span style="color: #66cc66;">.</span>connection;                          <span style="color: #808080; font-style: italic;">-- Abre conexão SMTP e HTTP</span>
<span style="color: #993333; font-weight: bold;">BEGIN</span>
  <span style="color: #808080; font-style: italic;">-- Abre conexão com um Servidor SMTP, porta padrão é 25</span>
  v_conn :<span style="color: #66cc66;">=</span> utl_smtp<span style="color: #66cc66;">.</span>open_connection <span style="color: #66cc66;">&#40;</span>v_smtp<span style="color: #66cc66;">,</span><span style="color: #cc66cc;">25</span><span style="color: #66cc66;">&#41;</span>;
  utl_smtp<span style="color: #66cc66;">.</span>helo <span style="color: #66cc66;">&#40;</span>v_conn<span style="color: #66cc66;">,</span> v_smtp<span style="color: #66cc66;">&#41;</span>;
  utl_smtp<span style="color: #66cc66;">.</span>command <span style="color: #66cc66;">&#40;</span>v_conn<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'AUTH LOGIN'</span><span style="color: #66cc66;">&#41;</span>;
  utl_smtp<span style="color: #66cc66;">.</span>command <span style="color: #66cc66;">&#40;</span>v_conn<span style="color: #66cc66;">,</span> utl_raw<span style="color: #66cc66;">.</span>cast_to_varchar2<span style="color: #66cc66;">&#40;</span>utl_encode<span style="color: #66cc66;">.</span>base64_encode<span style="color: #66cc66;">&#40;</span>
    utl_raw<span style="color: #66cc66;">.</span>cast_to_raw<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>v_smtp_user<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
  utl_smtp<span style="color: #66cc66;">.</span>command <span style="color: #66cc66;">&#40;</span>v_conn<span style="color: #66cc66;">,</span> utl_raw<span style="color: #66cc66;">.</span>cast_to_varchar2<span style="color: #66cc66;">&#40;</span>utl_encode<span style="color: #66cc66;">.</span>base64_encode<span style="color: #66cc66;">&#40;</span>
    utl_raw<span style="color: #66cc66;">.</span>cast_to_raw<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>v_smtp_user_pass<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
  utl_smtp<span style="color: #66cc66;">.</span>mail <span style="color: #66cc66;">&#40;</span>v_conn<span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'&lt;'</span> <span style="color: #66cc66;">||</span> v_remetente <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">'&gt;'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
  utl_smtp<span style="color: #66cc66;">.</span>rcpt <span style="color: #66cc66;">&#40;</span>v_conn<span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'&lt;'</span> <span style="color: #66cc66;">||</span> v_destinatario <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">'&gt;'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
  utl_smtp<span style="color: #66cc66;">.</span>rcpt <span style="color: #66cc66;">&#40;</span>v_conn<span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'&lt;'</span> <span style="color: #66cc66;">||</span> v_destinatario_cc <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">'&gt;'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
  utl_smtp<span style="color: #66cc66;">.</span>open_data<span style="color: #66cc66;">&#40;</span>v_conn<span style="color: #66cc66;">&#41;</span>;
  utl_smtp<span style="color: #66cc66;">.</span>write_raw_data<span style="color: #66cc66;">&#40;</span>v_conn<span style="color: #66cc66;">,</span> utl_raw<span style="color: #66cc66;">.</span>cast_to_raw<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'From:'</span>    <span style="color: #66cc66;">||</span> v_remetente  
    <span style="color: #66cc66;">||</span> utl_tcp<span style="color: #66cc66;">.</span>crlf<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
  utl_smtp<span style="color: #66cc66;">.</span>write_raw_data<span style="color: #66cc66;">&#40;</span>v_conn<span style="color: #66cc66;">,</span> utl_raw<span style="color: #66cc66;">.</span>cast_to_raw<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'To:'</span>      <span style="color: #66cc66;">||</span> v_destinatario 
    <span style="color: #66cc66;">||</span> utl_tcp<span style="color: #66cc66;">.</span>crlf<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
  utl_smtp<span style="color: #66cc66;">.</span>write_raw_data<span style="color: #66cc66;">&#40;</span>v_conn<span style="color: #66cc66;">,</span> utl_raw<span style="color: #66cc66;">.</span>cast_to_raw<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Cc:'</span>      <span style="color: #66cc66;">||</span> v_destinatario_cc 
    <span style="color: #66cc66;">||</span> utl_tcp<span style="color: #66cc66;">.</span>crlf<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
  utl_smtp<span style="color: #66cc66;">.</span>write_raw_data<span style="color: #66cc66;">&#40;</span>v_conn<span style="color: #66cc66;">,</span> utl_raw<span style="color: #66cc66;">.</span>cast_to_raw<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Subject:'</span> <span style="color: #66cc66;">||</span> p_assunto 		
    <span style="color: #66cc66;">||</span> utl_tcp<span style="color: #66cc66;">.</span>crlf<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>; 
  utl_smtp<span style="color: #66cc66;">.</span>write_raw_data<span style="color: #66cc66;">&#40;</span>v_conn<span style="color: #66cc66;">,</span> utl_raw<span style="color: #66cc66;">.</span>cast_to_raw<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">' '</span>        <span style="color: #66cc66;">||</span> utl_tcp<span style="color: #66cc66;">.</span>crlf<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
  utl_smtp<span style="color: #66cc66;">.</span>write_raw_data<span style="color: #66cc66;">&#40;</span>v_conn<span style="color: #66cc66;">,</span> utl_raw<span style="color: #66cc66;">.</span>cast_to_raw<span style="color: #66cc66;">&#40;</span>utl_tcp<span style="color: #66cc66;">.</span>crlf <span style="color: #66cc66;">||</span> p_mensagem<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>; 
&nbsp;
  utl_smtp<span style="color: #66cc66;">.</span>CLOSE_DATA<span style="color: #66cc66;">&#40;</span>v_conn<span style="color: #66cc66;">&#41;</span>;
  utl_smtp<span style="color: #66cc66;">.</span>QUIT <span style="color: #66cc66;">&#40;</span>v_conn<span style="color: #66cc66;">&#41;</span>;
&nbsp;
EXCEPTION
  <span style="color: #993333; font-weight: bold;">WHEN</span> OTHERS <span style="color: #993333; font-weight: bold;">THEN</span>
    utl_smtp<span style="color: #66cc66;">.</span>quit <span style="color: #66cc66;">&#40;</span>v_conn<span style="color: #66cc66;">&#41;</span>;
    RAISE_APPLICATION_ERROR<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">-</span><span style="color: #cc66cc;">20011</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'Não foi possível enviar o e-mail devido ao seguinte erro: '</span> 
      <span style="color: #66cc66;">||</span> sqlerrm<span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">END</span> ENVIA_EMAIL;</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2010/05/28/enviando-e-mail-autenticado-pelo-oracle/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

