<?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>Carlan+Calazans &#187; sqlite</title>
	<atom:link href="http://carlancalazans.com/tag/sqlite/feed/" rel="self" type="application/rss+xml" />
	<link>http://carlancalazans.com</link>
	<description>{ Às vezes eu sonho com códigos }</description>
	<lastBuildDate>Thu, 22 Apr 2010 03:20:11 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Triggers no SQLITE</title>
		<link>http://carlancalazans.com/triggers-no-sqlite/</link>
		<comments>http://carlancalazans.com/triggers-no-sqlite/#comments</comments>
		<pubDate>Fri, 06 Mar 2009 03:24:41 +0000</pubDate>
		<dc:creator>Carlan Calazans</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[aprendizado]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[dica]]></category>
		<category><![CDATA[pesquisa]]></category>
		<category><![CDATA[sqlite]]></category>
		<category><![CDATA[trigger]]></category>

		<guid isPermaLink="false">http://carlancalazans.com/?p=157</guid>
		<description><![CDATA[Esta semana um grande amigo twitou uma pergunta que me chamou atenção. Já tinha estudado sobre o assunto a alguns anos atrás para utilizar em um sistema. Foi dai que veio a idéia para este post, peguei os meus rascunhos e comecei a escrever.
O banco de dados SQLITE, em sua versão atual, não possui suporte [...]]]></description>
			<content:encoded><![CDATA[<p>Esta semana um <a href="http://www.leocabral.com.br">grande</a> <a href="http://twitter.com/lcquadros">amigo</a> <a href="http://twitter.com/lcquadros/status/1275497421">twitou</a> uma pergunta que me chamou atenção. Já tinha estudado sobre o assunto a alguns anos atrás para utilizar em um sistema. Foi dai que veio a idéia para este post, peguei os meus rascunhos e comecei a escrever.</p>
<p>O banco de dados <a href="http://www.sqlite.org">SQLITE</a>, em sua <a href="http://www.sqlite.org/releaselog/3_6_11.html">versão atual</a>, não possui suporte a <a href="http://pt.wikipedia.org/wiki/Integridade_referencial">integridade referencial</a>. Nunca consegui entender o motivo, já que bancos similares como <a href="http://www.h2database.com">h2</a> e <a href="http://hsqldb.org">HSQLDB</a> possuem. Talvez não implementaram a funcionalidade ainda por que existe uma outra alternativa. Uma forma de driblar essa limitação é através de <a href="http://pt.wikipedia.org/wiki/Gatilho_(banco_de_dados)">triggers</a>. Um trigger é disparado quando um evento ocorre. É possível deletar os registros filhos relacionados com uma tabela pai, por exemplo. O evento neste caso, para ficar bem claro, é a remoção de um registro da tabela pai.</p>
<p>A sintaxe básica para a criação de um trigger é:</p>
<div class="codecolorer-container sql vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TRIGGER</span> nome_da_trigger<br />
<span style="color: #66cc66;">&#123;</span> BEFORE <span style="color: #66cc66;">|</span> AFTER <span style="color: #66cc66;">|</span> INSTEAD OF <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#123;</span> <span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #66cc66;">|</span> <span style="color: #993333; font-weight: bold;">UPDATE</span> OF <span style="color: #66cc66;">|</span> <span style="color: #993333; font-weight: bold;">DELETE</span> <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #66cc66;">&#125;</span><br />
BEGIN<br />
<span style="color: #66cc66;">&#123;</span> SQL STATEMENT <span style="color: #66cc66;">&#125;</span><br />
END;</div></div>
<p>Para praticar, criei as tabelas abaixo. Se você for preguiçoso como eu, pode baixar o arquivo do banco de dados direto <a href="http://files.carlancalazans.com/sqlite/exemplo.zip">daqui</a>. É um exemplo bem simples, se você já for um expert em banco de dados (ou um dba), nada do que vou mostrar é novidade.</p>
<div class="codecolorer-container sql vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">BEGIN TRANSACTION;<br />
<br />
<span style="color: #808080; font-style: italic;">-- users table</span><br />
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> users <span style="color: #66cc66;">&#40;</span>id integer <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span><span style="color: #66cc66;">,</span> login text<span style="color: #66cc66;">,</span> password text<span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #808080; font-style: italic;">-- tasks table</span><br />
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> tasks <span style="color: #66cc66;">&#40;</span>id integer <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span><span style="color: #66cc66;">,</span> user_id integer<span style="color: #66cc66;">,</span> name text<span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #808080; font-style: italic;">-- logs table</span><br />
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> logs<span style="color: #66cc66;">&#40;</span>id integer <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span><span style="color: #66cc66;">,</span> event text<span style="color: #66cc66;">,</span> created_at datetime <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #66cc66;">&#40;</span>datetime<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'now'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'localtime'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #808080; font-style: italic;">-- counts table</span><br />
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> counts<span style="color: #66cc66;">&#40;</span>id integer <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span><span style="color: #66cc66;">,</span> name text<span style="color: #66cc66;">,</span> value integer<span style="color: #66cc66;">&#41;</span>;<br />
<br />
<span style="color: #808080; font-style: italic;">-- data</span><br />
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;users&quot;</span> <span style="color: #993333; font-weight: bold;">VALUES</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'admin'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'admin'</span><span style="color: #66cc66;">&#41;</span>;<br />
<br />
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;tasks&quot;</span> <span style="color: #993333; font-weight: bold;">VALUES</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'Entender triggers no sqlite'</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;tasks&quot;</span> <span style="color: #993333; font-weight: bold;">VALUES</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'Aprender a voar'</span><span style="color: #66cc66;">&#41;</span>;<br />
<br />
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;counts&quot;</span> <span style="color: #993333; font-weight: bold;">VALUES</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'users'</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;counts&quot;</span> <span style="color: #993333; font-weight: bold;">VALUES</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'tasks'</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>;<br />
<br />
COMMIT;</div></div>
<p>Agora vem a parte interessante. Vejamos como inserir um registro na tabela logs toda vez que um usuário for criado. O trigger é &#8220;colocado&#8221; na tabela users e, toda vez, após ocorrer um insert o trigger é disparado.</p>
<div class="codecolorer-container sql vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">-- after insert user trigger</span><br />
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TRIGGER</span> user_insert<br />
after <span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">ON</span> users<br />
begin<br />
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> logs <span style="color: #66cc66;">&#40;</span>event<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;New user created&quot;</span><span style="color: #66cc66;">&#41;</span>;<br />
end;</div></div>
<p>Faça o teste. Termine de inserir outros usuários e verifique a tabela logs.</p>
<div class="codecolorer-container sql vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;users&quot;</span> <span style="color: #993333; font-weight: bold;">VALUES</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'user'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'user'</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;users&quot;</span> <span style="color: #993333; font-weight: bold;">VALUES</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'test'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'test'</span><span style="color: #66cc66;">&#41;</span>;<br />
<br />
<span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> logs;</div></div>
<p>O trigger acima monitora a operação insert e adiciona um registro em outra tabela. Agora um exemplo que monitora a mesma operação, mas realiza o update em outra tabela.</p>
<div class="codecolorer-container sql vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">-- update users count</span><br />
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TRIGGER</span> update_users_count<br />
after <span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">ON</span> users<br />
begin<br />
<span style="color: #993333; font-weight: bold;">UPDATE</span> counts <span style="color: #993333; font-weight: bold;">SET</span> value <span style="color: #66cc66;">=</span> value <span style="color: #66cc66;">+</span> <span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">WHERE</span> name <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;users&quot;</span>;<br />
end;<br />
<br />
<span style="color: #808080; font-style: italic;">-- test again</span><br />
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;users&quot;</span> <span style="color: #993333; font-weight: bold;">VALUES</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'delete'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'me'</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;users&quot;</span> <span style="color: #993333; font-weight: bold;">VALUES</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'highlander'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'therecanbeonlyone'</span><span style="color: #66cc66;">&#41;</span>;</div></div>
<p>Para o exemplo de integridade referencial, maiores informações no início do post, o trigger realiza o delete em todos os registros (for each row) relacionados com a tabela pai. Neste exemplo a tabela pai é users e a filha é tasks. A referência feita a old significa o valor atual do iterator no loop.</p>
<div class="codecolorer-container sql vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">-- before delete user trigger</span><br />
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TRIGGER</span> user_delete<br />
before <span style="color: #993333; font-weight: bold;">DELETE</span> <span style="color: #993333; font-weight: bold;">ON</span> users<br />
<span style="color: #993333; font-weight: bold;">FOR</span> each row<br />
begin<br />
<span style="color: #993333; font-weight: bold;">DELETE</span> <span style="color: #993333; font-weight: bold;">FROM</span> tasks <span style="color: #993333; font-weight: bold;">WHERE</span> tasks<span style="color: #66cc66;">.</span>user_id<span style="color: #66cc66;">=</span>old<span style="color: #66cc66;">.</span>id;<br />
end;<br />
<br />
<span style="color: #808080; font-style: italic;">-- test</span><br />
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;tasks&quot;</span> <span style="color: #993333; font-weight: bold;">VALUES</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'Ganhar na mega-sena'</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;tasks&quot;</span> <span style="color: #993333; font-weight: bold;">VALUES</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'Delete me'</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;tasks&quot;</span> <span style="color: #993333; font-weight: bold;">VALUES</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'Dominar o mundo'</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;tasks&quot;</span> <span style="color: #993333; font-weight: bold;">VALUES</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">6</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'Test task'</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;tasks&quot;</span> <span style="color: #993333; font-weight: bold;">VALUES</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">7</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'Hello world'</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;tasks&quot;</span> <span style="color: #993333; font-weight: bold;">VALUES</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">8</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'Buy new car'</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;tasks&quot;</span> <span style="color: #993333; font-weight: bold;">VALUES</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">9</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'Drink more'</span><span style="color: #66cc66;">&#41;</span>;</div></div>
<p>Delete o usuário de id número 4 e veja o que acontece.</p>
<p>Pra finalizar, recomendo a todos <a href="http://files.carlancalazans.com/sqlite/exemplo.zip">baixar o arquivo de exemplo</a> e fuçar. Esta solução pode não atender a todos, já que para deletar 1000000 registros filhos, dependendo o seu hardware, o processo pode ser custoso. Não tenho um conhecimento tão profundo sobre engines de banco de dados para explicar como seria feito utilizando um banco com suporte a integridade referencial, portanto, leve isso em consideração ao interpretar a afirmação acima.</p>
<p>De qualquer forma, o uso do SQLITE só deve ser feito em protótipos ou em aplicações cujo os dados não são de muita importância. Caso os dados de sua aplicação sejam muito importantes, geralmente são, você deveria procurar outra alternativa.</p>
<p>Enfim, pelo menos, deu pra brincar um pouco.</p>
<p>Referências:<a href="     * http://www.sqlite.org/lang_createtrigger.html  "><br />
</a></p>
<ul>
<li><a href="     * http://www.sqlite.org/lang_createtrigger.html  ">http://www.sqlite.org/lang_createtrigger.html</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://carlancalazans.com/triggers-no-sqlite/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
