<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2enclosuresfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>SQL From Hell.com</title>
	
	<link>http://sqlfromhell.wordpress.com</link>
	<description>Um nome bem intuitivo para muita informação!</description>
	<lastBuildDate>Fri, 18 May 2012 18:12:43 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain="sqlfromhell.wordpress.com" port="80" path="/?rsscloud=notify" registerProcedure="" protocol="http-post" />
<image>
		<url>http://0.gravatar.com/blavatar/eb38953921d0776db31e264c512cfca8?s=96&amp;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>SQL From Hell.com</title>
		<link>http://sqlfromhell.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://sqlfromhell.wordpress.com/osd.xml" title="SQL From Hell.com" />
	
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/SqlFromHell" /><feedburner:info uri="sqlfromhell" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://sqlfromhell.wordpress.com/?pushpress=hub" /><media:category scheme="http://www.itunes.com/dtds/podcast-1.0.dtd">Technology/Software How-To</media:category><itunes:explicit>no</itunes:explicit><itunes:subtitle>Um nome bem intuitivo para muita informação!</itunes:subtitle><itunes:category text="Technology"><itunes:category text="Software How-To" /></itunes:category><item>
		<title>Três anos de blog | Pausa para o mestrado</title>
		<link>http://feedproxy.google.com/~r/SqlFromHell/~3/ZLejXKl9fb0/</link>
		<comments>http://sqlfromhell.wordpress.com/2012/05/08/tres-anos-de-blog-pausa-para-o-mestrado/#comments</comments>
		<pubDate>Tue, 08 May 2012 13:00:16 +0000</pubDate>
		<dc:creator>Paulo R. Pereira</dc:creator>
				<category><![CDATA[Sem Categoria]]></category>

		<guid isPermaLink="false">https://sqlfromhell.wordpress.com/?p=4092</guid>
		<description><![CDATA[Então pessoas, três anos de blog e agora o blog ficará um pouco órfão, pois nesta oportunidade do Mestrado, eu estarei deixando de lado minha carreira técnica na área de TI, para atuar como acadêmico na área da Administração. Neste momento que tenho que me dedicar às varias atividades do mestrado (aulas, leituras, artigos, seminários, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sqlfromhell.wordpress.com&#038;blog=7423972&#038;post=4092&#038;subd=sqlfromhell&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Então pessoas, três anos de blog e agora o blog ficará um pouco órfão, pois nesta oportunidade do Mestrado, eu estarei deixando de lado minha carreira técnica na área de TI, para atuar como acadêmico na área da Administração.</p>
<p>Neste momento que tenho que me dedicar às varias atividades do mestrado (aulas, leituras, artigos, seminários, reuniões, pesquisas&#8230;) e manter o mesmo desempenho no trabalho, não estarei escrevendo mais no blog, ou pelo menos não na mesma regularidade, mas continuarei respondendo as dúvidas que vocês têm enviado nos comentários ou por e-mail.</p>
<p><img src="http://sqlfromhell.files.wordpress.com/2012/04/042012_1600_trsanosdebl1.jpg?w=655" alt="" /></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sqlfromhell.wordpress.com/4092/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sqlfromhell.wordpress.com/4092/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sqlfromhell.wordpress.com/4092/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sqlfromhell.wordpress.com/4092/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/sqlfromhell.wordpress.com/4092/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/sqlfromhell.wordpress.com/4092/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/sqlfromhell.wordpress.com/4092/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/sqlfromhell.wordpress.com/4092/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sqlfromhell.wordpress.com/4092/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sqlfromhell.wordpress.com/4092/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sqlfromhell.wordpress.com/4092/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sqlfromhell.wordpress.com/4092/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sqlfromhell.wordpress.com/4092/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sqlfromhell.wordpress.com/4092/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sqlfromhell.wordpress.com&#038;blog=7423972&#038;post=4092&#038;subd=sqlfromhell&#038;ref=&#038;feed=1" width="1" height="1" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SqlFromHell?a=ZLejXKl9fb0:KTHiR5KGyNM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/SqlFromHell?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SqlFromHell/~4/ZLejXKl9fb0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sqlfromhell.wordpress.com/2012/05/08/tres-anos-de-blog-pausa-para-o-mestrado/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f03e5c495f2141f766e9a09eb9febb84?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">Paulo R. Pereira</media:title>
		</media:content>

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/04/042012_1600_trsanosdebl1.jpg" medium="image" />
	<feedburner:origLink>http://sqlfromhell.wordpress.com/2012/05/08/tres-anos-de-blog-pausa-para-o-mestrado/</feedburner:origLink></item>
		<item>
		<title>Aniversário de 3 anos do SQL From Hell!!</title>
		<link>http://feedproxy.google.com/~r/SqlFromHell/~3/aFm5tmHIpSk/</link>
		<comments>http://sqlfromhell.wordpress.com/2012/05/08/aniversario-de-3-anos-do-sql-from-hell/#comments</comments>
		<pubDate>Tue, 08 May 2012 09:00:20 +0000</pubDate>
		<dc:creator>Paulo R. Pereira</dc:creator>
				<category><![CDATA[Sem Categoria]]></category>
		<category><![CDATA[Virtual PASS BR]]></category>

		<guid isPermaLink="false">https://sqlfromhell.wordpress.com/?p=4084</guid>
		<description><![CDATA[Há três anos iniciou o SQL From Hell, sem muita perspectiva do que iria se tornar, e hoje, me surpreendo que um blog escrito em português sobre assuntos técnicos bem específicos, tenha conseguido ajudar tantas pessoas, além das várias críticas e elogios que tem recebidos. Procurei nestes três anos tratar assuntos que eu gosto, como SMO, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sqlfromhell.wordpress.com&#038;blog=7423972&#038;post=4084&#038;subd=sqlfromhell&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img src="http://sqlfromhell.files.wordpress.com/2012/04/040412_2106_aniversriod1.jpg?w=655" alt="" align="left" />Há três anos iniciou o SQL From Hell, sem muita perspectiva do que iria se tornar, e hoje, me surpreendo que um blog escrito em português sobre assuntos técnicos bem específicos, tenha conseguido ajudar tantas pessoas, além das várias críticas e elogios que tem recebidos.</p>
<p>Procurei nestes três anos tratar assuntos que eu gosto, como <a title="Trabalhando com SMO" href="http://sqlfromhell.wordpress.com/category/trabalhando-com-smo/" target="_blank">SMO</a>, <a title="Trabalhando com SQL CLR – Resumo" href="http://sqlfromhell.wordpress.com/2011/01/03/trabalhando-com-sql-clr/" target="_blank">SQL CLR</a>, <a title="Service Broker" href="http://sqlfromhell.wordpress.com/category/service-broker/" target="_blank">Service Broker</a>, <a title="Arte do FOR XML" href="http://sqlfromhell.wordpress.com/category/for-xml/" target="_blank">FOR XML</a> e <a title="XQuery" href="http://sqlfromhell.wordpress.com/category/xquery/" target="_blank">XQuery</a>, também artigos que escrevi com o objetivo de disponibilizar tutoriais para ajudar no dia-a-dia dos novos DBAs, como habilitar <a title="Habilitando SQL Authentication e o usuário “sa”" href="http://sqlfromhell.wordpress.com/2009/05/24/habilitando-sql-authentication-e-o-usuario-sa/" target="_blank">SQL Authentication</a>, <a title="Habilitando a conexão remota no SQL Server 2008" href="http://sqlfromhell.wordpress.com/2010/04/18/habilitando-o-acesso-remoto-no-sql-server-2008/" target="_blank">habilitar conexão remota</a>, <a title="Alterando as portas de conexão do SQL Server" href="http://sqlfromhell.wordpress.com/2009/09/05/portas-sql-server/" target="_blank">alterar as portas de conexão do SQL Server</a>, <a title="Usuários órfãos no SQL Server? Evite este problema!" href="http://sqlfromhell.wordpress.com/2010/09/29/usuario-orfao-sql-server/" target="_blank">usuários orfãos</a>, <a title="FUNÇÕES: Validação de CNPJ e CPF com T-SQL" href="http://sqlfromhell.wordpress.com/2009/11/19/validacao-de-cnpj-e-cpf/" target="_blank">scripts para validar CNPJ</a>, <a title="Trabalhando com JOIN (ou Junções)" href="http://sqlfromhell.wordpress.com/2009/09/15/trabalhando-com-join/" target="_blank">entender JOINs</a>, <a title="Script SQL de cidades e estados do Brasil, Argentina e Estados Unidos" href="http://sqlfromhell.wordpress.com/2012/03/08/script-sql-de-cidades-e-estados-do-brasil-argentina-e-estados-unidos/" target="_blank">scripts de cidades</a>, <a title="Dicionários de dados" href="http://sqlfromhell.wordpress.com/category/dicionarios-de-dados/" target="_blank">scripts para o dicionários de dados</a> e vários outros assuntos, que algumas vezes não estavam diretamente ligados com <a title="SQL Server" href="http://sqlfromhell.wordpress.com/tag/sql-server/">SQL Server</a>, como os tutoriais de <a title="NoSQL" href="http://sqlfromhell.wordpress.com/category/nosql/" target="_blank">NoSQL</a> e alguns artigos sobre <a title="Gestão" href="http://sqlfromhell.wordpress.com/category/gestao/" target="_blank">gestão</a> e <a title="Carreira" href="http://sqlfromhell.wordpress.com/tag/carreira/" target="_blank">carreira</a>.</p>
<p><strong>Obrigado todos aqueles que contribuíram com esta iniciativa!!!</strong></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sqlfromhell.wordpress.com/4084/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sqlfromhell.wordpress.com/4084/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sqlfromhell.wordpress.com/4084/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sqlfromhell.wordpress.com/4084/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/sqlfromhell.wordpress.com/4084/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/sqlfromhell.wordpress.com/4084/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/sqlfromhell.wordpress.com/4084/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/sqlfromhell.wordpress.com/4084/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sqlfromhell.wordpress.com/4084/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sqlfromhell.wordpress.com/4084/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sqlfromhell.wordpress.com/4084/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sqlfromhell.wordpress.com/4084/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sqlfromhell.wordpress.com/4084/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sqlfromhell.wordpress.com/4084/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sqlfromhell.wordpress.com&#038;blog=7423972&#038;post=4084&#038;subd=sqlfromhell&#038;ref=&#038;feed=1" width="1" height="1" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SqlFromHell?a=aFm5tmHIpSk:GXRmlMh6rbs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/SqlFromHell?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SqlFromHell/~4/aFm5tmHIpSk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sqlfromhell.wordpress.com/2012/05/08/aniversario-de-3-anos-do-sql-from-hell/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f03e5c495f2141f766e9a09eb9febb84?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">Paulo R. Pereira</media:title>
		</media:content>

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/04/040412_2106_aniversriod1.jpg" medium="image" />
	<feedburner:origLink>http://sqlfromhell.wordpress.com/2012/05/08/aniversario-de-3-anos-do-sql-from-hell/</feedburner:origLink></item>
		<item>
		<title>Trabalhando com SQL CLR – Resumo</title>
		<link>http://feedproxy.google.com/~r/SqlFromHell/~3/reHD6vuJvis/</link>
		<comments>http://sqlfromhell.wordpress.com/2012/04/20/trabalhando-com-sql-clr-resumo/#comments</comments>
		<pubDate>Fri, 20 Apr 2012 23:44:39 +0000</pubDate>
		<dc:creator>Paulo R. Pereira</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[Trabalhando com CLR]]></category>
		<category><![CDATA[Trabalhando com SQL CLR]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[CLR]]></category>
		<category><![CDATA[CSharp]]></category>
		<category><![CDATA[F#]]></category>
		<category><![CDATA[FSharp]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Visual Basic]]></category>
		<category><![CDATA[Web Services]]></category>

		<guid isPermaLink="false">http://sqlfromhell.wordpress.com/?p=4158</guid>
		<description><![CDATA[Então pessoas, uma das features que mais gosto do SQL Server é o suporte a CLR, que permite muitas possibilidades na criação de Stored Procedures, Funções, Types e Triggers com as linguagens C# e Visual Basic, e outras linguagens .NET, como o Delphi e F#. No blog, busquei explorar de forma introdutória como trabalhar com [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sqlfromhell.wordpress.com&#038;blog=7423972&#038;post=4158&#038;subd=sqlfromhell&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Então pessoas, uma das features que mais gosto do SQL Server é o suporte a CLR, que permite muitas possibilidades na criação de Stored Procedures, Funções, Types e Triggers com as linguagens C# e Visual Basic, e outras linguagens .NET, como o Delphi e F#.</p>
<p>No blog, busquei explorar de forma introdutória como trabalhar com esta feature e uma visão geral de cada objeto que é possível desenvolver. Em paralelo também tratei algumas extensibilidades, como trabalhar como F#, Web Services, referenciar projetos de terceiros nos projetos CLR e novidades no lançamento do Visual Studio 2010.</p>
<p><strong>Introdução:</strong></p>
<p>Este é um passo-a-passo de como iniciar com SQL CLR, desde questões mais á nível de SQL Server, até questões á nível de desenvolvimento (debug e publicação).</p>
<p>Integração SQL CLR no SQL Server – Uma Visão Geral <strong>[NOVO]</strong></p>
<p><strong><a title="Integração SQL CLR no SQL Server – Uma Visão Geral" href="http://sqlfromhell.wordpress.com/2012/04/20/integracao-sql-clr-no-sql-server-visao-geral/" target="_blank">http://sqlfromhell.wordpress.com/2012/04/20/integracao-sql-clr-no-sql-server-visao-geral/</a></strong></p>
<p>Habilitando CLR no SQL Server:</p>
<p><a href="http://sqlfromhell.wordpress.com/2009/09/19/habilitando-clr" target="_blank">http://sqlfromhell.wordpress.com/2009/09/19/habilitando-clr</a></p>
<p>Criando funções CLR para o SQL Server:</p>
<p><a href="http://sqlfromhell.wordpress.com/2009/09/26/funcoes-clr" target="_blank">http://sqlfromhell.wordpress.com/2009/09/26/funcoes-clr</a></p>
<p>Debug de funções CLR no SQL Server:</p>
<p><a href="http://sqlfromhell.wordpress.com/2009/10/03/debug-clr" target="_blank">http://sqlfromhell.wordpress.com/2009/10/03/debug-clr</a></p>
<p>Publicando Assemblies e Funções CLR no SQL Server:</p>
<p><a href="http://sqlfromhell.wordpress.com/2009/10/10/publicando-clr" target="_blank">http://sqlfromhell.wordpress.com/2009/10/10/publicando-clr</a></p>
<p>Publicando Assemblies no SQL Server pelo Visual Studio:</p>
<p><a href="http://sqlfromhell.wordpress.com/2010/05/15/publicando-assemblies-clr-no-sql-server-pelo-visual-studio" target="_blank">http://sqlfromhell.wordpress.com/2010/05/15/publicando-assemblies-clr-no-sql-server-pelo-visual-studio</a></p>
<p><strong>Visão Geral:</strong></p>
<p>Para quem quer conhecer cada um dos objetos que permitem desenvolvimento na integração SQL CLR, elaborei uma visão geral orientada á muitos exemplos de cada um.</p>
<p>Stored Procedure:</p>
<p><a href="http://sqlfromhell.wordpress.com/2010/07/03/clr-stored-procedure" target="_blank">http://sqlfromhell.wordpress.com/2010/07/03/clr-stored-procedure</a></p>
<p><a href="http://sqlfromhell.wordpress.com/2010/07/13/clr-stored-procedure-2" target="_blank">http://sqlfromhell.wordpress.com/2010/07/13/clr-stored-procedure-2</a></p>
<p>User Defined Function Scalar:</p>
<p><a href="http://sqlfromhell.wordpress.com/2010/07/25/trabalhando-com-clr-user-defined-function-scalar" target="_blank">http://sqlfromhell.wordpress.com/2010/07/25/trabalhando-com-clr-user-defined-function-scalar</a></p>
<p>Table-value User Defined Functions:</p>
<p><a href="http://sqlfromhell.wordpress.com/2010/12/02/sql-clr-table-value-user-defined-functions" target="_blank">http://sqlfromhell.wordpress.com/2010/12/02/sql-clr-table-value-user-defined-functions</a></p>
<p>User Defined Aggregate Functions:</p>
<p><a href="http://sqlfromhell.wordpress.com/2010/12/14/user-defined-aggregate-functions" target="_blank">http://sqlfromhell.wordpress.com/2010/12/14/user-defined-aggregate-functions</a></p>
<p>User Defined Type:</p>
<p><a href="http://sqlfromhell.wordpress.com/2010/12/22/sql-clr-user-defined-type" target="_blank">http://sqlfromhell.wordpress.com/2010/12/22/sql-clr-user-defined-type</a></p>
<p>Triggers:</p>
<p><a href="http://sqlfromhell.wordpress.com/2010/12/31/sql-clr-trigger" target="_blank">http://sqlfromhell.wordpress.com/2010/12/31/sql-clr-trigger</a></p>
<p><strong>Estendendo:</strong></p>
<p>Atendendo alguns pedidos e uma &#8220;aventura&#8221; pessoal (F#).</p>
<p>Web Services:</p>
<p><a href="http://sqlfromhell.wordpress.com/2010/03/07/webservice-e-funes-clr-no-sql-server" target="_blank">http://sqlfromhell.wordpress.com/2010/03/07/webservice-e-funes-clr-no-sql-server</a></p>
<p>F# no SQL Server:</p>
<p><a href="http://sqlfromhell.wordpress.com/2009/10/17/fsharp" target="_blank">http://sqlfromhell.wordpress.com/2009/10/17/fsharp</a></p>
<p>Referenciando uma Class Library em Projetos SQL-CLR (Draft):</p>
<p><a href="http://sqlfromhell.wordpress.com/2009/09/30/crl-classlibrary" target="_blank">http://sqlfromhell.wordpress.com/2009/09/30/crl-classlibrary</a></p>
<p>Trabalhando com SQL CLR e Spatial Data <strong>[NOVO]</strong></p>
<p><a title="Trabalhando com SQL CLR e Spatial Data" href="http://sqlfromhell.wordpress.com/2011/07/27/trabalhando-com-sql-clr-e-spatial-data/" target="_blank">http://sqlfromhell.wordpress.com/2011/07/27/trabalhando-com-sql-clr-e-spatial-data/</a></p>
<p><strong>Novidades:</strong></p>
<p>Como com cada lançamento do Visual Studio temos o suporte SQL CLR permitindo a utilização das novas .NET Framework, mostrei que no caso do Visual Studio 2010 tivemos até algumas novidades mais interessantes.</p>
<p>Novidades do Visual Studio 2010:</p>
<p><a href="http://sqlfromhell.wordpress.com/2010/05/16/o-que-mudou-nos-projetos-sql-clr-do-visual-studio-2010" target="_blank">http://sqlfromhell.wordpress.com/2010/05/16/o-que-mudou-nos-projetos-sql-clr-do-visual-studio-2010</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sqlfromhell.wordpress.com/4158/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sqlfromhell.wordpress.com/4158/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sqlfromhell.wordpress.com/4158/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sqlfromhell.wordpress.com/4158/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/sqlfromhell.wordpress.com/4158/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/sqlfromhell.wordpress.com/4158/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/sqlfromhell.wordpress.com/4158/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/sqlfromhell.wordpress.com/4158/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sqlfromhell.wordpress.com/4158/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sqlfromhell.wordpress.com/4158/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sqlfromhell.wordpress.com/4158/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sqlfromhell.wordpress.com/4158/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sqlfromhell.wordpress.com/4158/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sqlfromhell.wordpress.com/4158/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sqlfromhell.wordpress.com&#038;blog=7423972&#038;post=4158&#038;subd=sqlfromhell&#038;ref=&#038;feed=1" width="1" height="1" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SqlFromHell?a=reHD6vuJvis:3i9-dmyeU6o:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/SqlFromHell?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SqlFromHell/~4/reHD6vuJvis" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sqlfromhell.wordpress.com/2012/04/20/trabalhando-com-sql-clr-resumo/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f03e5c495f2141f766e9a09eb9febb84?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">Paulo R. Pereira</media:title>
		</media:content>
	<feedburner:origLink>http://sqlfromhell.wordpress.com/2012/04/20/trabalhando-com-sql-clr-resumo/</feedburner:origLink></item>
		<item>
		<title>Iniciando com XQuery – Resumo</title>
		<link>http://feedproxy.google.com/~r/SqlFromHell/~3/8COgBcnRkro/</link>
		<comments>http://sqlfromhell.wordpress.com/2012/04/20/iniciando-com-xquery-resumo/#comments</comments>
		<pubDate>Fri, 20 Apr 2012 23:21:19 +0000</pubDate>
		<dc:creator>Paulo R. Pereira</dc:creator>
				<category><![CDATA[Iniciando com XQuery]]></category>
		<category><![CDATA[Trabalhando com XML]]></category>
		<category><![CDATA[XQuery]]></category>

		<guid isPermaLink="false">http://sqlfromhell.wordpress.com/?p=4153</guid>
		<description><![CDATA[A possibilidade de utilizar XQuery no SQL Server permite ler, gerar, manipular XML de uma forma simples e muito prática, sem a necessidade de depender de recursos externos ao SQL Server para tratar dados deste tipo. Ano passado escrevi quatro artigos que oferecem uma introdução de como utilizar XQuery no SQL Server. Iniciando com XQuery [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sqlfromhell.wordpress.com&#038;blog=7423972&#038;post=4153&#038;subd=sqlfromhell&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>A possibilidade de utilizar XQuery no SQL Server permite ler, gerar, manipular XML de uma forma simples e muito prática, sem a necessidade de depender de recursos externos ao SQL Server para tratar dados deste tipo.</p>
<p>Ano passado escrevi quatro artigos que oferecem uma introdução de como utilizar XQuery no SQL Server.</p>
<p><a title="Link permanente para Iniciando com XQuery – Lendo XML no SQL Server" href="https://sqlfromhell.wordpress.com/2011/08/02/lendo-xml-no-sql-server-iniciando-com-xquery/">Iniciando com XQuery – Lendo XML no SQL Server</a></p>
<p><a title="Link permanente para Iniciando com XQuery – Gerando XML no SQL Server" href="https://sqlfromhell.wordpress.com/2011/08/08/gerando-xml-no-sql-server-iniciando-com-xquery/">Iniciando com XQuery – Gerando XML no SQL Server</a></p>
<p><a title="Link permanente para Iniciando com XQuery – Modificando XML no SQL Server" href="https://sqlfromhell.wordpress.com/2011/10/18/iniciando-com-xquery-modificando-xml-no-sql-server/">Iniciando com XQuery – Modificando XML no SQL Server</a></p>
<p><a title="Link permanente para Iniciando com XQuery – Namespaces têm solução!" href="https://sqlfromhell.wordpress.com/2011/11/29/iniciando-com-xquery-namespaces-tem-solucao/">Iniciando com XQuery – Namespaces têm solução!</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sqlfromhell.wordpress.com/4153/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sqlfromhell.wordpress.com/4153/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sqlfromhell.wordpress.com/4153/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sqlfromhell.wordpress.com/4153/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/sqlfromhell.wordpress.com/4153/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/sqlfromhell.wordpress.com/4153/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/sqlfromhell.wordpress.com/4153/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/sqlfromhell.wordpress.com/4153/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sqlfromhell.wordpress.com/4153/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sqlfromhell.wordpress.com/4153/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sqlfromhell.wordpress.com/4153/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sqlfromhell.wordpress.com/4153/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sqlfromhell.wordpress.com/4153/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sqlfromhell.wordpress.com/4153/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sqlfromhell.wordpress.com&#038;blog=7423972&#038;post=4153&#038;subd=sqlfromhell&#038;ref=&#038;feed=1" width="1" height="1" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SqlFromHell?a=8COgBcnRkro:45Hb8DxVkvs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/SqlFromHell?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SqlFromHell/~4/8COgBcnRkro" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sqlfromhell.wordpress.com/2012/04/20/iniciando-com-xquery-resumo/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f03e5c495f2141f766e9a09eb9febb84?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">Paulo R. Pereira</media:title>
		</media:content>
	<feedburner:origLink>http://sqlfromhell.wordpress.com/2012/04/20/iniciando-com-xquery-resumo/</feedburner:origLink></item>
		<item>
		<title>Introdução ao Service Broker – Resumo</title>
		<link>http://feedproxy.google.com/~r/SqlFromHell/~3/kBAY9M2GdYs/</link>
		<comments>http://sqlfromhell.wordpress.com/2012/04/20/introducao-ao-service-broker-resumo/#comments</comments>
		<pubDate>Fri, 20 Apr 2012 23:13:14 +0000</pubDate>
		<dc:creator>Paulo R. Pereira</dc:creator>
				<category><![CDATA[Service Broker]]></category>

		<guid isPermaLink="false">http://sqlfromhell.wordpress.com/?p=4150</guid>
		<description><![CDATA[Uma feature do SQL Server que tive que aprender “na marra” para trabalhar em alguns projetos de SOA, mas que me permitiu construir soluções incríveis é o Service Broker, que no início pode parecer uma tentativa de reinventar a roda para quem já trabalha com SOA em plataformas de desenvolvimento (.NET, Java), mas para a [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sqlfromhell.wordpress.com&#038;blog=7423972&#038;post=4150&#038;subd=sqlfromhell&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Uma feature do SQL Server que tive que aprender “na marra” para trabalhar em alguns projetos de SOA, mas que me permitiu construir soluções incríveis é o Service Broker, que no início pode parecer uma tentativa de reinventar a roda para quem já trabalha com SOA em plataformas de desenvolvimento (.NET, Java), mas para a vida do DBA é uma solução muito prática, flexível e estável, que pode até surpreender muitos desenvolvedores.</p>
<p>No blog, trabalhei esta feature em três situações:</p>
<p><a title="Link permanente para Introdução ao Service Broker – Parte 1 – Monólogo" href="https://sqlfromhell.wordpress.com/2011/06/01/introducao-ao-service-broker-parte-1-monologo/">Introdução ao Service Broker – Parte 1 – Monólogo</a></p>
<p><a title="Link permanente para Introdução ao Service Broker – Parte 2 – Diálogo e Permissões" href="https://sqlfromhell.wordpress.com/2011/06/06/introducao-ao-service-broker-parte-2-dialogo-e-permissoes/">Introdução ao Service Broker – Parte 2 – Diálogo e Permissões</a></p>
<p><a title="Link permanente para Introdução ao Service Broker – Processos assíncronos" href="https://sqlfromhell.wordpress.com/2011/06/15/introducao-ao-service-broker-processos-assincronos/">Introdução ao Service Broker – Processos assíncronos</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sqlfromhell.wordpress.com/4150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sqlfromhell.wordpress.com/4150/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sqlfromhell.wordpress.com/4150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sqlfromhell.wordpress.com/4150/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/sqlfromhell.wordpress.com/4150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/sqlfromhell.wordpress.com/4150/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/sqlfromhell.wordpress.com/4150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/sqlfromhell.wordpress.com/4150/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sqlfromhell.wordpress.com/4150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sqlfromhell.wordpress.com/4150/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sqlfromhell.wordpress.com/4150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sqlfromhell.wordpress.com/4150/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sqlfromhell.wordpress.com/4150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sqlfromhell.wordpress.com/4150/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sqlfromhell.wordpress.com&#038;blog=7423972&#038;post=4150&#038;subd=sqlfromhell&#038;ref=&#038;feed=1" width="1" height="1" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SqlFromHell?a=kBAY9M2GdYs:TNoMnX0e4b8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/SqlFromHell?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SqlFromHell/~4/kBAY9M2GdYs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sqlfromhell.wordpress.com/2012/04/20/introducao-ao-service-broker-resumo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f03e5c495f2141f766e9a09eb9febb84?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">Paulo R. Pereira</media:title>
		</media:content>
	<feedburner:origLink>http://sqlfromhell.wordpress.com/2012/04/20/introducao-ao-service-broker-resumo/</feedburner:origLink></item>
		<item>
		<title>Boas práticas para adoção do Policy Based-Management</title>
		<link>http://feedproxy.google.com/~r/SqlFromHell/~3/hTvPOJRZi80/</link>
		<comments>http://sqlfromhell.wordpress.com/2012/04/20/boas-praticas-para-adocao-do-policy-based-management/#comments</comments>
		<pubDate>Fri, 20 Apr 2012 22:53:08 +0000</pubDate>
		<dc:creator>Paulo R. Pereira</dc:creator>
				<category><![CDATA[Gestão]]></category>
		<category><![CDATA[Manutenção]]></category>
		<category><![CDATA[Policy Management]]></category>
		<category><![CDATA[Policy Based-Management]]></category>

		<guid isPermaLink="false">https://sqlfromhell.wordpress.com/?p=4143</guid>
		<description><![CDATA[De que se trata o artigo: Neste artigo veremos que com um planejamento orientado por algumas perguntas e checklist é possível adotar soluções com Policy Based-Management respondendo necessidades do cenário, de forma que esta não se torne uma “feature órfã”, por permitir melhorias e acompanhar a evolução e mudanças do cenário. Para que serve: O [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sqlfromhell.wordpress.com&#038;blog=7423972&#038;post=4143&#038;subd=sqlfromhell&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>De que se trata o artigo:</strong></p>
<p>Neste artigo veremos que com um planejamento orientado por algumas perguntas e checklist é possível adotar soluções com Policy Based-Management respondendo necessidades do cenário, de forma que esta não se torne uma “feature órfã”, por permitir melhorias e acompanhar a evolução e mudanças do cenário.</p>
<p><strong>Para que serve:</strong></p>
<p>O planejamento na adoção do Policy Based-Management permite adequar o cenário às normas organização e às boas práticas de disponibilidade, capacidade, continuidade e segurança.</p>
<p><strong>Em que situação o tema útil:</strong></p>
<p>Mesmo que o Policy Based-Management seja uma feature que demande de pouca complexidade, o seu planejamento permitirá melhor entendimento do cenário, de forma que soluções com esta feature atendam adequadamente contratos de SLA, as normas organização e boas práticas de disponibilidade, capacidade, continuidade e segurança, acompanhando até mesmo a evolução do cenário.</p>
<p><strong>Introdução</strong></p>
<p>O Policy Based-Management (PBM) é uma feature introduzida no SQL Server a partir da versão 2008, a qual permite os administradores de banco de dados obterem o controle dos seus ambientes com a aplicação de regras e padrões sobre uma ou várias instâncias do SQL Server, além da possibilidade de reutilizar estas regras e padrões em outros cenários e versões anteriores do SQL Server (2000/2005).</p>
<p>Mas antes de implementar qualquer solução com esta feature, é necessário planejamento e entendimento do cenário, no qual, respostas a perguntas simples &#8220;por que, o que, como&#8221; poderão ajudar numa adequada implementação desta feature, de forma que as soluções implementadas não venham proporcionar qualquer resultado positivo ao cenário.</p>
<p>Este artigo vem a oferecer um conjunto de boas práticas tanto para o planejamento e adoção do PBM, como para o desenvolvimento de soluções e monitoramento das mesmas, auxiliando a responder as perguntas &#8220;por que, o que, como&#8221; desta feature.</p>
<p>Para um melhor entendimento, os termos disponibilidade, capacidade, continuidade e segurança utilizados neste artigo seguem algumas releituras do ITIL (Information Technology Infrastructure Library, <a href="http://en.wikipedia.org/wiki/ITIL">http://en.wikipedia.org/wiki/ITIL</a>):</p>
<div>
<table style="border-collapse:collapse;background-color:white;" border="0">
<col style="width:121px;" />
<col style="width:470px;" />
<tbody valign="top">
<tr style="background:silver;">
<td style="padding-left:7px;padding-right:7px;border-top:solid black 1pt;"><span style="color:black;"><strong>Disponibilidade</strong></span></td>
<td style="padding-left:7px;padding-right:7px;border-top:solid black 1pt;"><span style="color:black;">Disponibilidade é determinada pela confiabilidade, sustentabilidade, funcionalidade do serviço, desempenho e segurança. Normalmente calculada a partir da medição de transações de negócio geradas por um serviço de TI e a indisponibilidade deste serviço.</span></td>
</tr>
<tr>
<td style="padding-left:7px;padding-right:7px;"><span style="color:black;"><strong>Capacidade</strong></span></td>
<td style="padding-left:7px;padding-right:7px;"><span style="color:black;">O máximo de rendimento que um serviço consegue fornecer. Pode ser calculado a partir de medição de um tamanho ou volume (disco), ou esforço de trabalho que o serviço se limita.</span></td>
</tr>
<tr style="background:silver;">
<td style="padding-left:7px;padding-right:7px;"><span style="color:black;"><strong>Continuidade</strong></span></td>
<td style="padding-left:7px;padding-right:7px;"><span style="color:black;">Avaliação dos riscos que podem impactar o serviço. Termo normalmente associado com manutenção.</span></td>
</tr>
<tr>
<td style="padding-left:7px;padding-right:7px;border-bottom:solid black 1pt;"><span style="color:black;"><strong>Segurança</strong></span></td>
<td style="padding-left:7px;padding-right:7px;border-bottom:solid black 1pt;"><span style="color:black;">Garantia da confidencialidade, integridade e disponibilidade dos dados e informações.</span></td>
</tr>
</tbody>
</table>
</div>
<p>Estes termos se traduzem como os objetivos da administração de banco de dados, assim como de qualquer serviço da área de TI.</p>
<p>No que se refere à estrutura deste artigo, ela se aproxima a algumas de práticas de resolução de problemas, como o PDCA (Plan-Do-Check-Act), adaptadas para adoção de novas soluções, onde o ciclo planejar, implementar e acompanhar (avaliar e analisar), necessitou somente de uma ênfase na estratégica por traz do planejamento, e na segurança, por questões específicas do PBM.</p>
<p><strong>Por quê? Estratégia</strong></p>
<p>As justificativas para adoção de qualquer feature têm que responder muitos porquês, que podem simplesmente evitar que seja implantada qualquer solução, mas respondendo estes porquês, será possível entender a importância desta feature.</p>
<p>Um das justificativas comuns para adoção do PBM é a importância de adequar o cenário às normas organização ou projeto e boas práticas de disponibilidade, capacidade, continuidade e segurança. Lembrando que todos os cenários existem normas, mesmo quando estas não estão documentadas, elas ainda se fazem presentes.</p>
<p>Também é possível encontrar a organização que se baseiam suas normas em contratos de SLA (Service Level Agreement ou Acordo de nível de serviço, <a href="http://en.wikipedia.org/wiki/Service_level_agreement">http://en.wikipedia.org/wiki/Service_level_agreement</a>), exigindo um mínimo de requisitos (disponibilidade, capacidade, continuidade e segurança) dos serviços prestados aos seus clientes, e por consequência, exigindo dos administradores de bancos de dados, o uso do PBM e outras ferramentas para monitorar várias instâncias do SQL Server e seus bancos de dados.</p>
<p>Quando a adoção do PBM não é justificada por normas, mudanças e problemas da organização, é interessante pensar se boas práticas de disponibilidade, capacidade, continuidade e segurança recomendadas pelo fornecedor, no caso a Microsoft, estão presentes nas normas do ambiente, pois uma simples adoção do PBM pode ser justificado por perguntas simples como:</p>
<ul>
<li>O último backup é recente?</li>
<li>Existe espaço de disco para suficiente para os bancos de dados?</li>
</ul>
<p>Ou até algumas perguntas um pouco mais complexas:</p>
<ul>
<li>Existe alguma configuração que pode estar comprometendo com o desempenho ou segurança do banco de dados e do servidor? Pelo menos, tem certeza que não existe nenhum login configurado de forma a permitir uma senha fraca?</li>
<li>Existe alguma feature deprecated configurada? Para uma relação destas, é interessante acompanhar: <a href="http://msdn.microsoft.com/en-us/library/cc280407.aspx">http://msdn.microsoft.com/en-us/library/cc280407.aspx</a></li>
<li>Existe alguma stored procedures criadas por usuários cuja nomenclatura ofereça problemas de desempenho? Sim, isso pode ocorrer com stored procedures de nomenclatura sp_*, pois o SQL Server procurará stored procedures com esta nomenclatura primeiramente no banco de dados master e depois no banco de dados na qual elas são executadas, até mesmo podem surgir alguns erros inesperados ou algumas stored procedures não serem encontradas quando executadas.</li>
</ul>
<p>Estas perguntas podem ajudar a identificar algumas boas práticas, mas se estas boas práticas ainda estão claras, é possível encontrar no site do TechNet e MSDN, uma série de boas práticas, sendo algumas genéricas (segurança, backup&#8230;) e outras para cenários específicos (virtualização, BI&#8230;), que podem ajudar a identificar quais são úteis para cada cenário. Sempre lembrando que as organizações podem adotar práticas que até mesmo violam ou ignoram as boas práticas e recomendações pelo fornecedor, no caso a Microsoft.</p>
<p><strong>Boas práticas, TechNet:<br />
</strong>http://technet.microsoft.com/en-us/sqlserver/bb671430.aspx</p>
<p><strong>Boas práticas, MSDN:<br />
</strong>http://msdn.microsoft.com/en-us/sqlserver/bb671432.aspx</p>
<p>Na pasta C:\Program Files\Microsoft SQL Server\110\Tools\Policies (em ambientes x64, C:\Program Files (x86)\Microsoft SQL Server\110\Tools\Policies) existem uma série de arquivos XML que podem ser importados pelo PBM em forma de regras, com a finalidade de validar boas práticas para administração do SQL Server. Uma breve descrição de cada um destes arquivos é possível de ser encontrada no seguinte link:<br />
<a href="http://msdn.microsoft.com/en-us/library/cc645723.aspx">http://msdn.microsoft.com/en-us/library/cc645723.aspx</a></p>
<p><strong>O que? Planejamento</strong></p>
<p>Ao se pensar no que será feito, é importante entender o que a feature pode oferecer e por outro lado, avaliar se não existe outra solução que responda de forma mais adequada as necessidades do cenário. Esta avaliação é importante, visto que uma feature como o Policy Based-Management ser passível de ser substituída por consultas, relatórios, jobs e triggers, outras ferramentas ou até mesmo solução de terceiros, mas o tempo, custo, flexibilidade e complexidade de desenvolver uma solução do &#8220;zero&#8221; ou adotar uma solução de terceiros são pontos a serem levados em consideração, já que muitos dos potenciais desta feature esta na praticidade de adotá-la.</p>
<p>Mas o que esta feature pode fazer? Basicamente, o PBM proporciona soluções de automatização com a finalidade de diminuir o tempo que o administrador de banco de dados deveria se dedicar à manutenção, que pode se estender às regras de configuração no nível de servidores até objetos do banco de dados, como tabelas e índices. O PBM oferece algumas soluções para gerenciar as regras implementadas pelo administrador de banco de dados, que ser monitoradas por meio de agendamento ou por demanda (executada pelo SQL Server Management Studio), gerar alertas ou até mesmo prevenir que as regras sejam violadas por algum usuário.</p>
<p>As regras do PBM são compostas por três estruturas básicas:</p>
<ul>
<li>Target Types, estruturas que representam os tipos de objetos manipulados pelo PBM, exemplo: Tables, Views e Databases.</li>
<li>Management Facets, estruturas que representam grupos de propriedades de determinados Target Types, como por exemplo, Name, Table Options, Database Option e Surface Area, que são utilizadas para criar condições/filtros.</li>
<li>Condition ou Condições/Filtros, estruturas que representam expressões lógicas por meio das Facets, a fim de aplicar filtros e validações.</li>
</ul>
<p>As possibilidades de criar regras no PBM não estão limitadas ás suas facets, visto que há a possibilidade de customizações com consultas T-SQL e WMI. Mas é importante levar em consideração que estas customizações demandam de bom senso dos envolvidos, para evitar que sejam desenvolvidas soluções muito complexas ou que interfiram na disponibilidade e segurança do servidor.</p>
<p>No blog oficial de PBM, é possível obter uma relação das facets e os target types que elas manipulam:<br />
<a href="http://blogs.msdn.com/b/sqlpbm/archive/2008/05/24/facets.aspx">http://blogs.msdn.com/b/sqlpbm/archive/2008/05/24/facets.aspx</a></p>
<p>A partir do momento que se entende o potencial da feature, é possível definir um checklist para determinar a solução a ser desenvolvida:</p>
<ol>
<li>Justificativa: Existem normas ou boas práticas a serem adotadas em relação à disponibilidade, capacidade, continuidade e segurança do SQL Server?</li>
<li>Extensão: Qual a extensão destas normas e boas práticas (Servidores, Instâncias, Bancos de dados, Tabelas&#8230;)?</li>
<li>Ferramenta: Existem facets que atendem estas normas ou boas práticas, ou será necessária customização (comandos T-SQL ou WMI)?</li>
<li>Alternativa: Se for necessária uma customização, não existe uma alternativa (uma feature já presente no SQL Server ou feature de terceiros) que não exija esta customização? A atenção a este ponto pode evitar arrependimentos futuros.</li>
<li>Correção: O que deverá ser feito quando for encontrada uma situação que entre em desacordo com as regras estabelecidas? Em um segundo passo, defina os responsáveis e o prazo para as ações corretivas.</li>
<li>Exceções: Existem exceções? Quais? Cuidado, estas exceções podem se tornar a regra, então se a norma deve ser obedecida, exceções devem ser as mínimas possíveis e bem definidas (por que ela existe e quais os critérios para identificá-la?).</li>
</ol>
<p>Para entender melhor como responder este checklist, segue abaixo alguns exemplos:</p>
<p><strong>Cenário A:<br />
</strong></p>
<div>
<table style="border-collapse:collapse;background-color:white;" border="0">
<col style="width:111px;" />
<col style="width:479px;" />
<tbody valign="top">
<tr style="background:silver;">
<td style="padding-left:7px;padding-right:7px;border-top:solid black 1pt;"><span style="color:black;">1. Justificativa</span></td>
<td style="padding-left:7px;padding-right:7px;border-top:solid black 1pt;"><span style="color:black;">Existe uma norma do projeto Icaro, que determina que todos os objetos do banco de dados utilizem a nomenclatura CamelCase (<a href="http://en.wikipedia.org/wiki/CamelCase">http://en.wikipedia.org/wiki/CamelCase</a>). Para que esta seja respeitada, os novos objetos somente serão criados obedecendo a nomenclatura CamelCase, e os objetos que ainda não obedecem esta nomenclatura serão identificados pelo PBM a fim de serem corrigidos.</span></td>
</tr>
<tr>
<td style="padding-left:7px;padding-right:7px;"><span style="color:black;">2. Extensão</span></td>
<td style="padding-left:7px;padding-right:7px;"><span style="color:black;">Todos os objetos do banco de dados</span></td>
</tr>
<tr style="background:silver;">
<td style="padding-left:7px;padding-right:7px;"><span style="color:black;">3. Ferramenta</span></td>
<td style="padding-left:7px;padding-right:7px;"><span style="color:black;">Esta norma está relacionada às facet &#8220;Multipart Name&#8221; e &#8220;Name&#8221;, mas será necessário criar uma função para testar se esta nomenclatura é utilizada, para tratar esta norma.</span></td>
</tr>
<tr>
<td style="padding-left:7px;padding-right:7px;"><span style="color:black;">4. Alternativa</span></td>
<td style="padding-left:7px;padding-right:7px;"><span style="color:black;">É possível criar uma consulta sobre os objetos do banco de dados, mas ainda será necessário criar uma função para testar a nomenclatura e a consulta não permitirá a mesma praticidade do PBM de tratar este problema.</span></td>
</tr>
<tr style="background:silver;">
<td style="padding-left:7px;padding-right:7px;"><span style="color:black;">5. Correção</span></td>
<td style="padding-left:7px;padding-right:7px;"><span style="color:black;">Os objetos que estiverem fora do padrão serão relatados à equipe de desenvolvimento para ajustes.</span></td>
</tr>
<tr>
<td style="padding-left:7px;padding-right:7px;border-bottom:solid black 1pt;"><span style="color:black;">6. Exceções</span></td>
<td style="padding-left:7px;padding-right:7px;border-bottom:solid black 1pt;"><span style="color:black;">Alguns objetos não estão no padrão estabelecido por serem de software de terceiros.<br />
</span><span style="color:black;">Uma relação dos objetos que serão mantidos fora do padrão será armazenada em uma tabela do banco de dados, com a finalidade de desconsidera-las nas regras.</span></td>
</tr>
</tbody>
</table>
</div>
<p><strong>Cenário B:<br />
</strong></p>
<div>
<table style="border-collapse:collapse;background-color:white;" border="0">
<col style="width:111px;" />
<col style="width:479px;" />
<tbody valign="top">
<tr style="background:silver;">
<td style="padding-left:7px;padding-right:7px;border-top:solid black 1pt;"><span style="color:black;">1. Justificativa</span></td>
<td style="padding-left:7px;padding-right:7px;border-top:solid black 1pt;"><span style="color:black;">Para que seja utilizada a solução de Log Shipping nos bancos de dados do cliente X, é necessário que os bancos de dados deste cliente estejam configurados como &#8220;Recovery Mode&#8221; diferente de &#8220;Simple&#8221;. Desta forma, o PBM será utilizado para identificar os bancos de dados que estejam configurados inadequadamente.</span></td>
</tr>
<tr>
<td style="padding-left:7px;padding-right:7px;"><span style="color:black;">2. Extensão</span></td>
<td style="padding-left:7px;padding-right:7px;"><span style="color:black;">Os bancos de dados das instâncias X\SQL2008 e X\SQL2008R2</span></td>
</tr>
<tr style="background:silver;">
<td style="padding-left:7px;padding-right:7px;"><span style="color:black;">3. Ferramenta</span></td>
<td style="padding-left:7px;padding-right:7px;"><span style="color:black;">Esta definição esta associada à facet &#8220;Database&#8221;, propriedade &#8220;RecoveryMode&#8221;, não sendo necessária customização.</span></td>
</tr>
<tr>
<td style="padding-left:7px;padding-right:7px;"><span style="color:black;">4. Alternativa</span></td>
<td style="padding-left:7px;padding-right:7px;"><span style="color:black;">É possível criar manualmente esta validação, mas demandará mais tempo.</span></td>
</tr>
<tr style="background:silver;">
<td style="padding-left:7px;padding-right:7px;"><span style="color:black;">5. Correção</span></td>
<td style="padding-left:7px;padding-right:7px;"><span style="color:black;">Encontrar um banco de dados fora do padrão, ajustar imediatamente o &#8220;RecoveryMode&#8221; para &#8220;Bulk-logged&#8221;.</span></td>
</tr>
<tr>
<td style="padding-left:7px;padding-right:7px;border-bottom:solid black 1pt;"><span style="color:black;">6. Exceções</span></td>
<td style="padding-left:7px;padding-right:7px;border-bottom:solid black 1pt;"><span style="color:black;">O banco de dados BRCEP é somente leitura e não precisará ser replicado.<br />
</span><span style="color:black;">Uma relação dos objetos que serão mantidos fora do padrão será armazenada em uma tabela do banco de dados, com a finalidade de desconsidera-las nas regras.</span></td>
</tr>
</tbody>
</table>
</div>
<p><span style="font-family:Times;font-size:12pt;"><em>Nos cenários apresentados, todos apresentam possibilidades simples de adotar o PBM, e uma das vantagens permitidas por esta feature, é capacidade reutilizar estas regras em outros ambientes quando se fizer necessário, visto que elas podem ser exportadas e importadas por meio de arquivos XML.<br />
</em></span></p>
<p><strong>Como? Implementação</strong></p>
<p>Na criação de qualquer estrutura no PBM, não pode deixar de lado questões de nomenclatura e uma boa descrição das condições e regras criadas. Cenários robustos podem favorecer até mesmo na criação de regras que validam a nomenclatura e a existência de descrição das regras e condições do PBM, assim como versionamento destas regras.</p>
<p>Infelizmente, não existe uma solução de versionamento nativa para o PBM, mas é possível utilizar SharePoint Server, Visual Studio Team Foundation Server ou outra solução de SVN para manter um histórico dos arquivos XML das regras desenvolvidas.</p>
<p>Quando se pensar nas regras além de uma boa nomenclatura e descrição, é recomendado que estas sejam devidamente categorizadas, para o entendimento do que estas regras estão monitorando (servidor, banco de dados, tabelas, usuários&#8230;), saber quem será responsável por estas regras e onde/quando elas são aplicadas (verificações periódicas ou em tempo real, servidores/bancos de dados de clientes, ambientes de produção, de homologação ou de desenvolvimento).</p>
<p>A tabela abaixo, obtida de forma resumida do blog oficial de PBM, é possível identificar as facets que podem ser utilizadas de forma preventiva (de forma a evitar que alguma ação que burle a regra seja executada) ou que sejam &#8220;logáveis&#8221; quando sofrem alterações:</p>
<div>
<table style="border-collapse:collapse;background-color:white;" border="0">
<col style="width:189px;" />
<col style="width:92px;" />
<col style="width:67px;" />
<tbody valign="top">
<tr style="height:20px;">
<td style="padding-left:7px;padding-right:7px;border-top:solid black 1pt;border-left:none;border-bottom:solid black 1pt;border-right:none;"><span style="color:black;"><strong>Facets</strong></span></td>
<td style="padding-left:7px;padding-right:7px;border-top:solid black 1pt;border-left:none;border-bottom:solid black 1pt;border-right:none;"><span style="color:black;"><strong>Preventiva</strong></span></td>
<td style="padding-left:7px;padding-right:7px;border-top:solid black 1pt;border-left:none;border-bottom:solid black 1pt;border-right:none;"><span style="color:black;"><strong>Log</strong></span></td>
</tr>
<tr style="height:20px;background:silver;">
<td style="padding-left:7px;padding-right:7px;border-left:none;border-right:none;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;"><strong>Application Role</strong></span></td>
<td style="padding-left:7px;padding-right:7px;border-left:none;border-right:none;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;">X</span></td>
<td style="padding-left:7px;padding-right:7px;border-left:none;border-right:none;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;">X</span></td>
</tr>
<tr style="height:20px;">
<td style="padding-left:7px;padding-right:7px;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;"><strong>Asymmetric Key</strong></span></td>
<td style="padding-left:7px;padding-right:7px;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;">X</span></td>
<td style="padding-left:7px;padding-right:7px;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;">X</span></td>
</tr>
<tr style="height:20px;background:silver;">
<td style="padding-left:7px;padding-right:7px;border-left:none;border-right:none;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;"><strong>Database Option</strong></span></td>
<td style="padding-left:7px;padding-right:7px;border-left:none;border-right:none;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;"> </span></td>
<td style="padding-left:7px;padding-right:7px;border-left:none;border-right:none;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;">X</span></td>
</tr>
<tr style="height:20px;">
<td style="padding-left:7px;padding-right:7px;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;"><strong>Database Role</strong></span></td>
<td style="padding-left:7px;padding-right:7px;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;">X</span></td>
<td style="padding-left:7px;padding-right:7px;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;">X</span></td>
</tr>
<tr style="height:20px;background:silver;">
<td style="padding-left:7px;padding-right:7px;border-left:none;border-right:none;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;"><strong>Endpoint</strong></span></td>
<td style="padding-left:7px;padding-right:7px;border-left:none;border-right:none;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;">X</span></td>
<td style="padding-left:7px;padding-right:7px;border-left:none;border-right:none;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;">X</span></td>
</tr>
<tr style="height:20px;">
<td style="padding-left:7px;padding-right:7px;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;"><strong>Login Options</strong></span></td>
<td style="padding-left:7px;padding-right:7px;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;">X</span></td>
<td style="padding-left:7px;padding-right:7px;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;">X</span></td>
</tr>
<tr style="height:20px;background:silver;">
<td style="padding-left:7px;padding-right:7px;border-left:none;border-right:none;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;"><strong>Multipart Name</strong></span></td>
<td style="padding-left:7px;padding-right:7px;border-left:none;border-right:none;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;">X</span></td>
<td style="padding-left:7px;padding-right:7px;border-left:none;border-right:none;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;">X</span></td>
</tr>
<tr style="height:20px;">
<td style="padding-left:7px;padding-right:7px;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;"><strong>Resource Pool</strong></span></td>
<td style="padding-left:7px;padding-right:7px;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;">X</span></td>
<td style="padding-left:7px;padding-right:7px;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;">X</span></td>
</tr>
<tr style="height:20px;background:silver;">
<td style="padding-left:7px;padding-right:7px;border-left:none;border-right:none;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;"><strong>Schema</strong></span></td>
<td style="padding-left:7px;padding-right:7px;border-left:none;border-right:none;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;">X</span></td>
<td style="padding-left:7px;padding-right:7px;border-left:none;border-right:none;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;">X</span></td>
</tr>
<tr style="height:20px;">
<td style="padding-left:7px;padding-right:7px;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;"><strong>Server Configuration</strong></span></td>
<td style="padding-left:7px;padding-right:7px;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;"> </span></td>
<td style="padding-left:7px;padding-right:7px;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;">X</span></td>
</tr>
<tr style="height:20px;background:silver;">
<td style="padding-left:7px;padding-right:7px;border-left:none;border-right:none;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;"><strong>Stored Procedure</strong></span></td>
<td style="padding-left:7px;padding-right:7px;border-left:none;border-right:none;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;">X</span></td>
<td style="padding-left:7px;padding-right:7px;border-left:none;border-right:none;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;">X</span></td>
</tr>
<tr style="height:20px;">
<td style="padding-left:7px;padding-right:7px;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;"><strong>Surface Area</strong></span></td>
<td style="padding-left:7px;padding-right:7px;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;"> </span></td>
<td style="padding-left:7px;padding-right:7px;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;">X</span></td>
</tr>
<tr style="height:20px;background:silver;">
<td style="padding-left:7px;padding-right:7px;border-left:none;border-right:none;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;"><strong>Table Options</strong></span></td>
<td style="padding-left:7px;padding-right:7px;border-left:none;border-right:none;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;">X</span></td>
<td style="padding-left:7px;padding-right:7px;border-left:none;border-right:none;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;">X</span></td>
</tr>
<tr style="height:20px;">
<td style="padding-left:7px;padding-right:7px;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;"><strong>User Defined Function</strong></span></td>
<td style="padding-left:7px;padding-right:7px;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;">X</span></td>
<td style="padding-left:7px;padding-right:7px;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;">X</span></td>
</tr>
<tr style="height:20px;background:silver;">
<td style="padding-left:7px;padding-right:7px;border-left:none;border-right:none;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;"><strong>User Options</strong></span></td>
<td style="padding-left:7px;padding-right:7px;border-left:none;border-right:none;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;">X</span></td>
<td style="padding-left:7px;padding-right:7px;border-left:none;border-right:none;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;">X</span></td>
</tr>
<tr style="height:20px;">
<td style="padding-left:7px;padding-right:7px;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;"><strong>View Options</strong></span></td>
<td style="padding-left:7px;padding-right:7px;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;">X</span></td>
<td style="padding-left:7px;padding-right:7px;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;">X</span></td>
</tr>
<tr style="height:20px;background:silver;">
<td style="padding-left:7px;padding-right:7px;border-left:none;border-bottom:solid black 1pt;border-right:none;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;"><strong>Workload Group</strong></span></td>
<td style="padding-left:7px;padding-right:7px;border-left:none;border-bottom:solid black 1pt;border-right:none;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;">X</span></td>
<td style="padding-left:7px;padding-right:7px;border-left:none;border-bottom:solid black 1pt;border-right:none;"><span style="color:#333333;font-family:Segoe UI;font-size:10pt;">X</span></td>
</tr>
</tbody>
</table>
</div>
<p>A partir dos cenários do tópico anterior e uma análise de como será implantado, é possível detalhar a implementação desta solução a partir de um checklist simples, como demonstrado abaixo:</p>
<p><strong>Cenário A:</strong></p>
<div>
<table style="border-collapse:collapse;background-color:white;" border="0">
<col style="width:197px;" />
<col style="width:387px;" />
<tbody valign="top">
<tr style="background:silver;">
<td style="padding-left:7px;padding-right:7px;border-top:solid black 1pt;border-left:none;border-right:none;"><span style="color:black;">Categoria</span></td>
<td style="padding-left:7px;padding-right:7px;border-top:solid black 1pt;border-left:none;border-right:none;"><span style="color:black;">ProjetoIcaro</span></td>
</tr>
<tr>
<td style="padding-left:7px;padding-right:7px;"><span style="color:black;">Ambientes</span></td>
<td style="padding-left:7px;padding-right:7px;"><span style="color:black;">Servidor de desenvolvimento</span></td>
</tr>
<tr style="background:silver;">
<td style="padding-left:7px;padding-right:7px;border-left:none;border-right:none;"><span style="color:black;">Regras</span></td>
<td style="padding-left:7px;padding-right:7px;border-left:none;border-right:none;"><span style="color:black;">1: NomenclaraCamelCase1<br />
</span><span style="color:black;">2: NomenclaraCamelCase2</span></td>
</tr>
<tr>
<td style="padding-left:7px;padding-right:7px;"><span style="color:black;">Descrição da regra</span></td>
<td style="padding-left:7px;padding-right:7px;"><span style="color:black;">1: Validação preventiva da norma do projeto que determina que todos os objetos do banco de dados utilizem a nomenclatura CamelCase (<a href="http://en.wikipedia.org/wiki/CamelCase">http://en.wikipedia.org/wiki/CamelCase</a>).<br />
</span><span style="color:black;">2: Validação periódica (1 vez por semana) da norma do projeto que determina que todos os objetos do banco de dados utilizem a nomenclatura CamelCase (<a href="http://en.wikipedia.org/wiki/CamelCase">http://en.wikipedia.org/wiki/CamelCase</a>).</span></td>
</tr>
<tr style="background:silver;">
<td style="padding-left:7px;padding-right:7px;border-left:none;border-right:none;"><span style="color:black;">Responsáveis</span></td>
<td style="padding-left:7px;padding-right:7px;border-left:none;border-right:none;"><span style="color:black;">Responsável pela criação e manutenção das regras:<br />
João da Silva, DBA da organização.<br />
</span><span style="color:black;">Responsável por orientar as correções e informar exceções das regras:<br />
José da Silva, Analista do projeto.</span></td>
</tr>
<tr>
<td style="padding-left:7px;padding-right:7px;"><span style="color:black;">Eventualidade</span></td>
<td style="padding-left:7px;padding-right:7px;"><span style="color:black;">1: Verificação executada de forma preventiva, por meio da facet &#8220;Multipart Name&#8221;.<br />
</span><span style="color:black;"><br />
2: Verificação executada de forma periódica, por meio da facet &#8220;Name&#8221;.</span></td>
</tr>
<tr style="background:silver;">
<td style="padding-left:7px;padding-right:7px;border-left:none;border-bottom:solid black 1pt;border-right:none;"><span style="color:black;">Descrição da implementação</span></td>
<td style="padding-left:7px;padding-right:7px;border-left:none;border-bottom:solid black 1pt;border-right:none;"><span style="color:black;">Criada a função dbo.ValidaCamelCase, que permite validar qualquer texto de acordo com a nomenclatura CamelCase.<br />
</span><span style="color:black;">1: Utilizada a facet Multipart Name, permite execução preventiva, mas possui uma abrangência limitada (Sequence, StoredProcedure, Synonym, Table, UserDefinedFunction, UserDefinedType, View, XmlSchemaCollection).<br />
</span><span style="color:black;">2: Criada para encontrar objetos fora do padrão já existentes e de forma mais abrangente. Utilizada a facet Name, não permite execução preventiva, mas possui uma abrangência maior que a facet Multipart Name (ApplicationRole, AsymmetricKey, Certificate, DatabaseRole, Default, Index, Rule, Schema, Sequence, SqlAssembly, StoredProcedure, SymmetricKey, Synonym, Table, Trigger, User, UserDefinedFunction, UserDefinedType, View, XmlSchemaCollection).</span></td>
</tr>
</tbody>
</table>
</div>
<p><strong>Cenário B:</strong></p>
<div>
<table style="border-collapse:collapse;background-color:white;" border="0">
<col style="width:197px;" />
<col style="width:387px;" />
<tbody valign="top">
<tr style="background:silver;">
<td style="padding-left:7px;padding-right:7px;border-top:solid black 1pt;border-left:none;border-right:none;"><span style="color:black;">Categoria</span></td>
<td style="padding-left:7px;padding-right:7px;border-top:solid black 1pt;border-left:none;border-right:none;"><span style="color:black;">Manutencao</span></td>
</tr>
<tr>
<td style="padding-left:7px;padding-right:7px;"><span style="color:black;">Ambientes</span></td>
<td style="padding-left:7px;padding-right:7px;"><span style="color:black;">Servidor de produção</span></td>
</tr>
<tr style="background:silver;">
<td style="padding-left:7px;padding-right:7px;border-left:none;border-right:none;"><span style="color:black;">Regras</span></td>
<td style="padding-left:7px;padding-right:7px;border-left:none;border-right:none;"><span style="color:black;">RequisitosLogShipping</span></td>
</tr>
<tr>
<td style="padding-left:7px;padding-right:7px;"><span style="color:black;">Descrição da regra</span></td>
<td style="padding-left:7px;padding-right:7px;"><span style="color:black;">Para que seja utilizada a solução de Log Shipping no SQL Server do cliente X, é necessário que os bancos de dados deste cliente estejam configurados como &#8220;Recovery Mode&#8221; diferente de &#8220;Simple&#8221;.</span></td>
</tr>
<tr style="background:silver;">
<td style="padding-left:7px;padding-right:7px;border-left:none;border-right:none;"><span style="color:black;">Responsáveis</span></td>
<td style="padding-left:7px;padding-right:7px;border-left:none;border-right:none;"><span style="color:black;">Criação e manutenção das regras, e ajustes que no servidor:<br />
José Lins, DBA do cliente X.</span></td>
</tr>
<tr>
<td style="padding-left:7px;padding-right:7px;"><span style="color:black;">Eventualidade</span></td>
<td style="padding-left:7px;padding-right:7px;"><span style="color:black;">Verificação periódica (1 vez do dia).</span></td>
</tr>
<tr style="background:silver;">
<td style="padding-left:7px;padding-right:7px;border-left:none;border-bottom:solid black 1pt;border-right:none;"><span style="color:black;">Descrição da implementação</span></td>
<td style="padding-left:7px;padding-right:7px;border-left:none;border-bottom:solid black 1pt;border-right:none;"><span style="color:black;">Utilizada a facet &#8220;Database Option&#8217;, para que se necessário seja adaptada para &#8220;logar&#8221; as alterações.<br />
</span></td>
</tr>
</tbody>
</table>
</div>
<p><strong>Segurança</strong></p>
<p>Após a implementação do PBM, algumas questões de segurança devem ser analisadas, visto que com um usuário com acesso indevido para criar/modificar regras e condições do PBM, é possível desde adulterar e burlar regras ou até mesmo criar regras e condições nocivas ao ambiente, dada a possibilidade executar comandos T-SQL por meio do PBM.</p>
<p>Assim, não permita que usuários indevidos se tornem membros da Database Role PolicyAdministratorRole do banco de dados msdb (role que permite a criação e edição de regras e condições do PBM), ou que sejam dadas permissões/senhas indevidas aos logins do PBM (##MS_PolicyEventProcessingLogin##, ##MS_PolicyTsqlExecutionLogin##).</p>
<p>Caso seja necessário executar alguma consulta que o PBM não tenha permissão, dê somente as permissões que se fizerem necessárias ao login ##MS_PolicyTsqlExecutionLogin##, que é o responsável pela execução de consultas T-SQL do PBM.</p>
<p><strong>Acompanhamento</strong></p>
<p>Depois de implantado o PBM, adequadas as questões de segurança, criadas as soluções de regras e condições de acordo com o que foi planejado, estabeleça com os responsáveis pelo ambiente, uma agenda para avaliar os resultados obtidos e identificar/analisar melhorias. Para orientar esta agenda, busque responder algumas perguntas, como:</p>
<ul>
<li>Esta solução realmente tem atendido adequadamente o que foi estabelecido e com o cenário atual? Caso não esteja atendendo adequadamente, verifique se a feature realmente respondeu as justificativas de sua implantação, pois o escopo da solução é facilmente esquecido com o tempo.</li>
<li>A implementação desta feature trouxe algum problema para o cenário? Tanto processualmente e tecnicamente, a implementação do PBM pode criar problemas, como a geração de conflito com a cultura da organização ou complexidade da solução criar gargalos de desempenho ou conflitos com outras soluções.</li>
<li>As regras e condições são seguidas corretamente? Caso não tenha sido acompanhado este ponto pelo responsável, é possível verificar pelo próprio PBM, alguma views ou até mesmo algumas ferramentas de terceiros (EPM Framework) se as regras e condições implementadas são seguidas corretamente e a evolução destas em determinado período. Se as regras e condições não são seguidas ou não houve correções no cenário, verifique se elas realmente estão de acordo com o cenário atual e se o processo de correção pode ser realizado de acordo com o planejado.</li>
<li>Existem exceções se tornado regra? Exceções, como informado anteriormente, podem se tornar a regra, então se a norma deve ser obedecida, exceções devem ser as mínimas possíveis.</li>
<li>Alguma melhoria para o cenário atual? Melhorias também devem responder as mesmas perguntas que definem a implantação da feature (&#8220;por que, o que, como&#8221;), pois adaptações mal planejadas podem tornar o cenário demasiadamente complexo em comparação ao retorno obtido e esperado, além de gerar problemas técnicos e/ou processuais em muitos casos.</li>
<li>Alguma melhoria para o cenário futuro? Ao se pensar no cenário futuro, esteja atento ás estratégias da organização ou projeto, pois a escalabilidade na área de TI tem tendências mais reativas do que proativas quando se trata de estratégia, desta forma, metas da organização devem estar ao lado de métricas e metas de TI. Exemplo disso, uma organização que planeja triplicar o número de clientes em um ano, precisa que sua infraestrutura esteva preparada a este mesmo crescimento, como, servidores suportando o triplo dos dados, backups e transações que os atuais.</li>
<li>Existe alguma solução ou mudança que possa justificar a substituição desta feature? Features também sofrem depreciação, como por exemplo, a feature utilizada na sua solução pode não estar presentes nas próximas versões do SQL Server ou podem surgir features que atendam de forma mais adequada o cenário. Procure deixar de lado um pouco do paternalismo para com as soluções que você e sua equipe implantou, para que se necessário sejam adotadas outras soluções que venha a substituir parcialmente ou completamente a feature atual.</li>
</ul>
<p>Uma ferramenta muito útil para acompanhar a evolução do PBM é o EPM Framework, disponível gratuitamente no CodePlex (<a href="http://epmframework.codeplex.com">http://epmframework.codeplex.com</a>), que permite relatórios bem úteis do dados históricos e correntes das regras do PBM:</p>
<p><img src="http://sqlfromhell.files.wordpress.com/2012/04/042012_2252_boasprticas1.jpg?w=655" alt="" /><span style="color:#30332d;font-family:Segoe UI;font-size:9pt;"><br />
</span></p>
<p>Também é possível criar sua própria solução para acompanhar o PBM, utilizando as views do PBM (<a href="http://technet.microsoft.com/en-us/library/bb510742.aspx">http://technet.microsoft.com/en-us/library/bb510742.aspx</a>).</p>
<p>Em relação ao acompanhamento do PBM pela própria Microsoft, apesar de existir algumas sugestões de melhorias relacionadas a esta feature no Microsoft Connect, o CTP1 do SQL Server &#8220;Denali&#8221; (ou SQL Server 2011) não apresentou resposta a estas sugestões e também não foram divulgadas mudanças nesta feature. Mas pelo grande potencial desta feature, é até difícil pensar em melhorias que podem ser grandemente relevantes para futuras versões.</p>
<p><strong>Conclusão</strong></p>
<p>Este artigo tratou de permitir um entendimento de como por meio de um planejamento orientado por algumas perguntas e checklist, é possível adotar soluções com o a feature PBM, respondendo de forma adequada as necessidades do cenário, devidamente justificada, contando até mesmo com exceções e permitindo que a solução depois implantada não se torne uma feature órfã, por permitir melhorias e acompanhar a evolução e mudanças do cenário.</p>
<p>Com apoio de outras features nativas do SQL Server 2008+, como o Resource Governor e o Management Data Warehouse, é possível rapidamente aumentar o arsenal do administrador de banco de dados, oferecendo maior controle da disponibilidade dos recursos do SQL Server e relatórios para acompanhar da evolução dos cenários, tendo cada vez mais controle sobre o ambiente e recursos para entender como responder de forma adequada questões de disponibilidade, capacidade e continuidade dos cenários. Mas apesar da praticidade de adotar qualquer features, nunca deixe de lado o planejamento antes de adotá-las.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sqlfromhell.wordpress.com/4143/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sqlfromhell.wordpress.com/4143/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sqlfromhell.wordpress.com/4143/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sqlfromhell.wordpress.com/4143/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/sqlfromhell.wordpress.com/4143/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/sqlfromhell.wordpress.com/4143/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/sqlfromhell.wordpress.com/4143/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/sqlfromhell.wordpress.com/4143/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sqlfromhell.wordpress.com/4143/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sqlfromhell.wordpress.com/4143/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sqlfromhell.wordpress.com/4143/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sqlfromhell.wordpress.com/4143/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sqlfromhell.wordpress.com/4143/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sqlfromhell.wordpress.com/4143/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sqlfromhell.wordpress.com&#038;blog=7423972&#038;post=4143&#038;subd=sqlfromhell&#038;ref=&#038;feed=1" width="1" height="1" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SqlFromHell?a=hTvPOJRZi80:u65gEF1RE2g:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/SqlFromHell?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SqlFromHell/~4/hTvPOJRZi80" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sqlfromhell.wordpress.com/2012/04/20/boas-praticas-para-adocao-do-policy-based-management/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f03e5c495f2141f766e9a09eb9febb84?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">Paulo R. Pereira</media:title>
		</media:content>

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/04/042012_2252_boasprticas1.jpg" medium="image" />
	<feedburner:origLink>http://sqlfromhell.wordpress.com/2012/04/20/boas-praticas-para-adocao-do-policy-based-management/</feedburner:origLink></item>
		<item>
		<title>Integração SQL CLR no SQL Server – Uma Visão Geral</title>
		<link>http://feedproxy.google.com/~r/SqlFromHell/~3/rDte10e7Zq0/</link>
		<comments>http://sqlfromhell.wordpress.com/2012/04/20/integracao-sql-clr-no-sql-server-visao-geral/#comments</comments>
		<pubDate>Fri, 20 Apr 2012 22:21:41 +0000</pubDate>
		<dc:creator>Paulo R. Pereira</dc:creator>
				<category><![CDATA[Trabalhando com CLR]]></category>
		<category><![CDATA[Trabalhando com SQL CLR]]></category>
		<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[CLR]]></category>
		<category><![CDATA[CSharp]]></category>
		<category><![CDATA[F#]]></category>
		<category><![CDATA[FSharp]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Visual Basic]]></category>
		<category><![CDATA[Web Services]]></category>

		<guid isPermaLink="false">https://sqlfromhell.wordpress.com/?p=4134</guid>
		<description><![CDATA[De que se trata o artigo: Este artigo permite o entendimento do potencial da integração da CLR com o SQL Server. Considerando o entendimento de como o SQL Server trabalha com a CLR para execução de rotinas desenvolvidas em C# e VB.NET, quando é recomendável e como utilizar desta integração para desenvolver rotinas, e por [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sqlfromhell.wordpress.com&#038;blog=7423972&#038;post=4134&#038;subd=sqlfromhell&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>De que se trata o artigo:</strong></p>
<p>Este artigo permite o entendimento do potencial da integração da CLR com o SQL Server. Considerando o entendimento de como o SQL Server trabalha com a CLR para execução de rotinas desenvolvidas em C# e VB.NET, quando é recomendável e como utilizar desta integração para desenvolver rotinas, e por fim, como administrar o que foi desenvolvido.</p>
<p><strong>Para que serve:</strong></p>
<p>A integração CLR do SQL Server permite basicamente desenvolver funções, stored procedures, tipos e triggers com C# ou VB.NET. Sendo uma alternativa mais prática e ágil do que a linguagem T-SQL pode oferecer para o desenvolvimento. Além de contar com uma diversidade de recursos e possibilidades de novas soluções.</p>
<p><strong>Em que situação o tema útil:</strong></p>
<p>No momento em que as limitações da linguagem T-SQL se tornam um problema para o desenvolvimento de rotinas complexas, o .NET Framework vem permitir possibilidades, além uma diversidade de recursos que ampliam a capacidade de oferecer soluções.</p>
<p><strong>Introdução: </strong></p>
<p>Desde o lançamento do SQL Server 2005, se tornou possível utilizar C# ou VB.NET para criar stored procedures, functions, types e triggers. Esta possibilidade é denominada integração CLR, que consiste basicamente em utilizar bibliotecas desenvolvidas em C# ou VB.NET, para criar objetos em nível de banco de dados. Estas bibliotecas, conhecidas como assemblies, estão presentes no computador como arquivos na extensão DLL e são traduzidas em rotinas para o sistema operacional pela CLR (<em>Common Language Runtime</em>), um componente do .NET Framework.</p>
<p>Pelo fato de que estes assemblies são traduzidos, ou melhor, executados pela CLR, eles tambamém contam com todo o potencial da .NET Framework neste processo.</p>
<p>A .NET Framework é a principal plataforma de desenvolvimento da Microsoft, utilizada para criar aplicações em nível de sistema operacional, aplicações para internet, equipamentos móveis e outras soluções. O que faz do desenvolvimento de assemblies para o SQL Server somente uma das suas possibilidades desta plataforma.</p>
<p>No desenvolvimento com a .NET Framework, é possível contar com bibliotecas que permitem criar soluções que manipulam em nível de sistema operacional (manipulação de registros do sistema, diretivas de segurança, sistema de arquivos), manipular de dados em diversos formatos, trabalhar com vetores, fluxos de memória e realizar cálculos complexos, além de facilitar a interação com WebServices e protocolos em nível de rede.</p>
<p>Também é comum no desenvolvimento com a .NET Framework, a utilização de interfaces de desenvolvimento, como o Visual Studio, que facilita e agiliza todo o processo de desenvolvimento.<span style="color:red;"><br />
</span></p>
<p>Em resumo, trabalhar com assemblies no SQL Sever não é somente de desenvolver objetos em nível de banco de dados com C# ou VB.NET ao invés de T-SQL, mas ter todo o potencial da .NET Framework para criar soluções.</p>
<p>Para permitir um bom entendimento do potencial desta feature, este artigo abordará como funciona a CLR e sua integração com o SQL Server, quando é recomendável utilizá-la, como desenvolver assemblies para o SQL Server e por último como administrar o que foi desenvolvido.</p>
<p><strong>Como funciona a integração CLR?<br />
</strong></p>
<p>No desenvolvimento de soluções com a .NET Framework, independentemente do tipo de solução, como aplicações Windows e Web, o compilador transforma o código de acordo com a linguagem utilizada (VB.NET, C#) em um assembly. Este assembly pode ser uma biblioteca (arquivo de extensão DLL) ou um arquivo executável (extensão EXE).</p>
<p>Conforme a Figura 1, o assembly é composto por duas estruturas básicas, sendo a primeira constituída de meta-dados (Metadata), que funcionam como um breve descritivo do código (namespaces, classes, métodos, propriedades, atributos e referências á outros assemblies), e a segunda camada, uma linguagem de alto-nível, denominada linguagem intermediária (IL ou MSIL), que é o código preparado para ser executado pela CLR.</p>
<p><img src="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_1.png?w=655" alt="" /></p>
<p><em>Figura 1. Estruturas básicas que compõem um assembly.</em></p>
<p>Quando um assembly é adicionado a um banco de dados, assunto abordado nos tópicos seguintes, o SQL Server utilizará a camada de meta-dados para entender como este assembly é constituído. Neste processo de entender como o assembly é constituído, o SQL Server verificará se este assembly possui todas as dependências necessárias no banco de dados (como referências a outros assemblies) e se obedece a determinados critérios de segurança para ser executado.</p>
<p>Após o assembly ser adicionado ao banco de dados, será possível criar procedures, funções, triggers ou tipos a partir de referências a determinados métodos ou estruturas do assembly que possuam assinaturas compatíveis com o SQL Server. Estas assinaturas são definidas por atributos durante a fase de desenvolvimento (assunto a ser tratado nos próximos tópicos) e permitem definir quais os tipos de objetos que podem ser criados por meio destes métodos e estruturas.</p>
<p>Como relacionado pela Figura 2, as estruturas (structs) desenvolvidas em C# e VB.NET poderão receber assinaturas/atributos para a criação de tipos e funções de agregação, e os métodos, assinaturas/atributos para stored procedures, funções escalares ou tabulares e triggers.</p>
<p><img src="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_2.png?w=655" alt="" /></p>
<p><em>Figura 2. Relação entre assinaturas/atributos do Assembly com objetos do banco de dados.</em></p>
<p>A execução de assemblies pela CLR é gerenciada pela .NET Framework em aspectos de segurança, memória, processamento e erros de execução.</p>
<p>Nos aspectos de segurança, um assembly poderá ser configurado como código seguro (SAFE), seguro com acesso a recursos externos (EXTERNAL_ACCESS) ou um código inseguro (UNSAFE). E a integração CLR interpretará esta configuração da seguinte forma:</p>
<p>SAFE: Rotinas que possuem restrição de acesso a recursos externos ao SQL Server e não referenciam assemblies com configuração de segurança diferente;</p>
<p>EXTERNAL_ACCESS: Rotinas que possuem restrição a códigos não-gerenciados, como objetos COM+ e assemblies UNSAFE, mas com a possibilidade de acessar recursos externos ao SQL Server, como arquivos, Web Services e serviços de e-mail SMTP;</p>
<p>UNSAFE: Rotinas que podem utilizar todo o potencial do .NET Framework, sem restrições de manipular até mesmo recursos e configurações do próprio sistema operacional, como registros, processamento, memória, drivers e objetos COM+.</p>
<p>Em relação à memória, o CLR possui uma ferramenta chamada Garbage Collector, que libera da memória as variáveis e objetos não utilizados durante a execução. Esta ação de liberar estas variáveis da memória permite que as rotinas utilizem somente a quantidade de memória necessária para serem executadas. Em contrapartida, esta ação pode exigir um pouco mais de processamento.</p>
<p>Diferente dos assemblies de aplicações tradicionais, os assemblies da integração CLR no SQL Server são gerenciadas pelo próprio SQL Server. Desta forma, cabe ao SQL Server controlar a demanda por recursos para execução dos assemblies para não comprometer a estabilidade do serviço de banco de dados.</p>
<p>Visto que se recursos utilizados por aplicações tradicionais são gerenciados pelo próprio sistema operacional, se da mesma maneira fosse com a integração CLR, a execução dos assemblies poderia concorrer por memória ou processamento com o próprio SQL Server, criando algum gargalo de desempenho e prejudicando o serviço de banco de dados.</p>
<p>Em relação aos erros de execução, como rotinas com laços de repetição infinitos (loops infinitos) e variáveis que recebem valores maiores que os suportados (overflow), a CLR possui total controle sobre estes erros, garantindo que, caso ocorram, seja possível identifica-los e trata-los programaticamente.</p>
<p><strong>Quando é recomendável utilizar CLR ao invés de T-SQL?<br />
</strong></p>
<p>Na época do SQL Server 2000, era comum usar objetos COM+ no SQL Server para acessar recursos externos, como Web Services, arquivos e pastas locais ou de rede, serviços de e-mail e informações internas do sistema operacional.</p>
<p>Também nesta época haviam muitas rotinas, denominadas Extended Stored Procedures, que faziam uso de código não-gerenciado (código sem a supervisão de um componente como a CLR, para ser executado). Visto que o uso de código não-gerenciado pode interferir tanto na estabilidade quanto na segurança do servidor, o surgimento do .NET Framework permitiu solucionar este problema.</p>
<p>Com o lançamento do .NET Framework 2.0 e a integração CLR do SQL Server 2005, muitas das Extended Stored Procedures nativas do SQL Server foram migradas para CLR, e foi recomendado que o que era desenvolvido anteriormente em código não-gerenciado fosse migrado para CLR.</p>
<p>Esta recomendação de utilizar CLR não foi somente válida para rotinas que fazem uso de COM+ e Extended Stored Procedures, mas também para rotinas T-SQL que possuem um alto grau de complexidade, como regras de negócio e cálculos matemáticos. Também considerando que rotinas complexas podem ser mais performáticas e manuteníveis com a utilização da CLR e linguagens já comuns ao ambiente de desenvolvimento, como VB.NET e C#.</p>
<p>No que se refere às regras de negócio e aos procedimentos que podem ser executados em nível de aplicação, recomenda-se que estes sejam executados em nível de aplicação. Pois mesmo que seja possível utilizar todo o potencial do .NET Framework dentro do SQL Server, não pode ser deixado de lado o papel do SQL Server como sistema de gerenciamento de banco de dados (SGBD) para torná-lo um hospedeiro para as aplicações. Considerando também que para manter a integridade e desempenho do acesso e manipulação de dados, os recursos do SQL Server serão concorridos para permitir a execução da CLR. Além do fato da CLR ser mais bem gerenciada pelo sistema operacional e por serviços dedicados para aplicação (como o IIS no caso das aplicações Web).</p>
<p>Quando for necessária a utilização de códigos não seguros no SQL Server, é recomendável avaliar se não é possível isolar este código em outro ambiente.</p>
<p>A Figura 3 demonstra um ambiente onde a utilização de códigos não seguros pode comprometer a segurança do banco de dados, dado o fato que eles exigem a criação de um assembly não seguro. Também considerando que o SQL Server pode ter sua estabilidade comprometida pelo fato de executar rotinas não seguras não gerenciadas pela CLR.</p>
<p><img src="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_3.png?w=655" alt="" /></p>
<p><em>Figura 3. Exemplo de um ambiente que pode comprometer a segurança do SQL Server</em></p>
<p>Uma forma simples de isolar a execução de códigos não seguros é a utilização de Web Service, e códigos seguros com acesso a este Web Services.</p>
<p>A Figura 4 apresenta uma rotina que utiliza objetos COM+ intermediado por um Web Service, exigindo da integração CLR somente fazer a ponte entre o Web Service e o SQL Server.</p>
<p><img src="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_4.png?w=655" alt="" /></p>
<p><em>Figura 4. Exemplo de um ambiente onde a execução de rotinas não seguras é isolada.</em></p>
<p>Também é interessante ressaltar que os Web Services não precisam ser desenvolvidos em VB.NET ou C# para ser compatíveis com a CLR, graças à diversidade de bibliotecas e recursos da .NET Framework para se comunicar com ambientes externos por meio de padrões universais, como XML, SOAP e RSS, ou padrões específicos, como ODBC, JSON e SMTP/POP3.</p>
<p>Na escolha entre T-SQL e CLR no desenvolvimento de novas rotinas, conforme ilustrado pela Figura 5, as abordagens com T-SQL permitem maior eficiência no acesso e manipulação de dados e recursos do próprio SQL Server. Por outro lado, a CLR permite maior eficiência no desenvolvimento de rotinas complexas ou que exijam acesso a recursos externos ao SQL Server.</p>
<p><img src="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_5.png?w=655" alt="" /></p>
<p><em>Figura 5. Quando escolher uma abordagem T-SQL ou CLR.</em></p>
<p>Outro o fato a ser considerado na utilização da CLR, é que a utilização de assemblies pode ser limitada ou não permitida por alguns serviços de hospedagem de sites/banco de dados, serviços de virtualização, cloud computing e soluções de alta disponibilidade.</p>
<p><strong>Como utilizar a integração CLR? </strong></p>
<p>Compreendido como funciona e quando utilizar a integração CLR, o primeiro passo antes do desenvolvimento das rotinas com esta integração é verificar se algumas configurações em nível de SQL Server precisam ser realizadas.</p>
<p>A primeira configuração esta relacionada à integração CLR está habilitada. Para verificar se a integração CLR está habilitada por meio da stored procedure sp_configure.</p>
<p>A partir da execução da stored procedure sp_configure será possível obter as seguintes informações de uma determinada configuração:</p>
<p>name: o nome da configuração propriamente dita;</p>
<p>minimum e maximum: os valores mínimo e máximo possíveis desta configuração. No caso da integração CLR, o valor &#8220;0&#8243; significa que ela está desabilitada e &#8220;1&#8243; que ela está habilitada;</p>
<p>config_value: o valor da configuração antes de ser aplicado;</p>
<p>run_value: valor atual da configuração.</p>
<p>De acordo com os valores obtidos pela sp_configure, a Figura 6 demonstra uma situação onde da integração CLR está desabilitada.</p>
<p><img src="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_6.png?w=655" alt="" /></p>
<p><em>Figura 6. Integração CLR desabilitada.</em></p>
<p>Um fato interessante é que mesmo com a integração CLR desabilitada, os tipos CLR nativos do SQL Server, como os tipos hierárquicos e espaciais (hierarchyid, geometry e geongraphy), funcionam sem problemas.</p>
<p>A Figura 7 demonstra como habilitar a integração CLR, primeiramente utilizando a função sp_configure seguida do nome da configuração e o valor desejado, alterando o valor config_value. Em um segundo passo, o comando RECONFIGURE é executado, aplicando o valor config_value sobre o run_value da configuração. Por fim, o comando sp_configure é executado novamente para verificar o valor atual da configuração – no caso, se a integração CLR foi habilitada com sucesso.</p>
<p><img src="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_7.png?w=655" alt="" /></p>
<p><em>Figura 7. Habilitando a integração CLR.</em></p>
<p>Ao se pensar em códigos seguros com acesso externo ou códigos não seguros, a propriedade Trustworthy (is_trustworthy_on) do banco de dados determinará se estes códigos podem ser utilizados. A Figura 8 demonstra uma situação onde o banco de dados não permite estes tipos de código.</p>
<p><img src="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_8.png?w=655" alt="" /></p>
<p><em>Figura 8. A propriedade Trustworthy desabilitada em um determinado banco de dados.</em></p>
<p>Além de utilizar códigos seguros com acesso externo ou códigos não seguros em um determinado banco de dados, a propriedade Trustworthy permitirá outras questões de segurança que não se limitam à integração CLR.</p>
<p>Para entender melhor os impactos de habilitar esta propriedade, e se ela está adequada ao seu ambiente, consulte o link: <em><a href="http://msdn.microsoft.com/en-us/library/ms187861.aspx">http://msdn.microsoft.com/en-us/library/ms187861.aspx</a> </em>.</p>
<p>A Figura 9 demonstra como habilitar a propriedade Trustworthy de um determinado banco de dados.</p>
<p><img src="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_9.png?w=655" alt="" /></p>
<p><em>Figura 9. Habilitando a propriedade Trustworthy.</em></p>
<p>Terminadas as configurações no nível de banco de dados, será possível utilizar o Visual Studio como ferramenta para desenvolver, com C# ou VB.NET, assemblies para o SQL Server.</p>
<p>O primeiro passo para desenvolver assemblies para o SQL Server com o Visual Studio é criar um projeto a partir do template Visual C# SQL CLR Database Project, como apresenta a Figura 10.</p>
<p><img src="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_10.png?w=655" alt="" /></p>
<p><em>Figura 10. Criando um projeto SQL CLR no Visual Studio 2010.</em></p>
<p>Depois de criado o projeto, aparecerá uma tela para referenciar o banco de dados onde os códigos serão instalados e executados (veja a Figura 11). Assim, adicione uma nova referência ou utilize uma já existente.</p>
<p><img src="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_11.png?w=655" alt="" /></p>
<p><em>Figura 11. Adicionando uma referencia a um determinado banco de dados ao projeto.</em></p>
<p>Ao referenciar o banco de dados ao projeto, evite trabalhar diretamente com ambientes de produção, para não causar problemas de desempenho quando forem executados os testes dos códigos em desenvolvimento.</p>
<p>Após referenciado o banco de dados, outra tela que aparecerá, conforme a Figura 12, possibilitando habilitar a depuração do código em tempo de execução (Debug). O Debug nada mais é que permitir, durante a execução do projeto no Visual Studio, acompanhar a execução no SQL Server.</p>
<p><img src="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_12.png?w=655" alt="" /></p>
<p><em>Figura 12. Habilitando o Debug no projeto.</em></p>
<p>Também não será possível utilizar o Debug se o login utilizado para referenciar o banco de dados não possuir as permissões necessários, no caso logins com permissão de &#8220;sysadmin&#8221;.</p>
<p>Terminadas as configurações do projeto, na janela <em>Solution Explorer</em> será possível ver a estrutura do projeto SQL CLR (Figura 13).</p>
<p>Os projetos SQL CLR possuem inicialmente scripts de PreDeploy e PostDeploy (executados antes e depois da publicação do projeto) e um script de Test, que poderá ser utilizado durante o Debug. No script de Test é possível informar alguns procedimentos para testar se as funcionalidades do assembly durante o Debug.</p>
<p><img src="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_13.png?w=655" alt="" /></p>
<p><em>Figura 13. Estrutura inicial do projeto SQL CLR.</em></p>
<p>Clicando com o botão direito sobre o projeto é possível adicionar um novo item, como pode ser visto na Figura 14. Este novo item nada mais é do que um arquivo contendo alguma espécie de código, normalmente em C#, VB.NET ou T-SQL.</p>
<p><img src="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_14.png?w=655" alt="" /><img src="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_15.png?w=655" alt="" /></p>
<p><em>Figura 14. Adicionando um novo item ao projeto</em></p>
<p>Este código poderá ser criado a partir de templates, evitando a necessidade de iniciar o código de um arquivo vazio, facilitando assim o desenvolvimento. Conforme a Figura 15, os templates disponíveis para criação deste código.</p>
<p>Para um primeiro exemplo, será utilizado o template <em>User-Defined Function</em> (ou função escalar) para desenvolver uma função de pouca complexidade, no caso o cálculo de fatoriais.</p>
<p><img src="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_16.png?w=655" alt="" /></p>
<p><em>Figura 15. Templates disponíveis para ao projeto SQL CLR</em></p>
<p><pre class="brush: csharp;">
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

public partial class UserDefinedFunctions
{
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlString GetFatorialCLR()
    {
        // Put your code here
        return new SqlString(&quot;Hello&quot;);
    }
};
</pre></p>
<p><em>Listagem 1. Template de uma função escalar.</em></p>
<p>A Listagem 1 traz o template inicial de uma função escalar em C#. Esta função é basicamente um método que retorna ao SQL Server o texto &#8220;Hello&#8221;. O SQL Server entenderá que este método se trata de uma função escalar por causa do atributo/assinatura Microsoft.SqlServer.Server.SqlFunction e adotará o nome da função como GetFatorialCLR() por ser este nome do método.</p>
<p>Para entender o funcionamento desta função, clique com o botão direito sobre o projeto, e conforme a Figura 16, utilize a opção <em>Deploy</em> para instalar este assembly no banco de dados referenciado na criação do projeto.</p>
<p><img src="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_17.png?w=655" alt="" /></p>
<p><em>Figura 16. Executando o Deploy de um projeto SQL CLR</em></p>
<p>Se a instalação do assembly for realizada com sucesso, será possível obter mensagens de sucesso na janela <em>Output</em> do Visual Studio, conforme a Figura 17.</p>
<p><img src="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_18.png?w=655" alt="" /></p>
<p><em>Figura 17. Mensagens sucesso de uma instalação bem sucedida.</em></p>
<p>Após a instalação do assembly, abra o SQL Server Management Studio e se conecte ao banco de dados onde este assembly foi instalado. Por fim, execute a função GetFatorialCLR(), como demonstrado na Figura 18.</p>
<p><img src="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_19.png?w=655" alt="" /></p>
<p><em>Figura 18. Resultado da execução da função GetFatorialCLR.</em></p>
<p>Visto que a publicação ocorreu com sucesso e a função está funcionando, será possível customizar a função ao ponto de ser possível obter o resultado desejado, no caso, o cálculo da fatorial, conforme a Listagem 2.</p>
<p><pre class="brush: csharp;">
using System;
using System.Data.SqlTypes;
using System.Linq;
using Microsoft.SqlServer.Server;

public partial class UserDefinedFunctions
{
    [SqlFunction(Name = &quot;GetFatorialCLR&quot;)]
    public static SqlDouble GetFatorialCLR(SqlInt32 Value)
    {
        if (Value.IsNull || Value &lt;= 1) return 1;

        var fatorial = Enumerable.Range(1, Value.Value)
            .Select(i =&gt; (double)i)
            .Aggregate((i, j) =&gt; i * j);

        return double.IsInfinity(fatorial) ? SqlDouble.Null : fatorial;
    }
};
</pre></p>
<p><em>Listagem 2. Código da função GetFatorialGLR() ajustado para recuperar o fatorial.</em></p>
<p>Após instalar o assembly novamente pelo Visual Studio, será possível obter como resultado da função GetFatorialCLR(), o valor de um determinado fatorial.</p>
<p><img src="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_20.png?w=655" alt="" /></p>
<p><em>Figura 19. Resultado da execução da função GetFatorialCLR após os ajustes.</em></p>
<p>Como com o CLR existe maior controle sobre valores numéricos que o T-SQL, é possível tratar valores decimais que sofreram alguma forma de overflow (quando uma variável recebe um valor que ela não pode suportar).</p>
<p>Como exemplo de overflow, o fatorial do número 171 resulta em um valor que ultrapassa o suportado pelo tipo float do SQL Server, e por meio da CLR será possível tratar este valor antes de ser submetido ao SQL Server e gere alguma forma de erro. Conforme a Listagem 2, foi utilizado o método IsInfinity() do tipo double da CLR para verificar se houve ou não overflow, e retornar um valor fixo (como NULL), resultado demonstrado pela Figura 20.</p>
<p><img src="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_21.png?w=655" alt="" /></p>
<p><em>Figura 20. Resultado da execução da função GetFatorialCLR() em uma situação de overflow</em></p>
<p>Graças às diversidades das bibliotecas do .NET Framework, principalmente às nativas da plataforma, será possível criar funcionalidades mais complexas do que as permitidas com o simples T-SQL, como criar uma função que utiliza expressões regulares (Regex).</p>
<p>A Listagem 3 demonstra um código que utiliza Regex para remover determinados elementos de um texto, conforme o resultado da Figura 21.</p>
<p><pre class="brush: csharp;">
using System;
using System.Data.SqlTypes;
using System.Linq;
using System.Text.RegularExpressions;
using Microsoft.SqlServer.Server;

public partial class UserDefinedFunctions
{
    [SqlFunction(Name = &quot;RegexReplaceCLR&quot;)]
    [return: SqlFacet(MaxSize = -1)]
    public static SqlString RegexReplaceCLR(
        [SqlFacet(MaxSize = -1)]SqlString Input,
        [SqlFacet(MaxSize = 50)]SqlString Pattern,
        [SqlFacet(MaxSize = 50)]SqlString Replacement)
    {
        if (Input.IsNull || Pattern.IsNull || Replacement.IsNull) return null;

        var regEx = new Regex(Pattern.Value);
        return regEx.Replace(Input.Value, Replacement.Value);
    }
};
</pre></p>
<p><em>Listagem 3. Código de uma função para substituir caracteres por meio de uma expressão regular.</em></p>
<p><img src="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_22.png?w=655" alt="" /></p>
<p><em>Figura 21. Resultado da execução da função para substituir caracteres por meio de uma expressão regular.</em></p>
<p>Verifique que na Listagem 3 foi utilizado o atributo SqlFacet, que possui basicamente a função de definir como a integração CLR interpretará os valores recebidos e retornados do SQL Server. Sendo uma utilização comum deste atributo definir o tamanho das variáveis. Já que por padrão as variáveis do tipo SqlString resultam em um varchar(8000), com a configuração do atributo SqlFacet, estas variáveis poderão variar de um tamanho fixo á varchar(max), no caso &#8220;MaxSize=-1&#8243;.</p>
<p>Outra possibilidade interessante da CLR é criar funções tabulares para obter sequência de valores sem a necessidade de utilizar muitas linhas de código ou lógicas complexas com tabelas temporárias ou CTE.</p>
<p>O principal diferencial das funções tabulares (que retornam resultado em formato de &#8220;tabela&#8221;) e as funções escalares (que retornam um único valor), é o uso de um método auxiliar para formatação dos valores, referenciado pela propriedade FillRowMethodName (exemplo, Int32Fill) e a definição da estrutura do resultado por meio da propriedade TableDefinition.</p>
<p>As Listagem 4 e Figura 22, demonstram o código e a execução de uma função tabular.</p>
<p><pre class="brush: csharp;">
using System;
using System.Collections;
using System.Data.SqlTypes;
using System.Linq;
using Microsoft.SqlServer.Server;

public partial class UserDefinedFunctions
{
    [SqlFunction(Name = &quot;RangeCLR&quot;
        , FillRowMethodName = &quot;Int32Fill&quot;
        , TableDefinition = &quot;Value INT&quot;)]
    public static IEnumerable RangeCLR(SqlInt32 Value)
    {
        return Value.IsNull || Value &lt; 1
            ? null
            : Enumerable.Range(1, Value.Value);
    }

    public static void Int32Fill(object obj, out SqlInt32 value)
    {
        value = (int)obj;
    }
};
</pre></p>
<p><em>Listagem 4. Exemplo de função tabular que retorna uma sequencia de valores iniciando de 1 até um valor informado.</em></p>
<p><img src="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_23.png?w=655" alt="" /></p>
<p><em>Figura 22. Resultado da função tabular que retorna uma sequencia de valores iniciando de 1 até um valor informado.</em></p>
<p>Também é possível desenvolver funcionalidades que podem ser desenvolvidas de maneiras mais simples com CLR, como funções de validação de CPF e CNPJ.</p>
<p>Outra funcionalidade que pode justificar a utilização de CLR é a possibilidade de criar funções de agregação, como recuperar o primeiro ou último registro de uma agregação ou concatenar textos.</p>
<p>Na Figura 23 e Listagem 5, uma função de agregação desenvolvida em CLR, que possui resultado semelhante à função COUNT nativa do SQL Server, permitindo customizações para o desenvolvimento de soluções mais específicas.</p>
<p><pre class="brush: csharp;">
using System;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

[Serializable]
[SqlUserDefinedAggregate(Format.Native)]
public struct CountCLR
{
    public SqlInt32 Ticks { get; set; }

    public void Init() { Ticks = 0; }

    public void Accumulate(SqlInt32 Value) { Ticks += 1; }

    public void Merge(CountCLR Group) { if (!Group.Ticks.IsNull) Ticks += Group.Ticks; }

    public SqlInt32 Terminate() { return Ticks; }
}
</pre></p>
<p><em>Listagem 5. Exemplo de função de agregação semelhante à função COUNT.</em></p>
<p><img src="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_24.png?w=655" alt="" /></p>
<p><em>Figura 23. Execução da função COUNT e da função de agregação desenvolvida em CLR.</em></p>
<p>Tanto as funções de agregação, quanto os tipos CLR são desenvolvidos por meio de uma struct serializável. Isso quer dizer que os valores durante são armazenados em memória, e no caso dos tipos CLR, também em disco, no formado binário. Este formato binário e até mesmo a forma de serialização podem ser customizadas, ou para armazenar até o limite de um tipo varbinary(max) a partir do SQL Server 2008 (ou varbinary(8000) no SQL Server 2005) ou até mesmo, se realmente for necessário, expandir este armazenamento de forma distribuída (Web Services, objetos COM ou arquivos).</p>
<p>Ao término do processo de desenvolvimento de sua solução CLR, passando para a instalação do assembly em um servidor de produção, serão necessários alguns ajustes das configurações no projeto.</p>
<p>Então, clique com o botão direito sobre o projeto e abra as propriedades do projeto.</p>
<p>Conforme a Figura 24, altere a referência do banco de dados para o banco de dados de produção na aba <em>Database</em>, propriedade <em>Connection String</em>, botão <em>Browse&#8230;</em>.</p>
<p><img src="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_25.png?w=655" alt="" /></p>
<p><em>Figura 24. Propriedades de um projeto SQL CLR, aba Database.</em></p>
<p>Nesta aba, também será possível ajustar os aspectos de segurança do Assembly (SAFE, EXTERNAL e UNSAFE) e o dono (<em>owner</em>) deste Assembly.</p>
<p>Ajustadas as referências ao banco de dados de produção, altere o modo de compilação do Visual Studio para <em>Release</em>, conforme a Figura 25. Por fim, execute o <em>Deploy</em> do projeto, de acordo com a Figura 26.</p>
<p><img src="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_26.png?w=655" alt="" /></p>
<p><em>Figura 25. Ajustando o modelo de compilação do Visual Studio.</em></p>
<p><img src="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_27.png?w=655" alt="" /></p>
<p><em>Figura 26. Executando o Deploy do projeto após as configurações para o ambiente de produção</em></p>
<p>A Figura 27 demonstra que é possível encontrar no banco de dados o assembly após a instalação, assim como as stored procedures, funções, tipos e triggers desenvolvidas por meio deste.</p>
<p><img src="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_28.png?w=655" alt="" /></p>
<p><em>Figura 27. Assembly e objetos CLR publicados no SQL Server.</em></p>
<p>A partir de algumas catalog views, será possível obter informações dos assemblies no SQL Server, conforme relacionadas na Tabela 1.</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="185"><strong>Catalog View</strong></td>
<td valign="top" width="406"><strong>Descrição</strong></td>
</tr>
<tr>
<td valign="top" width="185"><strong>sys.assemblies</strong></td>
<td valign="top" width="406">Informações   básicas sobre os assemblies existentes no banco de dados.</td>
</tr>
<tr>
<td valign="top" width="185"><strong>sys.assembly_files</strong></td>
<td valign="top" width="406">Informações sobre assemblies formados   por um ou mais arquivos.</td>
</tr>
<tr>
<td valign="top" width="185"><strong>sys.assembly_references</strong></td>
<td valign="top" width="406">Informações   sobre assemblies que possuem alguma forma de referência a outros assemblies.</td>
</tr>
<tr>
<td valign="top" width="185"><strong>sys.assembly_modules</strong></td>
<td valign="top" width="406">Informações de objetos desenvolvidos a   partir de assemblies. Passível de obter maiores informações em conjunto com   outras views do sistemas, como sys.objects.</td>
</tr>
<tr>
<td valign="top" width="185"><strong>sys.assembly_types</strong></p>
<p><strong>sys.type_assembly_usages</strong></td>
<td valign="top" width="406">Informações   sobre os tipos CLR e seus respectivos assemblies.</td>
</tr>
<tr>
<td valign="top" width="185"><strong>sys.dm_os_workers</strong></p>
<p><strong>sys.dm_clr_tasks</strong></p>
<p><strong>sys.dm_clr_appdomains</strong></td>
<td valign="top" width="406">Úteis para obter informações sobre a   execução de assemblies no SQL Server.</td>
</tr>
</tbody>
</table>
<p><em>Tabela 1. Relação de catalog views que possuem informações sobre assemblies no SQL Server.</em></p>
<p>A Figura 28 segue com uma demonstração de como acompanhar a execução de seus assemblies.</p>
<p><img src="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_29.png?w=655" alt="" /></p>
<p><em>Figura 28. Modelo de código para acompanhar a execução de assemblies de um determinado banco de dados.</em></p>
<p><strong>Conclusão </strong></p>
<p>Este artigo permitiu uma visão geral do desenvolvimento com a integração CLR. Considerando o entendimento de como o SQL Server trabalha com a CLR para execução de rotinas desenvolvidas em C# e VB.NET, quando é recomendável e como utilizar desta integração para desenvolver rotinas, e por fim, como administrar o que foi desenvolvido.</p>
<p>Mesmo entendendo como a integração CLR funciona e conhecendo seu potencial, é importante estar ciente de quando desenvolver funcionalidades. Mas não deixando de lado, a necessidade de realizar testes unitários e de stress para evitar problemas em ambientes de produção e conhecer os limites da utilização do que foi desenvolvido.</p>
<p>Por se tratar de uma funcionalidade que combina várias tecnologias em evolução, a cada versão do SQL Server, do Visual Studio e do .NET Framework, mais recursos são disponibilizados. Recursos estes, que facilitam o desenvolvimento e ampliam o leque de possibilidades para novas soluções. Sendo uma das melhorias esperadas para o SQL Server 11 &#8220;Denali&#8221;, a integração com o .NET Framework 4.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sqlfromhell.wordpress.com/4134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sqlfromhell.wordpress.com/4134/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sqlfromhell.wordpress.com/4134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sqlfromhell.wordpress.com/4134/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/sqlfromhell.wordpress.com/4134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/sqlfromhell.wordpress.com/4134/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/sqlfromhell.wordpress.com/4134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/sqlfromhell.wordpress.com/4134/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sqlfromhell.wordpress.com/4134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sqlfromhell.wordpress.com/4134/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sqlfromhell.wordpress.com/4134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sqlfromhell.wordpress.com/4134/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sqlfromhell.wordpress.com/4134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sqlfromhell.wordpress.com/4134/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sqlfromhell.wordpress.com&#038;blog=7423972&#038;post=4134&#038;subd=sqlfromhell&#038;ref=&#038;feed=1" width="1" height="1" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SqlFromHell?a=rDte10e7Zq0:NRdI324EWlY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/SqlFromHell?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SqlFromHell/~4/rDte10e7Zq0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sqlfromhell.wordpress.com/2012/04/20/integracao-sql-clr-no-sql-server-visao-geral/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f03e5c495f2141f766e9a09eb9febb84?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">Paulo R. Pereira</media:title>
		</media:content>

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_1.png" medium="image" />

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_2.png" medium="image" />

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_3.png" medium="image" />

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_4.png" medium="image" />

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_5.png" medium="image" />

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_6.png" medium="image" />

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_7.png" medium="image" />

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_8.png" medium="image" />

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_9.png" medium="image" />

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_10.png" medium="image" />

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_11.png" medium="image" />

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_12.png" medium="image" />

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_13.png" medium="image" />

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_14.png" medium="image" />

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_15.png" medium="image" />

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_16.png" medium="image" />

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_17.png" medium="image" />

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_18.png" medium="image" />

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_19.png" medium="image" />

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_20.png" medium="image" />

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_21.png" medium="image" />

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_22.png" medium="image" />

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_23.png" medium="image" />

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_24.png" medium="image" />

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_25.png" medium="image" />

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_26.png" medium="image" />

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_27.png" medium="image" />

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_28.png" medium="image" />

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/04/042012_2217_29.png" medium="image" />
	<feedburner:origLink>http://sqlfromhell.wordpress.com/2012/04/20/integracao-sql-clr-no-sql-server-visao-geral/</feedburner:origLink></item>
		<item>
		<title>Arte do FOR XML – Resumo</title>
		<link>http://feedproxy.google.com/~r/SqlFromHell/~3/hZLivveoZx4/</link>
		<comments>http://sqlfromhell.wordpress.com/2012/04/20/arte-do-for-xml-resumo/#comments</comments>
		<pubDate>Fri, 20 Apr 2012 22:08:36 +0000</pubDate>
		<dc:creator>Paulo R. Pereira</dc:creator>
				<category><![CDATA[Arte do FOR XML]]></category>
		<category><![CDATA[FOR XML]]></category>
		<category><![CDATA[Trabalhando com XML]]></category>

		<guid isPermaLink="false">http://sqlfromhell.wordpress.com/?p=4101</guid>
		<description><![CDATA[A categoria de artigos que mais me deu trabalho, pois o WordPress apagou várias vezes os exemplos dos XML na hora de publicar, mas um dos assuntos que mais gosto de tratar no SQL Server. Gerando XML no SQL Server – Arte do FOR XML AUTO Gerando XML no SQL Server – Arte do FOR [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sqlfromhell.wordpress.com&#038;blog=7423972&#038;post=4101&#038;subd=sqlfromhell&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>A categoria de artigos que mais me deu trabalho, pois o WordPress apagou várias vezes os exemplos dos XML na hora de publicar, mas um dos assuntos que mais gosto de tratar no SQL Server.</p>
<p><a title="Link permanente para Gerando XML no SQL Server – Arte do FOR XML AUTO" href="http://sqlfromhell.wordpress.com/2011/06/22/gerando-xml-no-sql-server-arte-do-for-xml-auto/">Gerando XML no SQL Server – Arte do FOR XML AUTO</a></p>
<p><a title="Link permanente para Gerando XML no SQL Server – Arte do FOR XML EXPLICIT" href="http://sqlfromhell.wordpress.com/2011/06/30/gerando-xml-no-sql-server-arte-do-for-xml-explicit/">Gerando XML no SQL Server – Arte do FOR XML EXPLICIT</a></p>
<p><a title="Link permanente para Gerando XML no SQL Server – Arte do FOR XML RAW" href="http://sqlfromhell.wordpress.com/2011/07/07/gerando-xml-no-sql-server-arte-do-for-xml-raw/">Gerando XML no SQL Server – Arte do FOR XML RAW</a></p>
<p><a title="Link permanente para Gerando XML no SQL Server – Arte do FOR XML PATH" href="http://sqlfromhell.wordpress.com/2011/07/13/gerando-xml-no-sql-server-%e2%80%93-arte-do-for-xml-path/">Gerando XML no SQL Server – Arte do FOR XML PATH</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sqlfromhell.wordpress.com/4101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sqlfromhell.wordpress.com/4101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sqlfromhell.wordpress.com/4101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sqlfromhell.wordpress.com/4101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/sqlfromhell.wordpress.com/4101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/sqlfromhell.wordpress.com/4101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/sqlfromhell.wordpress.com/4101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/sqlfromhell.wordpress.com/4101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sqlfromhell.wordpress.com/4101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sqlfromhell.wordpress.com/4101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sqlfromhell.wordpress.com/4101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sqlfromhell.wordpress.com/4101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sqlfromhell.wordpress.com/4101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sqlfromhell.wordpress.com/4101/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sqlfromhell.wordpress.com&#038;blog=7423972&#038;post=4101&#038;subd=sqlfromhell&#038;ref=&#038;feed=1" width="1" height="1" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SqlFromHell?a=hZLivveoZx4:gAfUJGbvZJw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/SqlFromHell?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SqlFromHell/~4/hZLivveoZx4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sqlfromhell.wordpress.com/2012/04/20/arte-do-for-xml-resumo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f03e5c495f2141f766e9a09eb9febb84?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">Paulo R. Pereira</media:title>
		</media:content>
	<feedburner:origLink>http://sqlfromhell.wordpress.com/2012/04/20/arte-do-for-xml-resumo/</feedburner:origLink></item>
		<item>
		<title>Imagens no banco de dados – Resumo</title>
		<link>http://feedproxy.google.com/~r/SqlFromHell/~3/yBuOExaYr7s/</link>
		<comments>http://sqlfromhell.wordpress.com/2012/04/20/imagens-no-banco-de-dados-resumo/#comments</comments>
		<pubDate>Fri, 20 Apr 2012 22:04:07 +0000</pubDate>
		<dc:creator>Paulo R. Pereira</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[ADO.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Trabalhando com arquivos e imagens]]></category>

		<guid isPermaLink="false">http://sqlfromhell.wordpress.com/?p=4099</guid>
		<description><![CDATA[Nestes três anos, trabalhei várias formas de utilizar imagens armazenadas em banco de dados com C# e SQL Server, eu espero que tenham gostado: Imagens no banco de dados 1 – ASP.NET Web Forms Imagens no banco de dados 2 – ASP.NET MVC Imagens no banco de dados 3 – Windows Forms Imagens no banco [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sqlfromhell.wordpress.com&#038;blog=7423972&#038;post=4099&#038;subd=sqlfromhell&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Nestes três anos, trabalhei várias formas de utilizar imagens armazenadas em banco de dados com C# e SQL Server, eu espero que tenham gostado:</p>
<p><a title="Link permanente para Imagens no banco de dados 1 – ASP.NET Web Forms" href="http://sqlfromhell.wordpress.com/2011/04/27/imagens-no-banco-de-dados-asp-net-web-forms/">Imagens no banco de dados 1 – ASP.NET Web Forms</a></p>
<p><a title="Link permanente para Imagens no banco de dados 2 – ASP.NET MVC" href="http://sqlfromhell.wordpress.com/2011/04/27/imagens-no-banco-de-dados-asp-net-mvc/">Imagens no banco de dados 2 – ASP.NET MVC</a></p>
<p><a title="Link permanente para Imagens no banco de dados 3 – Windows Forms" href="http://sqlfromhell.wordpress.com/2011/04/28/imagens-no-banco-de-dados-windows-forms/">Imagens no banco de dados 3 – Windows Forms</a></p>
<p><a title="Link permanente para Imagens no banco de dados 4.1 – Relatórios em RDLC" href="http://sqlfromhell.wordpress.com/2011/05/02/imagens-no-banco-de-dados-4-1-%e2%80%93-relatorios-em-rdlc/">Imagens no banco de dados 4.1 – Relatórios em RDLC</a></p>
<p><a title="Link permanente para Imagens no banco de dados 4.2 – Relatórios em RDLC" href="http://sqlfromhell.wordpress.com/2011/05/02/imagens-no-banco-de-dados-relatorios-em-rdlc-2/">Imagens no banco de dados 4.2 – Relatórios em RDLC</a></p>
<p><a title="Link permanente para Imagens no banco de dados 5 – Importando arquivos por T-SQL" href="http://sqlfromhell.wordpress.com/2011/05/10/importando-arquivos-por-t-sql/">Imagens no banco de dados 5 – Importando arquivos por T-SQL</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sqlfromhell.wordpress.com/4099/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sqlfromhell.wordpress.com/4099/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sqlfromhell.wordpress.com/4099/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sqlfromhell.wordpress.com/4099/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/sqlfromhell.wordpress.com/4099/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/sqlfromhell.wordpress.com/4099/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/sqlfromhell.wordpress.com/4099/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/sqlfromhell.wordpress.com/4099/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sqlfromhell.wordpress.com/4099/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sqlfromhell.wordpress.com/4099/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sqlfromhell.wordpress.com/4099/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sqlfromhell.wordpress.com/4099/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sqlfromhell.wordpress.com/4099/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sqlfromhell.wordpress.com/4099/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sqlfromhell.wordpress.com&#038;blog=7423972&#038;post=4099&#038;subd=sqlfromhell&#038;ref=&#038;feed=1" width="1" height="1" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SqlFromHell?a=yBuOExaYr7s:5ONN0Nlo8hM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/SqlFromHell?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SqlFromHell/~4/yBuOExaYr7s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sqlfromhell.wordpress.com/2012/04/20/imagens-no-banco-de-dados-resumo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f03e5c495f2141f766e9a09eb9febb84?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">Paulo R. Pereira</media:title>
		</media:content>
	<feedburner:origLink>http://sqlfromhell.wordpress.com/2012/04/20/imagens-no-banco-de-dados-resumo/</feedburner:origLink></item>
		<item>
		<title>Trabalhando com Spatial Data no SQL Server – Resumo</title>
		<link>http://feedproxy.google.com/~r/SqlFromHell/~3/qoq1EZ7qzp8/</link>
		<comments>http://sqlfromhell.wordpress.com/2012/04/20/trabalhando-com-spatial-data-no-sql-server-resumo/#comments</comments>
		<pubDate>Fri, 20 Apr 2012 21:59:14 +0000</pubDate>
		<dc:creator>Paulo R. Pereira</dc:creator>
				<category><![CDATA[Spatial Data]]></category>

		<guid isPermaLink="false">http://sqlfromhell.wordpress.com/?p=4096</guid>
		<description><![CDATA[Então pessoas, abaixo os links dos artigos que trataram sobre Spatial Data que escrevi no blog nestes 2 anos. Spatial Data: Introdução aos tipos geométricos Spatial Data: STGeomFromText – Árvore de Natal Spatial Data: Envolvendo e cercando polígonos Spatial Data: Desmembrando Polígonos!? Spatial Data: Uniões e Intersecções E por último uma mescla de Spatial Data [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sqlfromhell.wordpress.com&#038;blog=7423972&#038;post=4096&#038;subd=sqlfromhell&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Então pessoas, abaixo os links dos artigos que trataram sobre Spatial Data que escrevi no blog nestes 2 anos.</p>
<p><a title="Spatial Data: Introdução aos tipos geométricos" href="http://sqlfromhell.wordpress.com/2009/12/06/spatial-data-introducao-aos-tipos-geometricos/">Spatial Data: Introdução aos tipos geométricos</a></p>
<p><a title="Spatial Data: STGeomFromText" href="http://sqlfromhell.wordpress.com/2009/12/13/spatial-data-stgeomfromtext/">Spatial Data: STGeomFromText – <strong>Árvore de Natal</strong></a></p>
<p><a title="Spatial Data: Envolvendo e cercando polígonos" href="http://sqlfromhell.wordpress.com/2010/12/07/spatial-data-2/">Spatial Data: Envolvendo e cercando polígonos</a></p>
<p><a title="Spatial Data: Desmembrando Polígonos!?" href="http://sqlfromhell.wordpress.com/2010/12/14/desmembrando-poligonos/">Spatial Data: Desmembrando Polígonos!?</a></p>
<p><a title="Spatial Data: Uniões e Intersecções" href="http://sqlfromhell.wordpress.com/2010/12/29/spatial-data/">Spatial Data: Uniões e Intersecções</a></p>
<p>E por último uma mescla de Spatial Data e SQL CLR:</p>
<p><a title="Link permanente para Trabalhando com SQL CLR e Spatial Data" href="http://sqlfromhell.wordpress.com/2011/07/27/trabalhando-com-sql-clr-e-spatial-data/">Trabalhando com SQL CLR e Spatial Data</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sqlfromhell.wordpress.com/4096/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sqlfromhell.wordpress.com/4096/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sqlfromhell.wordpress.com/4096/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sqlfromhell.wordpress.com/4096/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/sqlfromhell.wordpress.com/4096/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/sqlfromhell.wordpress.com/4096/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/sqlfromhell.wordpress.com/4096/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/sqlfromhell.wordpress.com/4096/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sqlfromhell.wordpress.com/4096/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sqlfromhell.wordpress.com/4096/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sqlfromhell.wordpress.com/4096/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sqlfromhell.wordpress.com/4096/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sqlfromhell.wordpress.com/4096/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sqlfromhell.wordpress.com/4096/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sqlfromhell.wordpress.com&#038;blog=7423972&#038;post=4096&#038;subd=sqlfromhell&#038;ref=&#038;feed=1" width="1" height="1" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SqlFromHell?a=qoq1EZ7qzp8:8hlJnWezwlU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/SqlFromHell?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SqlFromHell/~4/qoq1EZ7qzp8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sqlfromhell.wordpress.com/2012/04/20/trabalhando-com-spatial-data-no-sql-server-resumo/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f03e5c495f2141f766e9a09eb9febb84?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">Paulo R. Pereira</media:title>
		</media:content>
	<feedburner:origLink>http://sqlfromhell.wordpress.com/2012/04/20/trabalhando-com-spatial-data-no-sql-server-resumo/</feedburner:origLink></item>
		<item>
		<title>Trabalhando com SMO – Resumo</title>
		<link>http://feedproxy.google.com/~r/SqlFromHell/~3/OyX3I5inetQ/</link>
		<comments>http://sqlfromhell.wordpress.com/2012/04/20/trabalhando-com-smo-resumo/#comments</comments>
		<pubDate>Fri, 20 Apr 2012 21:53:12 +0000</pubDate>
		<dc:creator>Paulo R. Pereira</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[SMO]]></category>
		<category><![CDATA[Trabalhando com SMO]]></category>

		<guid isPermaLink="false">http://sqlfromhell.wordpress.com/?p=4094</guid>
		<description><![CDATA[Então pessoas, abaixo os links dos artigos que trataram sobre SQL Server Management Objects (SMO) que escrevi utilizando PowerShell e .NET para administrar o SQL Server. Primeiramente os artigos em C#: Gerenciando o SQL Server por meio de aplicações .NET – Primeiros passos Gerando backups do SQL Server por .NET Gerando scripts do banco de [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sqlfromhell.wordpress.com&#038;blog=7423972&#038;post=4094&#038;subd=sqlfromhell&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Então pessoas, abaixo os links dos artigos que trataram sobre SQL Server Management Objects (SMO) que escrevi utilizando PowerShell e .NET para administrar o SQL Server.</p>
<p><strong>Primeiramente os artigos em C#:</strong></p>
<p><a title="Link permanente para Gerenciando o SQL Server por meio de aplicações .NET – Primeiros passos" href="http://sqlfromhell.wordpress.com/2012/01/05/gerenciando-o-sql-server-por-meio-de-aplicacoes-net-primeiros-passos/">Gerenciando o SQL Server por meio de aplicações .NET – Primeiros passos</a></p>
<p><a title="Link permanente para Gerando backups do SQL Server por .NET" href="http://sqlfromhell.wordpress.com/2012/01/09/gerando-backups-do-sql-server-por-net/">Gerando backups do SQL Server por .NET</a></p>
<p><a title="Link permanente para Gerando scripts do banco de dados por .NET – Passo 1" href="http://sqlfromhell.wordpress.com/2012/01/17/gerando-scripts-do-banco-de-dados-por-net-passo-1/">Gerando scripts do banco de dados por .NET – Passo 1</a></p>
<p><a title="Link permanente para Gerando scripts do banco de dados por .NET – Passo 2" href="http://sqlfromhell.wordpress.com/2012/02/01/gerando-scripts-do-banco-de-dados-por-net-passo-2/">Gerando scripts do banco de dados por .NET – Passo 2</a></p>
<p><a title="Link permanente para Criando e manipulando Tabelas e Colunas no SQL Server com .NET" href="http://sqlfromhell.wordpress.com/2012/02/07/criando-e-manipulando-tabelas-e-colunas-no-sql-server-com-c/">Criando e manipulando Tabelas e Colunas no SQL Server com .NET</a></p>
<p><a title="Link permanente para Criando Constraints e Índices no SQL Server com .NET" href="http://sqlfromhell.wordpress.com/2012/02/15/criando-constraints-e-indices-no-sql-server-com-net/">Criando Constraints e Índices no SQL Server com .NET</a></p>
<p><a title="Link permanente para Capturando consultas executadas no SQL Server (Trace) com .NET via SMO" href="http://sqlfromhell.wordpress.com/2012/02/27/capturando-consultas-executadas-no-sql-server-trace-com-net-via-smo/">Capturando consultas executadas no SQL Server (Trace) com .NET via SMO</a></p>
<p><a title="Link permanente para Criando um arquivo de trace com .NET via SMO" href="http://sqlfromhell.wordpress.com/2012/03/07/criando-um-arquivo-de-trace-com-net-via-smo/">Criando um arquivo de trace com .NET via SMO</a></p>
<p><a title="Link permanente para Capturando eventos do SQL Server com .NET via SMO sem Triggers ou Trace" href="http://sqlfromhell.wordpress.com/2012/03/15/capturando-eventos-do-sql-server-com-net-via-smo-sem-triggers-ou-trace/">Capturando eventos do SQL Server com .NET via SMO sem Triggers ou Trace</a></p>
<p><a title="Link permanente para Capturando eventos de um determinado bancos de dados com .NET via SMO sem Triggers ou Trace" href="http://sqlfromhell.wordpress.com/2012/03/23/capturando-eventos-de-um-determinado-bancos-de-dados-com-net-via-smo-sem-triggers-ou-trace/">Capturando eventos de um determinado bancos de dados com .NET via SMO sem Triggers ou Trace</a></p>
<p><a title="Link permanente para Monitorando Deadlocks do SQL Server com SMO" href="http://sqlfromhell.wordpress.com/2012/04/04/monitorando-deadlocks-do-sql-server-com-smo/">Monitorando Deadlocks do SQL Server com SMO</a></p>
<p><strong>E os artigos que traduzi para PowerShell:</strong></p>
<p><a title="Link permanente para Gerando backups do SQL Server por PowerShell" href="http://sqlfromhell.wordpress.com/2012/01/12/gerando-backups-do-sql-server-por-powershell/">Gerando backups do SQL Server por PowerShell</a></p>
<p><a title="Link permanente para Gerando scripts do banco de dados por PowerShell – Passo 1" href="http://sqlfromhell.wordpress.com/2012/01/18/gerando-scripts-do-banco-de-dados-por-powershell-passo-1/">Gerando scripts do banco de dados por PowerShell – Passo 1</a></p>
<p><a title="Link permanente para Gerando scripts do banco de dados por PowerShell – Passo 2" href="http://sqlfromhell.wordpress.com/2012/02/03/gerando-scripts-do-banco-de-dados-por-powershell-passo-2/">Gerando scripts do banco de dados por PowerShell – Passo 2</a></p>
<p><a title="Link permanente para Criando e manipulando Tabelas e Colunas no SQL Server com PowerShell" href="http://sqlfromhell.wordpress.com/2012/02/07/criando-e-manipulando-tabelas-e-colunas-no-sql-server-com-powershell/">Criando e manipulando Tabelas e Colunas no SQL Server com PowerShell</a></p>
<p><a title="Link permanente para Criando Constraints e Índices no SQL Server com PowerShell" href="http://sqlfromhell.wordpress.com/2012/02/15/criando-constraints-e-indices-no-sql-server-com-powershell/">Criando Constraints e Índices no SQL Server com PowerShell</a></p>
<p><a title="Link permanente para Capturando consultas executadas no SQL Server (Trace) com PowerShell via SMO" href="http://sqlfromhell.wordpress.com/2012/02/27/capturando-consultas-executadas-no-sql-server-trace-com-powershell-via-smo/">Capturando consultas executadas no SQL Server (Trace) com PowerShell via SMO</a></p>
<p><a title="Link permanente para Criando um arquivo de trace com PowerShell via SMO" href="http://sqlfromhell.wordpress.com/2012/03/07/criando-um-arquivo-de-trace-com-powershell-via-smo/">Criando um arquivo de trace com PowerShell via SMO</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sqlfromhell.wordpress.com/4094/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sqlfromhell.wordpress.com/4094/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sqlfromhell.wordpress.com/4094/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sqlfromhell.wordpress.com/4094/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/sqlfromhell.wordpress.com/4094/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/sqlfromhell.wordpress.com/4094/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/sqlfromhell.wordpress.com/4094/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/sqlfromhell.wordpress.com/4094/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sqlfromhell.wordpress.com/4094/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sqlfromhell.wordpress.com/4094/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sqlfromhell.wordpress.com/4094/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sqlfromhell.wordpress.com/4094/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sqlfromhell.wordpress.com/4094/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sqlfromhell.wordpress.com/4094/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sqlfromhell.wordpress.com&#038;blog=7423972&#038;post=4094&#038;subd=sqlfromhell&#038;ref=&#038;feed=1" width="1" height="1" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SqlFromHell?a=OyX3I5inetQ:_-USjwxuFog:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/SqlFromHell?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SqlFromHell/~4/OyX3I5inetQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sqlfromhell.wordpress.com/2012/04/20/trabalhando-com-smo-resumo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f03e5c495f2141f766e9a09eb9febb84?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">Paulo R. Pereira</media:title>
		</media:content>
	<feedburner:origLink>http://sqlfromhell.wordpress.com/2012/04/20/trabalhando-com-smo-resumo/</feedburner:origLink></item>
		<item>
		<title>Monitorando Deadlocks do SQL Server com SMO</title>
		<link>http://feedproxy.google.com/~r/SqlFromHell/~3/Te0j44X21CM/</link>
		<comments>http://sqlfromhell.wordpress.com/2012/04/04/monitorando-deadlocks-do-sql-server-com-smo/#comments</comments>
		<pubDate>Wed, 04 Apr 2012 20:00:00 +0000</pubDate>
		<dc:creator>Paulo R. Pereira</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[Deadlock]]></category>
		<category><![CDATA[SMO]]></category>
		<category><![CDATA[Trabalhando com SMO]]></category>
		<category><![CDATA[Virtual PASS BR]]></category>
		<category><![CDATA[CSharp]]></category>
		<category><![CDATA[dotNET]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[SQL Server Management Objects]]></category>
		<category><![CDATA[T-SQL]]></category>

		<guid isPermaLink="false">https://sqlfromhell.wordpress.com/?p=4075</guid>
		<description><![CDATA[Na semana passada vimos um exemplo de Deadlock com SQL Server, e para monitorar e rastrear eventos deste gênero podemos optar por várias alternativas, dentre elas a utilização de Trace Flags e SQL Server Profiler, e também podemos monitorar de forma bem transparente com os eventos do SMO. De uma maneira bem simples, o código abaixo [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sqlfromhell.wordpress.com&#038;blog=7423972&#038;post=4075&#038;subd=sqlfromhell&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Na semana passada vimos um <a title="Exemplo de Deadlock no SQL Server" href="http://sqlfromhell.wordpress.com/2012/03/28/exemplo-de-deadlock-no-sql-server/" target="_blank">exemplo de Deadlock com SQL Server</a>, e para monitorar e rastrear eventos deste gênero podemos optar por várias alternativas, dentre elas a utilização de <a href="http://msdn.microsoft.com/en-us/library/ms178104.aspx" target="_blank">Trace Flags </a>e <a href="http://www.sqlmag.com/article/sql-server-profiler/gathering-deadlock-information-with-deadlock-graph" target="_blank">SQL Server Profiler</a>, e também podemos monitorar de forma bem transparente com os eventos do SMO.</p>
<p>De uma maneira bem simples, o código abaixo monitora os eventos de Deadlock de uma determinada instancia do SQL Server, e quando ocorre uma Deadlock, ele informa os SPID que estão relacionadas a este evento, e gera um Deadlock File para obter maiores detalhes sobre o deadlock.</p>
<p><pre class="brush: csharp;">using System;
using System.IO;
using System.Linq;
using System.Xml.Linq;
using Microsoft.SqlServer.Management.Smo;

namespace DemoSmo
{
    static class DemoEvent3
    {
        public static void Run()
        {
            const string serverName = @&quot;.\SQLEXPRESS&quot;;

            var server = new Server(serverName);

            var eventSet = new ServerTraceEventSet(
                ServerTraceEvent.LockDeadlock,
                ServerTraceEvent.LockDeadlockChain,
                ServerTraceEvent.DeadlockGraph
                );

            server.Events.SubscribeToEvents(eventSet, OnDeadlock);

            server.Events.StartEvents();

            Console.ReadKey();

            server.Events.StopEvents();

            server.Events.UnsubscribeFromEvents(eventSet);
        }

        private static void OnDeadlock(object sender, ServerEventArgs e)
        {
            switch (e.EventType)
            {
                case EventType.DeadlockGraph:
                    DeadlockGraph(e);
                    break;
                case EventType.LockDeadlockChain:
                    LockDeadlockChain(e);
                    break;
                case EventType.LockDeadlock:
                    Console.WriteLine(&quot;Data/Hora: {0:dd/MM/yyyy HH:mm}&quot;, e.PostTime);
                    Console.WriteLine(&quot;Vítima escolhida: SPID {0}&quot;, e.Spid);
                    break;
            }

            Console.WriteLine();
        }

        private static void LockDeadlockChain(ServerEventArgs e)
        {
            var textData = e.Properties.FirstOrDefault(prop =&gt; prop.Name == &quot;TextData&quot;);

            if (textData == null) return;

            Console.WriteLine(&quot;Data/Hora: {0:dd/MM/yyyy HH:mm}&quot;, e.PostTime);
            Console.WriteLine(((string)textData.Value).TrimEnd());
        }

        private static void DeadlockGraph(ServerEventArgs e)
        {
            var path = string.Format(@&quot;C:\TEMP\{0}.xdl&quot;, Guid.NewGuid());

            var textData = e.Properties.FirstOrDefault(prop =&gt; prop.Name == &quot;TextData&quot;);

            if (textData == null) return;

            var xml = XDocument.Parse(((string)textData.Value))
                .Elements(&quot;TextData&quot;)
                .Elements(&quot;deadlock-list&quot;)
                .FirstOrDefault();

            if (xml == null) return;

            using (var file = new StreamWriter(path)) file.Write(xml.ToString(SaveOptions.DisableFormatting));

            Console.WriteLine(&quot;Data/Hora: {0:dd/MM/yyyy HH:mm}&quot;, e.PostTime);
            Console.WriteLine(&quot;Arquivo gerado: {0}&quot;, path);
        }
    }
}
</pre></p>
<p>A execução do código:</p>
<p><img title="Monitorando Deadlock com SMO" src="http://sqlfromhell.files.wordpress.com/2012/04/040412_1959_monitorando1.png?w=655" alt="Monitorando Deadlock com SMO" /></p>
<p>Os arquivos gerados:</p>
<p><img title="Deadlock Files" src="http://sqlfromhell.files.wordpress.com/2012/04/040412_1959_monitorando2.png?w=655" alt="Deadlock Files" /></p>
<p>E um arquivo de deadlock file gerado pelo SMO aberto no SQL Server Management Studio, possuindo informações sobre os processos, os objetos em lock e a query que foi executada.</p>
<p><img title="Deadlock File" src="http://sqlfromhell.files.wordpress.com/2012/04/040412_1959_monitorando3.png?w=655" alt="Deadlock File" /></p>
<p>Assim terminamos os artigos sobre SMO, espero que tenham gostado de conhecer um pouco mais sobre esta feature.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sqlfromhell.wordpress.com/4075/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sqlfromhell.wordpress.com/4075/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sqlfromhell.wordpress.com/4075/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sqlfromhell.wordpress.com/4075/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/sqlfromhell.wordpress.com/4075/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/sqlfromhell.wordpress.com/4075/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/sqlfromhell.wordpress.com/4075/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/sqlfromhell.wordpress.com/4075/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sqlfromhell.wordpress.com/4075/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sqlfromhell.wordpress.com/4075/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sqlfromhell.wordpress.com/4075/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sqlfromhell.wordpress.com/4075/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sqlfromhell.wordpress.com/4075/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sqlfromhell.wordpress.com/4075/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sqlfromhell.wordpress.com&#038;blog=7423972&#038;post=4075&#038;subd=sqlfromhell&#038;ref=&#038;feed=1" width="1" height="1" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SqlFromHell?a=Te0j44X21CM:xBTau0u9vAA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/SqlFromHell?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SqlFromHell/~4/Te0j44X21CM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sqlfromhell.wordpress.com/2012/04/04/monitorando-deadlocks-do-sql-server-com-smo/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f03e5c495f2141f766e9a09eb9febb84?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">Paulo R. Pereira</media:title>
		</media:content>

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/04/040412_1959_monitorando1.png" medium="image">
			<media:title type="html">Monitorando Deadlock com SMO</media:title>
		</media:content>

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/04/040412_1959_monitorando2.png" medium="image">
			<media:title type="html">Deadlock Files</media:title>
		</media:content>

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/04/040412_1959_monitorando3.png" medium="image">
			<media:title type="html">Deadlock File</media:title>
		</media:content>
	<feedburner:origLink>http://sqlfromhell.wordpress.com/2012/04/04/monitorando-deadlocks-do-sql-server-com-smo/</feedburner:origLink></item>
		<item>
		<title>Exemplo de Deadlock no SQL Server</title>
		<link>http://feedproxy.google.com/~r/SqlFromHell/~3/mc5NDRJOJ-M/</link>
		<comments>http://sqlfromhell.wordpress.com/2012/03/28/exemplo-de-deadlock-no-sql-server/#comments</comments>
		<pubDate>Wed, 28 Mar 2012 18:32:26 +0000</pubDate>
		<dc:creator>Paulo R. Pereira</dc:creator>
				<category><![CDATA[Deadlock]]></category>
		<category><![CDATA[Introdução]]></category>
		<category><![CDATA[Transações]]></category>
		<category><![CDATA[Virtual PASS BR]]></category>
		<category><![CDATA[T-SQL]]></category>

		<guid isPermaLink="false">https://sqlfromhell.wordpress.com/?p=4063</guid>
		<description><![CDATA[Deadlock acontece quando dois ou mais processos são impedidos de prosseguir pois um estar bloqueando o outro, como exemplo, duas pessoas estão querendo usar o mesmo telefone para ligar para números diferentes, enquanto uma delas não ceder sua vez, nenhuma irá conseguir ligar. No nível de transações de banco de dados não é muito diferente, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sqlfromhell.wordpress.com&#038;blog=7423972&#038;post=4063&#038;subd=sqlfromhell&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a title="Deadlock" href="http://pt.wikipedia.org/wiki/Deadlock" target="_blank">Deadlock</a> acontece quando dois ou mais processos são impedidos de prosseguir pois um estar bloqueando o outro, como exemplo, duas pessoas estão querendo usar o mesmo telefone para ligar para números diferentes, enquanto uma delas não ceder sua vez, nenhuma irá conseguir ligar.</p>
<p>No nível de transações de banco de dados não é muito diferente, teremos duas tabelas em nosso banco de dados:</p>
<p><pre class="brush: sql;">
CREATE TABLE Pagamentos (ID INT PRIMARY KEY)
GO
CREATE TABLE Contas (ID INT PRIMARY KEY)
GO</pre></p>
<p>Agora, imagine que um cliente, o senhor 52, irá abrir uma transação para inserir um registro na tabela de pagamentos:</p>
<p><pre class="brush: sql;">
BEGIN TRAN
GO
INSERT INTO Pagamentos VALUES(1)
GO</pre></p>
<p>E ao mesmo tempo, outro cliente, o senhor 55, irá inserir um registro na tabela de contas:</p>
<p><pre class="brush: sql;">
BEGIN TRAN
GO
INSERT INTO Contas VALUES(1)
GO</pre></p>
<p>Até ai, tudo bem, as transações estão abertas, o senhor 55 e o senhor 52 estão utilizando tabelas totalmente diferentes. Mas o senhor 55 lembra que além de inserir um registro na tabela de contas, ele precisa inserir um registro na tabela de pagamentos na mesma transação, assim ele terá que esperar que o senhor 52 termine a transação dele primeiro.</p>
<p><pre class="brush: sql;">
INSERT INTO Pagamentos VALUES(1)
GO</pre></p>
<p><img src="http://sqlfromhell.files.wordpress.com/2012/03/032812_1832_exemplodede1.png?w=655" alt="Executando..." /></p>
<p>Por enquanto nada crítico, é só um cliente esperando o outro terminar.</p>
<p>Mas o senhor 52 também inventa de querer inserir um registro na tabela de Contas:</p>
<p><pre class="brush: sql;">
INSERT INTO Contas VALUES(1)
GO</pre></p>
<p>Dai acontece o Deadlock, o senhor 52 esperando o senhor 55 terminar a transação dele, e o senhor 55 esperando o senhor 52. Como se trata de uma Deadlock bem simples, o SQL Server vai rapidamente escolher qual dos dois clientes tem a preferência, e por consequência definirá sua vítima, que é o cliente que terá que morrer para que aquele que possui preferência consiga terminar seu processo.</p>
<p>E assim, no meu cenário, senhor 52 foi brutalmente assassinado (a transação sofre um ROLLBACK pelo próprio SQL Server, de forma que todos os rastros da vítima sejam apagados):</p>
<p><img title="RIP" src="http://sqlfromhell.files.wordpress.com/2012/03/032812_1832_exemplodede2.png?w=655" alt="RIP" /></p>
<p><span style="color:red;"><em>Msg 1205, Level 13, State 47, Line 4<br />
Transaction (Process ID 52) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.<br />
</em></span></p>
<p>E em homenagem a todos os processos que diariamente são vítimas de Deadlock:</p>
<p><img src="http://sqlfromhell.files.wordpress.com/2012/03/032812_1832_exemplodede3.jpg?w=655" alt="Em homenagem a todos os processos que diariamente são vítimas de Deadlock" /></p>
<p>|| EDIT 2012-03-29<br />
|| Via: <a title="Exemplo de Deadlock no SQL Server" href="http://pessoalex.wordpress.com/2012/03/29/exemplo-de-deadlock-no-sql-server/" target="_blank">http://pessoalex.wordpress.com/2012/03/29/exemplo-de-deadlock-no-sql-server/</a></p>
<p><img title="Deadlock" alt="Deadlock" src="http://pessoalex.files.wordpress.com/2012/03/deadlock.jpg?w=448&amp;h=450&h=315" width="448" height="315" /></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sqlfromhell.wordpress.com/4063/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sqlfromhell.wordpress.com/4063/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sqlfromhell.wordpress.com/4063/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sqlfromhell.wordpress.com/4063/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/sqlfromhell.wordpress.com/4063/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/sqlfromhell.wordpress.com/4063/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/sqlfromhell.wordpress.com/4063/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/sqlfromhell.wordpress.com/4063/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sqlfromhell.wordpress.com/4063/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sqlfromhell.wordpress.com/4063/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sqlfromhell.wordpress.com/4063/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sqlfromhell.wordpress.com/4063/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sqlfromhell.wordpress.com/4063/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sqlfromhell.wordpress.com/4063/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sqlfromhell.wordpress.com&#038;blog=7423972&#038;post=4063&#038;subd=sqlfromhell&#038;ref=&#038;feed=1" width="1" height="1" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SqlFromHell?a=mc5NDRJOJ-M:p5wZ96gGIAA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/SqlFromHell?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SqlFromHell/~4/mc5NDRJOJ-M" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sqlfromhell.wordpress.com/2012/03/28/exemplo-de-deadlock-no-sql-server/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f03e5c495f2141f766e9a09eb9febb84?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">Paulo R. Pereira</media:title>
		</media:content>

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/03/032812_1832_exemplodede1.png" medium="image">
			<media:title type="html">Executando...</media:title>
		</media:content>

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/03/032812_1832_exemplodede2.png" medium="image">
			<media:title type="html">RIP</media:title>
		</media:content>

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/03/032812_1832_exemplodede3.jpg" medium="image">
			<media:title type="html">Em homenagem a todos os processos que diariamente são vítimas de Deadlock</media:title>
		</media:content>

		<media:content url="http://pessoalex.files.wordpress.com/2012/03/deadlock.jpg?w=600&amp;h=450" medium="image">
			<media:title type="html">Deadlock</media:title>
		</media:content>
	<feedburner:origLink>http://sqlfromhell.wordpress.com/2012/03/28/exemplo-de-deadlock-no-sql-server/</feedburner:origLink></item>
		<item>
		<title>Capturando eventos de um determinado bancos de dados com .NET via SMO sem Triggers ou Trace</title>
		<link>http://feedproxy.google.com/~r/SqlFromHell/~3/0i-KxIdano0/</link>
		<comments>http://sqlfromhell.wordpress.com/2012/03/23/capturando-eventos-de-um-determinado-bancos-de-dados-com-net-via-smo-sem-triggers-ou-trace/#comments</comments>
		<pubDate>Fri, 23 Mar 2012 13:24:06 +0000</pubDate>
		<dc:creator>Paulo R. Pereira</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[SMO]]></category>
		<category><![CDATA[Trabalhando com SMO]]></category>
		<category><![CDATA[Virtual PASS BR]]></category>
		<category><![CDATA[CSharp]]></category>
		<category><![CDATA[dotNET]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[SQL Server Management Objects]]></category>

		<guid isPermaLink="false">https://sqlfromhell.wordpress.com/?p=4010</guid>
		<description><![CDATA[Assim como explicado no artigo da semana passada, o monitoramento de eventos do SMO pode capturar eventos tanto no nível mais macro do SQL Server, quanto nos níveis mais específicos, como eventos relativos a tabelas ou outras estruturas do banco de dados. Quem viu o artigo da semana passada irá perceber que não há muita [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sqlfromhell.wordpress.com&#038;blog=7423972&#038;post=4010&#038;subd=sqlfromhell&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Assim como explicado <a title="Capturando eventos do SQL Server com .NET via SMO sem Triggers ou Trace" href="http://sqlfromhell.wordpress.com/2012/03/15/capturando-eventos-do-sql-server-com-net-via-smo-sem-triggers-ou-trace/" target="_blank">no artigo da semana passada</a>, o monitoramento de eventos do SMO pode capturar eventos tanto no nível mais macro do SQL Server, quanto nos níveis mais específicos, como eventos relativos a tabelas ou outras estruturas do banco de dados.</p>
<p>Quem viu o artigo da semana passada irá perceber que não há muita diferença para capturar eventos de objetos específicos do SQL Server, pois as diferenças básicas são os objetos aos quais se associam os eventos (eventos de banco de dados, se associa a um objeto Database, eventos de instancia, a um objeto Server) e o grupo de eventos (EventSet) a ser utilizado para identificar quais os eventos que serão monitorados.</p>
<p>No exemplo a seguir veremos como implementar a captura de eventos de um determinado banco de dados:</p>
<p><pre class="brush: csharp;">using System;
using System.Linq;
using System.Xml.Linq;
using Microsoft.SqlServer.Management.Smo;

namespace DemoSmo
{
    static class DemoEvent2
    {
        public static void Run()
        {
            // Definindo um grupo de eventos a serem monitorados
            var dbEventSet = new DatabaseEventSet(DatabaseEvent.CreateTable);

            // Relacionando os eventos de um determinado banco de dados
            //   e definindo o método OnCreate para o tratamento destes eventos
            const string serverName = @&quot;.\SQLEXPRESS&quot;;

            var server = new Server(serverName);

            #region Criando um banco de dados

            var db1 = new Database(server, &quot;NovoBanco&quot;);

            db1.Create();

            #endregion

            var database = server.Databases[&quot;NovoBanco&quot;];

            database.Events.SubscribeToEvents(dbEventSet, OnCreate);

            // Iniciando a captura dos eventos
            database.Events.StartEvents();

            #region Criando uma tabela no banco de dados criado

            Console.ReadKey();

            var table1 = new Table(db1, &quot;NovaTabela&quot;, &quot;dbo&quot;);

            table1.Columns.Add(new Column(table1, &quot;Codigo&quot;, DataType.Int) { Nullable = false });

            table1.Create();

            #endregion

            // Terminando a captura dos eventos

            Console.ReadKey();

            database.Events.StopEvents();

            database.Events.UnsubscribeFromEvents(dbEventSet);

            #region Excluindo o banco de dados criado

            db1.Drop();

            #endregion
        }

        private static void OnCreate(object sender, ServerEventArgs e)
        {
            // Exibindo o SPID e a data do evento
            Console.WriteLine(&quot;SPID: {0}&quot;, e.Spid);
            Console.WriteLine(&quot;Data: {0:dd/MM/yyyy HH:mm}&quot;, e.PostTime);

            // Exibindo informações sobre o que foi executado
            Console.WriteLine(&quot;Foi criada uma tabela!&quot;);

            // Relacionando outras propriedades que serão exibidas

            var showProperties = new[] { &quot;DatabaseName&quot;, &quot;LoginName&quot; };

            var properties = e.Properties.Where(prop =&gt; showProperties.Contains(prop.Name));

            foreach (var prop in properties)
            {
                Console.WriteLine(&quot;{0}: {1}&quot;, prop.Name, prop.Value);
            }

            // Exibindo o comando que acionou o evento

            var command = e.Properties.FirstOrDefault(prop =&gt; prop.Name == &quot;TSQLCommand&quot;);

            if (command != null)
            {
                var xml = XDocument.Parse((string)command.Value)
                    .Elements(&quot;TSQLCommand&quot;)
                    .Elements(&quot;CommandText&quot;)
                    .FirstOrDefault();

                if (xml != null)
                {
                    Console.WriteLine(&quot;CommandText: {0}&quot;, xml.Value);
                }
            }

            Console.WriteLine();
        }
    }
}
</pre></p>
<p>E como resultado deste exemplo:</p>
<p><img src="http://sqlfromhell.files.wordpress.com/2012/03/032312_1323_capturandoe1.png?w=655" alt="" /></p>
<p>Aqueles que gostariam de saber como funciona a implementação de eventos de notificação, podem encontrar no link abaixo referências de como implementá-los com T-SQL, no qual conhecimento de <a title="Introdução ao Service Broker – Parte 1 – Monólogo" href="http://sqlfromhell.wordpress.com/2011/06/01/introducao-ao-service-broker-parte-1-monologo/" target="_blank">Service Broker</a> será indispensável:<br />
<a title="Implementing Event Notifications" href="http://msdn.microsoft.com/en-us/library/ms178080.aspx" target="_blank">http://msdn.microsoft.com/en-us/library/ms178080.aspx</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sqlfromhell.wordpress.com/4010/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sqlfromhell.wordpress.com/4010/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sqlfromhell.wordpress.com/4010/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sqlfromhell.wordpress.com/4010/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/sqlfromhell.wordpress.com/4010/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/sqlfromhell.wordpress.com/4010/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/sqlfromhell.wordpress.com/4010/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/sqlfromhell.wordpress.com/4010/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sqlfromhell.wordpress.com/4010/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sqlfromhell.wordpress.com/4010/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sqlfromhell.wordpress.com/4010/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sqlfromhell.wordpress.com/4010/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sqlfromhell.wordpress.com/4010/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sqlfromhell.wordpress.com/4010/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sqlfromhell.wordpress.com&#038;blog=7423972&#038;post=4010&#038;subd=sqlfromhell&#038;ref=&#038;feed=1" width="1" height="1" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SqlFromHell?a=0i-KxIdano0:iSFSoIxPM9k:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/SqlFromHell?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SqlFromHell/~4/0i-KxIdano0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sqlfromhell.wordpress.com/2012/03/23/capturando-eventos-de-um-determinado-bancos-de-dados-com-net-via-smo-sem-triggers-ou-trace/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f03e5c495f2141f766e9a09eb9febb84?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">Paulo R. Pereira</media:title>
		</media:content>

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/03/032312_1323_capturandoe1.png" medium="image" />
	<feedburner:origLink>http://sqlfromhell.wordpress.com/2012/03/23/capturando-eventos-de-um-determinado-bancos-de-dados-com-net-via-smo-sem-triggers-ou-trace/</feedburner:origLink></item>
		<item>
		<title>Capturando eventos do SQL Server com .NET via SMO sem Triggers ou Trace</title>
		<link>http://feedproxy.google.com/~r/SqlFromHell/~3/CEGx-AtA674/</link>
		<comments>http://sqlfromhell.wordpress.com/2012/03/15/capturando-eventos-do-sql-server-com-net-via-smo-sem-triggers-ou-trace/#comments</comments>
		<pubDate>Thu, 15 Mar 2012 16:31:38 +0000</pubDate>
		<dc:creator>Paulo R. Pereira</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[SMO]]></category>
		<category><![CDATA[Trabalhando com SMO]]></category>
		<category><![CDATA[Virtual PASS BR]]></category>
		<category><![CDATA[CSharp]]></category>
		<category><![CDATA[dotNET]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[SQL Server Management Objects]]></category>

		<guid isPermaLink="false">https://sqlfromhell.wordpress.com/?p=4001</guid>
		<description><![CDATA[Neste artigo de número 300, vermos uma funcionalidade bem interessante do SMO, que permite capturar eventos do SQL Server, seja em nível de instância, de banco de dados ou até no nível de tabela, permitindo monitorar criação e alterações de estruturas e configurações do SQL Server sem a necessidade de usar triggers ou trace, tudo por [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sqlfromhell.wordpress.com&#038;blog=7423972&#038;post=4001&#038;subd=sqlfromhell&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Neste artigo de número 300, vermos uma funcionalidade bem interessante do SMO, que permite capturar eventos do SQL Server, seja em nível de instância, de banco de dados ou até no nível de tabela, permitindo monitorar criação e alterações de estruturas e configurações do SQL Server <strong>sem a necessidade de usar triggers ou trace</strong>, tudo por meio do serviço de notificações de eventos do Service Broker. Mas se você não &#8220;manja&#8221; de <a title="Introdução ao Service Broker – Parte 1 – Monólogo" href="http://sqlfromhell.wordpress.com/2011/06/01/introducao-ao-service-broker-parte-1-monologo/" target="_blank">Service Broker</a>, fique tranquilo, o SMO permite a utilização desta funcionalidade de forma bem transparente.</p>
<p>Neste exemplo, veremos como capturar/monitorar eventos de criação de banco de dados e de tabelas com o SMO:</p>
<p><pre class="brush: csharp;">using System;
using System.Linq;
using System.Xml.Linq;
using Microsoft.SqlServer.Management.Smo;

namespace DemoSmo
{
    static class DemoEvent1
    {
        public static void Run()
        {
            // Definindo um grupo de eventos a serem monitorados
            var eventSet = new ServerEventSet(ServerEvent.CreateDatabase, ServerEvent.CreateTable);

            // Relacionando os eventos a uma instância do SQL Server
            //   e definindo o método OnCreate para o tratamento destes eventos
            const string serverName = @&quot;.\SQLEXPRESS&quot;;

            var server = new Server(serverName);

            server.Events.SubscribeToEvents(eventSet, OnCreate);

            // Iniciando a captura dos eventos
            server.Events.StartEvents();

            Console.ReadKey();

            // Executando alguns comandos para testar se os eventos estão sendo monitorados

            const string query = @&quot;
USE [master]
GO

CREATE DATABASE [NovoBanco]
GO

USE [NovoBanco]

CREATE TABLE [NovaTabela] (CODIGO INT)
GO

USE [master]
GO

DROP DATABASE [NovoBanco]
GO&quot;;

            server.ConnectionContext.ExecuteNonQuery(query);

            // Terminando a captura dos eventos

            Console.ReadKey();

            server.Events.StopEvents();

            server.Events.UnsubscribeFromEvents(eventSet);
        }

        private static void OnCreate(object sender, ServerEventArgs e)
        {
            // Exibindo o SPID e a data do evento
            Console.WriteLine(&quot;SPID: {0}&quot;, e.Spid);
            Console.WriteLine(&quot;Data: {0:dd/MM/yyyy HH:mm}&quot;, e.PostTime);

            // Exibindo informações sobre o que foi executado
            switch (e.EventType)
            {
                case EventType.CreateDatabase:
                    Console.WriteLine(&quot;Foi criado um banco de dados!&quot;);
                    break;
                case EventType.CreateTable:
                    Console.WriteLine(&quot;Foi criada uma tabela!&quot;);
                    break;
            }

            // Relacionando outras propriedades que serão exibidas

            var showProperties = new[] { &quot;DatabaseName&quot;, &quot;TableName&quot;, &quot;LoginName&quot; };

            var properties = e.Properties.Where(prop =&gt; showProperties.Contains(prop.Name));

            foreach (var prop in properties)
            {
                Console.WriteLine(&quot;{0}: {1}&quot;, prop.Name, prop.Value);
            }

            // Exibindo o comando que acionou o evento

            var command = e.Properties.FirstOrDefault(prop =&gt; prop.Name == &quot;TSQLCommand&quot;);

            if (command != null)
            {
                var xml = XDocument.Parse((string)command.Value)
                    .Elements(&quot;TSQLCommand&quot;)
                    .Elements(&quot;CommandText&quot;)
                    .FirstOrDefault();

                if (xml != null)
                {
                    Console.WriteLine(&quot;CommandText: {0}&quot;, xml.Value);
                }
            }

            Console.WriteLine();
        }
    }
}
</pre></p>
<p>E como os eventos serão exibidos neste exemplo:</p>
<p><img src="http://sqlfromhell.files.wordpress.com/2012/03/031512_1631_capturandoe1.png?w=655" alt="Capturando eventos do SQL Server com .NET via SMO" /></p>
<p>Próxima semana, eu pretendo demonstrar como capturar/monitorar eventos em um nível mais específico, e na última semana deste mês, veremos como monitorar alguns eventos que vão além de alterações estruturais do banco de dados.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sqlfromhell.wordpress.com/4001/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sqlfromhell.wordpress.com/4001/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sqlfromhell.wordpress.com/4001/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sqlfromhell.wordpress.com/4001/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/sqlfromhell.wordpress.com/4001/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/sqlfromhell.wordpress.com/4001/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/sqlfromhell.wordpress.com/4001/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/sqlfromhell.wordpress.com/4001/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sqlfromhell.wordpress.com/4001/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sqlfromhell.wordpress.com/4001/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sqlfromhell.wordpress.com/4001/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sqlfromhell.wordpress.com/4001/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sqlfromhell.wordpress.com/4001/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sqlfromhell.wordpress.com/4001/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sqlfromhell.wordpress.com&#038;blog=7423972&#038;post=4001&#038;subd=sqlfromhell&#038;ref=&#038;feed=1" width="1" height="1" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SqlFromHell?a=CEGx-AtA674:bLSOb5ctSsk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/SqlFromHell?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SqlFromHell/~4/CEGx-AtA674" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sqlfromhell.wordpress.com/2012/03/15/capturando-eventos-do-sql-server-com-net-via-smo-sem-triggers-ou-trace/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f03e5c495f2141f766e9a09eb9febb84?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">Paulo R. Pereira</media:title>
		</media:content>

		<media:content url="http://sqlfromhell.files.wordpress.com/2012/03/031512_1631_capturandoe1.png" medium="image">
			<media:title type="html">Capturando eventos do SQL Server com .NET via SMO</media:title>
		</media:content>
	<feedburner:origLink>http://sqlfromhell.wordpress.com/2012/03/15/capturando-eventos-do-sql-server-com-net-via-smo-sem-triggers-ou-trace/</feedburner:origLink></item>
	<media:rating>nonadult</media:rating></channel>
</rss>

