<?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>Diário de um DBA &#187; job</title>
	<atom:link href="http://silasmendes.com/dba/tag/job/feed" rel="self" type="application/rss+xml" />
	<link>http://silasmendes.com/dba</link>
	<description>Tecnologia &#38; Banco de Dados</description>
	<lastBuildDate>Sun, 15 Apr 2012 12:20:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Automatizando tarefas via script</title>
		<link>http://silasmendes.com/dba/adicionando-job-via-script</link>
		<comments>http://silasmendes.com/dba/adicionando-job-via-script#comments</comments>
		<pubDate>Tue, 02 Mar 2010 21:27:58 +0000</pubDate>
		<dc:creator>Silas Mendes</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[SQL SERVER 2000]]></category>
		<category><![CDATA[SQL SERVER 2005]]></category>
		<category><![CDATA[SQL SERVER 2008]]></category>
		<category><![CDATA[SQL SERVER 2008 R2]]></category>
		<category><![CDATA[Backup]]></category>
		<category><![CDATA[job]]></category>
		<category><![CDATA[MSDE]]></category>
		<category><![CDATA[schedule]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[SQL Agent]]></category>
		<category><![CDATA[sysjobs]]></category>

		<guid isPermaLink="false">http://silasmendes.com/dba/?p=515</guid>
		<description><![CDATA[Na época em que o MSDE estava em alta, muitos amigos vinham pedir dicas de como criar uma rotina automática de backups e etc, o maior impasse era sempre a falta de uma interface gráfica. Ao contrário das novas versões &#8230; <a href="http://silasmendes.com/dba/adicionando-job-via-script">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><strong><br />
</strong></p>
<p>Na época em que o MSDE estava em alta, muitos amigos vinham pedir dicas de como criar uma rotina automática de backups e etc, o maior impasse era sempre a falta de uma interface gráfica.</p>
<p>Ao contrário das novas versões do SQL Server Express, o MSDE possuía o serviço SQL Agent que permite agendar rotinas, backups, etc, e isso era ótimo, mas a barreira era saber como utilizar essa funcionalidade sem uma ferramenta.</p>
<p>Mas enfim, o foco desse texto não é o MSDE, até porque, com o tempo foram disponibilizadas algumas ferramentas para suprir algumas necessidades. A idéia principal é verificarmos como criar uma nova tarefa (job) e automatiza-la utilizando scripts no SQL Server.</p>
<p>Analisando um pouco veremos que precisamos apenas de 4 procedures para criação de um job: <strong>sp_add_job</strong>, <strong>sp_add_jobstep</strong>, <strong>sp_add_jobserver</strong> e <strong>sp_add_jobschedule</strong>. No nosso texto vamos utilizar como exemplo um cenário onde precisamos automatizar o backup da base de dados <em>Master</em>. Vamos analisar agora cada uma das procedures:</p>
<ul>
<li><strong>sp_add_job</strong></li>
</ul>
<p>Esta procedure adiciona um novo registro à tabela <strong>sysjobs</strong>, em linhas gerais, este registro é o nosso job, porém um job sem qualquer funcionalidade e sem agendamento. Inicialmente um job nessas condições não tem qualquer utilidade. Abaixo podemos verificar a criação de um job vazio com o título Backup MASTER:</p>
<pre class="brush: sql; title: ; notranslate">
execute sp_add_job @job_name = 'Backup MASTER'
</pre>
<ul>
<li><strong>sp_add_jobstep</strong></li>
</ul>
<p>Para darmos “vida” ao job criado anteriormente, precisamos adicionar funcionalidades a ele, por exemplo: um passo onde será executado o script de backup.  Para adicionar funcionalidades ao job <strong>Backup MASTER</strong> precisamos conhecer seu código gravado na <em>sysjobs</em>, para isso podemos executar o seguinte comando:</p>
<pre class="brush: sql; title: ; notranslate">
select  job_id
from  sysjobs
where name = 'Backup MASTER'
</pre>
<p>O resultado será um big código! Isso porque o código gerado é do tipo UNIQUEIDENTIFIER, popularmente conhecido como <em>Identificador Universal</em>.  O resultado da minha consulta é: <strong>7EC785F2-36D7-4BEB-B2E4-BFC38E7F4D31 </strong>(é mais prático trabalhar com conteúdos deste tipo armazenando-o numa variável, porém, neste texto iremos aborda-lo explicitamente em cada passo dos exemplos).</p>
<p>Ok. Agora vamos utilizar este big-código junto com a <strong>sp_add_jobstep</strong> para adicionarmos funcionalidade ao nosso JOB:</p>
<pre class="brush: sql; title: ; notranslate">
-- Adiciona função ao Job
execute sp_add_jobstep @job_id = '7EC785F2-36D7-4BEB-B2E4-BFC38E7F4D31',
     @step_name = 'Script Backup Master',
     @command = 'backup master to disk = ''c:\master.bak'''
</pre>
<p>Observe que utilizamos três parâmetros junto à <strong>sp_add_jobstep</strong>: o código do job (@job_id), o nome da funcionalidade (@step_name) e finalmente o script de backup no parâmetro @command.</p>
<p>É interessante esclarecer que um job pode ter inúmeros passos/tarefas, logo você poderá utilizar esta procedure quantas vezes forem necessárias para adicionar novos passos a um mesmo job.</p>
<ul>
<li><strong>sp_add_jobserver</strong></li>
</ul>
<p>Agora vem o passo mais “abstrato” desse processo. Após criarmos o job e definir suas funções precisamos definir em qual servidor ele irá operar. Pressupõe-se que se o job foi criado no servidor &lt;strong&gt;X&lt;/strong&gt; que ele deverá ser executado no contexto deste servidor, porém, aqui nós temos que explicitar isto, logo, precisaremos executar a procedure <strong>sp_add_jobserver </strong>e configurar o job para rodar no contexto do servidor local:</p>
<pre class="brush: sql; title: ; notranslate">
execute sp_add_jobserver
     @job_id = '7EC785F2-36D7-4BEB-B2E4-BFC38E7F4D31',
     @server_name = N'(local)'
</pre>
<p>Pronto!</p>
<p>Neste momento nosso job já tem uma forma e já pode ser executado.</p>
<p>Se quisermos testar a execução manualmente, podemos executar o seguinte comando:</p>
<pre class="brush: sql; title: ; notranslate"> sp_start_job 'Backup MASTER'</pre>
<p>Resultado:</p>
<p><strong>Job &#8216;Backup MASTER&#8217; started successfully.</strong></p>
<p>Vejam que nosso job foi executado com sucesso e que o arquivo foi criado:</p>
<p style="text-align: center;"><a href="http://silasmendes.com/dba/wp-content/uploads/2010/03/jobExecutado.png"><img class="size-medium wp-image-516 aligncenter" title="jobExecutado" src="http://silasmendes.com/dba/wp-content/uploads/2010/03/jobExecutado-300x35.png" alt="" width="300" height="35" /></a></p>
<ul>
<li><strong>sp_add_jobschedule</strong></li>
</ul>
<p>Considerando que a principal funcionalidade do SQL Server Agent e seus jobs é <strong>automatizar tarefas</strong>, não há muito sentindo em executar jobs manualmente, logo, precisamos criar um agendamento para nosso job e assim partimos para a última etapa deste processo onde recorremos à procedure <strong>sp_add_jobschedule</strong>:</p>
<pre class="brush: sql; title: ; notranslate">
execute sp_add_jobschedule
     @job_id = '7EC785F2-36D7-4BEB-B2E4-BFC38E7F4D31',
     @name = N'Agenda Backup',
     @freq_type = 4,
     @active_start_time = 120000,
     @freq_interval = 1
</pre>
<p>O comando pode parecer complexo, mas analisando com calma veremos que é bem tranquilo. Vamos analisar cada um dos parâmetros separadamente:</p>
<p>No <strong>@job_id</strong> definimos para qual job estamos criando o agendamento utilizando o &#8220;big-código&#8221;.</p>
<p>Em <strong>@name</strong> atribuímos um nome para o nosso agendamento.</p>
<p>Em<strong> @freq_type</strong> temos as seguintes possibilidades:</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="288" valign="top"><strong>@freq_type</strong></td>
<td width="288" valign="top"><strong>Frequência de Execução</strong></td>
</tr>
<tr>
<td width="288" valign="top">1</td>
<td width="288" valign="top">somente uma vez</td>
</tr>
<tr>
<td width="288" valign="top">4</td>
<td width="288" valign="top">Diariamente</td>
</tr>
<tr>
<td width="288" valign="top">8</td>
<td width="288" valign="top">Semanalmente</td>
</tr>
<tr>
<td width="288" valign="top">16</td>
<td width="288" valign="top">Mensalmente</td>
</tr>
</tbody>
</table>
<p>No nosso script <strong>@freq_type </strong>= 4, logo, o comando indica que o job será executado diariamente.</p>
<p>Em <strong>@active_start_time</strong> definimos o horário da execução, no nosso exemplo 12:00:00, sem os sinais de separação entre horas, minutos e segundos. Se o conteúdo desse parâmetro fosse 215600, o job seria executado às 09:56 da noite.</p>
<p>Por fim temos o parâmetro <strong>@freq_interval</strong> que está diretamente atrelado ao parâmetro <strong>@freq_type</strong> e foi definido como <strong>1</strong> porque nosso backup será executado todos os dias.</p>
<p>(Pode ser complexo definir valor para o parâmetro <em>@freq_interval</em>, mas não iremos nos aprofundar nele neste momento. Para entender sua composição consulte: <a href="http://msdn.microsoft.com/pt-br/library/ms366342.aspx">http://msdn.microsoft.com/pt-br/library/ms366342.aspx</a>)</p>
<p>Para verificar todos os parâmetros das procedures listadas acima, digite por exemplo:</p>
<pre class="brush: sql; title: ; notranslate"> sp_help sp_add_jobschedule </pre>
<ul>
<li><strong>CONCLUSÃO</strong></li>
</ul>
<p>Neste texto podemos notar que automatizar tarefas via script não é uma tarefa tão árdua, mas sem dúvidas, na maioria<br />
dos cenários, a utilização de uma ferramenta gráfica proporcionará maior produtividade; porém se um dia você se deparar com um MSDE ou situação semelhante, irá lembrar que com basicamente 4 passos é possível automatizar suas rotinas.</p>
]]></content:encoded>
			<wfw:commentRss>http://silasmendes.com/dba/adicionando-job-via-script/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

