<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Silas Mendes @ Microsoft</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/silasmendes/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/silasmendes/feed.xml</link>
    <description />
    <lastBuildDate>Tue, 16 Apr 2019 05:50:06 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>[SQL Server AlwaysOn AG] Required Synchronized Secondaries To Commit</title>
      <link>https://docs.microsoft.com/archive/blogs/silasmendes/sql-server-alwayson-ag-required-synchronized-secondaries-to-commit</link>
      <pubDate>Thu, 28 Jun 2018 12:44:37 GMT</pubDate>
      <dc:creator><![CDATA[Silas Mendes]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/silasmendes/?p=325</guid>
      <description><![CDATA[O SQL Server 2017 trouxe uma novidade interessante para o AlwaysOn Availability Groups (AG); hoje...]]></description>
      <content:encoded><![CDATA[O <strong>SQL Server 2017</strong> trouxe uma novidade interessante para o <em>AlwaysOn Availability Groups</em> (AG); hoje vamos falar sobre a opção: <em><strong>Required_Synchronized_Secondaries_To_Commit</strong></em>.

Pra entender o papel desta nova opção é importante entender como o AG se comporta quando está configurado para operar no <strong>modo síncrono</strong>.

Para facilitar a nossa “prosa” vamos considerar que temos um AG com duas réplicas: "X" e "Y". Essas réplicas estão operando em modo síncrono e com <em>failover</em> automático habilitado. Vamos considerar também que nosso <em>cluster </em>está com seu <em>witness quorum </em>devidamente configurado.

A réplica X é nossa réplica primária, nela ocorrem escritas e leituras. A réplica Y é nossa réplica secundária, se uma falha ocorrer na réplica X é esperado que a réplica Y assuma automaticamente. Como essas réplicas estão operando em modo síncrono, toda modificação realizada na réplica X só será confirmada (comitada) quando esta modificação também for registrada no t-log da réplica secundária. Em geral réplicas síncronas operam com o status “<em>SINCRONIZED</em>” (sincronizado).

<span style="color: #000000;font-family: Calibri"> </span>
<blockquote><b><span style="color: #000000;font-family: Calibri">Agora, o que acontece se a réplica <span>secundária </span>(<span>Y</span>) for desligada?</span></b></blockquote>
Como o <em>cluster</em> está com o <em>witness quorum </em>devidamente configurado, por padrão a réplica X continuará operando normalmente, atendendo o workload de escrita e leitura. Toda modificação efetuada nesse período ficará em uma fila na réplica primária até que a réplica secundária retorne.

Quando a réplica secundária retornar, ela solicitará à réplica primária todas as modificações que ocorreram durante o período que ela ficou offline. Se essa fila for grande, a réplica secundária poderá demorar algum tempo para voltar a ficar 100% sincronizada com a réplica primária e durante esse período ela operará com o status “<em>SINCRONIZING</em>” (sincronizando).

Se neste período a réplica primária falhar, não teremos failover automático para a réplica Y, pois como ela estava com a sincronização atrasada, não seria seguro que ela assumisse automaticamente. Nesse cenário teríamos 2 opções: “ressuscitar” nossa réplica X ou fazer um<a href="https://docs.microsoft.com/en-us/sql/2014/database-engine/availability-groups/windows/perform-a-forced-manual-failover-of-an-availability-group-sql-server?view=sql-server-2017"><em> forced failover</em></a> para a réplica Y para que ela assumisse o papel de réplica primária, porém, como ela estava atrasada, inevitalmente perderíamos dados nesse processo.

<span style="color: #000000;font-family: Calibri"> </span>
<blockquote><b><span style="color: #000000;font-family: Calibri">Como evitar que isso aconteça?</span></b></blockquote>
É aí que entra a nova opção <em><strong>Required_Synchronized_Secondaries_To_Commit</strong></em>.

Nessa opção definimos quantas réplicas síncronas precisam persistir a transação para que esta seja confirmada na réplica primária.

Se habilitarmos esta opção em nosso AG fictício, quando a réplica secundária (Y) for desligada, <em><strong>nenhuma nova transação ocorrerá na réplica primária</strong></em>. Todas as conexões na réplica primária serão encerradas e nenhuma nova conexão será estabelecida (nos bancos que fazem parte do AG) até que a réplica secundária retorne… e não somente retorne, mas que retorne ao estado <strong><em>SINCRONIZED</em> </strong>(sincronizado). A seguir temos alguns exemplos de mensagens de erros que podemos encontrar nessa situação:
<pre>Remote harden of transaction 'INSERT' (ID 0x000000000002c92f 0000:000015ea) started at Jun  5 2018 12:06PM 
in database 'AdventureWorks2014' at LSN (48:944:3) failed.</pre>
&nbsp;
<pre>Msg 988, Level 14, State 1, Line 8
Unable to access database 'AdventureWorks2014' because it lacks a quorum of nodes for high availability.
Try the operation again later.</pre>
Essa nova opção aumenta a segurança das transações, mas também aumenta a importância das réplicas secundárias síncronas, portanto é importante garantir que a infraestrutura das réplicas esteja adequada para trabalhar neste modelo (com atenção especial na latência de disco e rede).

Esta opção é uma propriedade do AG e pode ser habilitada/desabilitada a qualquer momento, sem a necessidade de reiniciar o SQL Server.

<strong>Referências adicionais</strong>

<a href="https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-availability-group-transact-sql?view=sql-server-2017">ALTER AVAILABILITY GROUP</a>

Até +

Silas Mendes

&nbsp;
<h6>============================</h6>
<h6><em>The code and techniques described in this blog are presented to the reader ‘as is’, without any warranty, whether express or implied, of its accuracy, completeness, fitness for a particular purpose, title or non-infringement, and none of the third-party products or information mentioned in the work are authored, recommended, supported or guaranteed by any of the authors or Microsoft. Further, the authors shall not be liable for any damages you may sustain by using this information, whether direct, indirect, special, incidental or consequential, even if it has been advised of the possibility of such damages. Your use of the information contained in these pages, is at your sole risk.</em></h6>]]></content:encoded>
    </item>
    <item>
      <title>[SQL Server: Azure VM] Como funciona o Automated Backup?</title>
      <link>https://docs.microsoft.com/archive/blogs/silasmendes/sql-server-como-funciona-azure-automated-backup</link>
      <pubDate>Tue, 29 May 2018 17:02:59 GMT</pubDate>
      <dc:creator><![CDATA[Silas Mendes]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/silasmendes/?p=265</guid>
      <description><![CDATA[Olá pessoal, depois de um tempo distante estou retornando com um tópico que sempre levanta...]]></description>
      <content:encoded><![CDATA[Olá pessoal, depois de um tempo distante estou retornando com um tópico que sempre levanta questionamentos dos clientes quando falamos sobre a automatização de backups do SQL Server em maquinas virtuais (VMs) no Azure.

O Azure oferece uma vasta opção de <em>templates</em> de VMs com SQL Server, sem dúvidas essa é uma forma muito prática de criar um servidor SQL Server rapidamente.

Quando optamos por criar uma VM a partir destes <i>templates</i>, o portal do Azure exibe uma série de recursos que só se aplicam para VMs com SQL Server; uma das opções é o "<b>Automated Backup</b>" (essa opção não está disponível para Linux VMs). A descrição desse recurso informa:
<blockquote><i>"</i><i>Configure backups for databases in your virtual machine".</i></blockquote>
A idéia aqui é bem simples: ao habilitar esta funcionalidade, você passa a ter backup automatizado das bases daquela VM, sem a necessidade de criar <em>planos de manutenção</em>, <em>jobs</em>, <em>schedules</em> e etc; mas vamos às perguntas recorrentes:
<ul>
 	<li>
<blockquote>"Qual a política desse backup automatizado?"</blockquote>
</li>
 	<li>
<blockquote>"Qual o papel do <em>SQL Server Agent</em> nesse cenário?"</blockquote>
</li>
 	<li>
<blockquote>"As bases de sistema são incluídas nos backups automáticos?"</blockquote>
</li>
</ul>
Seguem alguns pontos que precisamos considerar:
<ul>
 	<li>Até esta data (estamos em <em>Maio de 2018</em>) o <em><b>Automated Backup</b> </em>só realiza backups das bases da instância DEFAULT; ou seja, instâncias nomeadas não usufruem desse recurso;</li>
 	<li>O <b><i>Automated Backup </i></b>só está disponível para VMs com <em>SQL Server 2014</em> ou superior;</li>
 	<li>Esse recurso não cria <i>Jobs</i> no <i>SQL Server Agent</i>; porém para que o recurso funcione o <i>SQL Server Agent</i> deve estar executando;</li>
 	<li>A VM precisa ter o serviço <em><strong>SQL</strong></em> <em><b>IaaS agent</b> </em>em execução (esse serviço já vem configurado em VMs que criamos a partir de <em>templates</em>);</li>
 	<li>Os backups ficam armazenados na <em>storage account</em> indicada no momento da configuração:</li>
</ul>
<a href="https://msdnshared.blob.core.windows.net/media/2018/05/automated_backup_storage_account.png"><img src="https://msdnshared.blob.core.windows.net/media/2018/05/automated_backup_storage_account.png" alt="" width="725" height="227" class="alignnone wp-image-305" /></a>

&nbsp;

No <em>SQL Server 2014</em> tinhamos algumas limitações, mas se a instância <i>default</i> for <strong>SQL Server 2016</strong> (ou superior) temos alguns recursos adicionais:<img width="223" height="300" class="alignright wp-image-275 size-medium" alt="" src="https://msdnshared.blob.core.windows.net/media/2018/05/sql_automated_backup_2-223x300.png" />
<ul>
 	<li><a href="https://msdnshared.blob.core.windows.net/media/2018/05/sql_automated_backup_2.png"></a>As bases de sistema estão incluídas na política de backup automático;</li>
 	<li>É possível determinar um período ideal para a execução do backup <em>full</em>; por exemplo, podemos determinar que o backup <em>full</em> só ocorrerá entre 1h e 5h da manhã;</li>
 	<li>É possível determinar a frequência do backup de log (de 5 a 60 minutos).</li>
</ul>
<blockquote><strong>"Se não customizarmos os horários do <em>Automated Backup</em>, quais serão os critérios para a execução dos backups automatizados?"</strong></blockquote>
Em resumo teremos um backup <em>full </em>semanal e um backup de log a cada 2 horas, porém isso pode mudar de acordo com o <em>workload</em> da instância. Quanto maior o volume de modificações, maior a probabilidade de novos backups ocorrerem; exemplo: se o espaço utilizado no <em>transaction log </em>for igual ou maior que 5 MB um novo backup de log ocorrerá. Se o <em>transaction log </em>crescer 1 GB desde o último backup <em>full</em>, um novo backup <em>full </em>acontecerá. Para evitar que um backup <em>full </em>execute durante horário produtivo é importante configurar o <em><strong>Automated Backup</strong> </em>definindo os horários apropriados. Outro fator que pode influenciar são ações que "quebram" a sequência de backups, como uma mudança de <em>recovery model </em>de<em> FULL </em>para<em> SIMPLE</em>, por exemplo.

Outro ponto que é importante destacar: a escolha do <em>Recovery Model</em> tem a mesma relevância na política do backup automatizado, portanto se sua base estiver no modo <em>SIMPLE</em> o <em>Automated Backup</em> não fará backups do <em>t-log</em> e consequentemente você não terá o recurso do <em>point-in-time restore</em>.

&nbsp;
<blockquote><strong>"Posso fazer backups sob demanda (backup manual)?"</strong></blockquote>
Sim, no entanto, para evitar que o seu backup manual "quebre" a cadeia dos backups anteriores é recomendável que você faça o backup (<em>full</em> ou <em>log</em>) utilizando a procedure <a href="https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/managed-backup-sp-backup-on-demand-transact-sql?view=sql-server-2017">sp_backup_on_demand</a>. Backups feitos a partir desta procedure serão armazenados na <em>storage account</em> definida no momento da configuração do <em>Automated Backup.</em>

&nbsp;
<blockquote><strong>"Como monitorar?"</strong></blockquote>
Você pode visualizar todo o histórico de backups através do SSMS (ex: <em>Reports</em> &gt; <em>Standard Reports</em> &gt; <em>Backup and Restore Events</em>) ou através das <em>views</em> de catálogo na MSDB. Além disso é possível utilizar a procedure <a href="https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/managed-backup-sp-get-backup-diagnostics-transact-sql?view=sql-server-2017">sp_get_backup_diagnostics</a> que retorna informações mais detalhadas de todas as ações do <em>Automated Backup:</em>

<a href="https://msdnshared.blob.core.windows.net/media/2018/05/sp_get_backup_diagnostics.png"><img src="https://msdnshared.blob.core.windows.net/media/2018/05/sp_get_backup_diagnostics-1024x314.png" alt="" width="747" height="229" class="alignnone wp-image-315" /></a>
<blockquote>&nbsp;

<strong>É possível configurar o <em>Automated Backup</em> em uma Azure VM que não foi criada a partir de um <em>template</em>?</strong></blockquote>
Sim. O primeiro passo é garantir que o serviço <em><strong>SQL </strong></em><em><b>IaaS agent </b></em>esteja configurado e executando. Para verificar o processo de configuração do <em>SQL</em> <em>IaaS agent</em> consulte este <a href="https://docs.microsoft.com/en-us/azure/virtual-machines/windows/sql/virtual-machines-windows-sql-server-agent-extension">link</a>.

&nbsp;

<em><strong>Referências adicionais:</strong></em>

<a target="_blank" href="https://docs.microsoft.com/en-us/azure/virtual-machines/windows/sql/virtual-machines-windows-sql-automated-backup-v2" rel="noopener">Automated Backup v2 for Azure Virtual Machines</a>

<a target="_blank" href="https://docs.microsoft.com/en-us/sql/relational-databases/backup-restore/sql-server-managed-backup-to-microsoft-azure?view=sql-server-2017" rel="noopener">SQL Server Managed Backup to Microsoft Azure</a>

Até+

Silas Mendes

&nbsp;
<h6>============================</h6>
<h6><em>The code and techniques described in this blog are presented to the reader ‘as is’, without any warranty, whether express or implied, of its accuracy, completeness, fitness for a particular purpose, title or non-infringement, and none of the third-party products or information mentioned in the work are authored, recommended, supported or guaranteed by any of the authors or Microsoft. Further, the authors shall not be liable for any damages you may sustain by using this information, whether direct, indirect, special, incidental or consequential, even if it has been advised of the possibility of such damages. Your use of the information contained in these pages, is at your sole risk.</em></h6>]]></content:encoded>
    </item>
    <item>
      <title>[Azure] SQL Server Stretch Database Overview</title>
      <link>https://docs.microsoft.com/archive/blogs/silasmendes/azure-stretch-database-overview</link>
      <pubDate>Mon, 11 Dec 2017 12:30:17 GMT</pubDate>
      <dc:creator><![CDATA[Silas Mendes]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/silasmendes/?p=236</guid>
      <description><![CDATA[O Stretch Database é uma feature disponível a partir do SQL Server 2016 que permite armazenarmos...]]></description>
      <content:encoded><![CDATA[O <b>Stretch Database</b> é uma feature disponível a partir do <b>SQL Server 2016</b> que permite armazenarmos parte dos dados de um banco SQL Server no Azure. Com o <b>Stretch Database </b>temos um exemplo de solução híbrida, onde parte dos dados estão <em>on-premises</em> (local) e parte no Azure.

<a href="https://msdnshared.blob.core.windows.net/media/2017/12/azure-sql-db-stretch.png"></a><a href="https://msdnshared.blob.core.windows.net/media/2017/12/azure-sql-db-stretch.png"></a><a href="https://msdnshared.blob.core.windows.net/media/2017/12/azure-sql-db-stretch.png"><img width="300" height="149" class="aligncenter wp-image-255 size-medium" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/12/azure-sql-db-stretch-300x149.png" /></a>

Atualmente é possível armazenar até 240 TB no Azure com dados de tabelas <em>Stretch</em>.

Apesar do nome da feature ser <i>Stretch Database</i>, na prática, a configuração é por tabela.

A forma mais simples de habilitar o Stretch Database é através do <strong>SSMS</strong>: <em>botão direito no banco &gt; Tasks &gt; Stretch &gt; Enable</em>. Neste <em>wizard </em>podemos escolher quais tabelas configurar e o <em>wizard</em> dirá se a tabela atende todos os pré-requisitos. Importante frisar que é necessário ter uma assinatura no Azure e que por hora, nem todas as regiões do Azure oferecem este serviço.

Se o cliente desejar, ele pode deixar parte dos dados de uma tabela <i>on-premises</i> e parte dos dados na nuvem (como em um particionamento). Para aplicar este "particionamento" é preciso definir uma função T-SQL com a regra do que deve ser enviado para o Azure; na hora de habilitar o <i>stretch</i> para a tabela, informamos o nome da <i>function</i> como um <b>filter_predicate</b>. Exemplo:
<pre>-- função com a lógica do "particionamento"
create function dbo.fn_filtro_stretch(@dt datetime)
returns table
with schemabinding  
as  
return select 1 as linha_elegivel
       where @dt &lt; '20170701 00:00:00'
go</pre>
<pre>-- habilitar o stretch na tabela com a lógica de particionamento:
alter table t1 set ( remote_data_archive = on (
   <strong>filter_predicate = dbo.fn_filtro_stretch(data_pedido)</strong>,
   migration_state = outbound
) );</pre>
Os dados enviados para o Azure não podem ser modificados.

Depois de enviar os dados para o Azure é possível traze-los de volta para o <em>on-premises</em>, mudando o <em>migration_state</em> para <b><i>inbound</i></b>:
<pre>alter table t1
   set ( remote_data_archive = on ( migration_state = <b>inbound</b> ) ) ;
go</pre>
Para mensurar o espaço utilizado por uma tabela <i>Stretch</i>, podemos utilizar o comando <b>sp_spaceused</b> com a opção <b>remote_only</b>:
<pre>-- espaço utilizado no Azure:
exec sp_spaceused 'Pedidos', 'true', 'remote_only';
go</pre>
Para monitorar a sincronização dos dados para o Azure temos a DMV <b>sys.dm_db_rda_migration_status</b> que exibe os 200 ciclos mais recentes de sincronização dos dados. Essa DMV também será útil para identificar problemas de conectividade.

O <b>Stretch Database</b> é interessante para o armazenamento de <i>cold data</i>, ou seja, dados que precisam ser armazenados por longos períodos, mas que serão consultados raramente. Com essa abordagem o cliente pode reduzir significativamente o custo de armazenamento e também reduzir o tamanho do banco de dados, o que refletirá na redução do custo de operações de <i>backup</i>, <i>reindex</i>, etc.

Os dados armazenados no Azure são criptografados, possuem backup automático e HA/DR.

Tabelas que participam de replicação, In-Memory OLTP, change tracking, CDC, filestream, não suportam o Stretch Database.

Para ter acesso a mais conteúdo, consulte a documentação da <em>feature</em>:

<a href="https://docs.microsoft.com/en-us/sql/sql-server/stretch-database/stretch-database">https://docs.microsoft.com/en-us/sql/sql-server/stretch-database/stretch-database</a>

Até +

&nbsp;

Silas
<h6>============================</h6>
<em>The code and techniques described in this blog are presented to the reader ‘as is’, without any warranty, whether express or implied, of its accuracy, completeness, fitness for a particular purpose, title or non-infringement, and none of the third-party products or information mentioned in the work are authored, recommended, supported or guaranteed by any of the authors or Microsoft. Further, the authors shall not be liable for any damages you may sustain by using this information, whether direct, indirect, special, incidental or consequential, even if it has been advised of the possibility of such damages. Your use of the information contained in these pages, is at your sole risk.</em>]]></content:encoded>
    </item>
    <item>
      <title>[SQL Server 2017] Novidades no In-Memory OLTP</title>
      <link>https://docs.microsoft.com/archive/blogs/silasmendes/sql-server-2017-in-memory-oltp</link>
      <pubDate>Wed, 27 Sep 2017 18:36:48 GMT</pubDate>
      <dc:creator><![CDATA[Silas Mendes]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/silasmendes/?p=235</guid>
      <description><![CDATA[O SQL Server 2017 traz uma série de melhorias para o In-Memory OLTP. Destaco algumas a seguir:...]]></description>
      <content:encoded><![CDATA[O <strong>SQL Server 2017</strong> traz uma série de melhorias para o <strong>In-Memory OLTP</strong>. Destaco algumas a seguir:
<ul>
 	<li>Não há mais limitação de 8 índices por tabela memory-optimized;</li>
 	<li>Suporte para colunas computadas;</li>
 	<li>CASE, TRIM, TRANSLATE, CONCAT_WS, TOP (N) WITH TIES, OPENJSON, FOR JSON, CROSS APPLY agora são suportados em procedures natively compiled;</li>
 	<li>SP_RENAME agora é suportado para tabelas memory-optimized e procedures natively compiled;</li>
 	<li>SP_SPACEUSED agora informa o espaço utilizado por uma tabela memory-optimized;</li>
 	<li>Os filegroups de tabelas in-memory agora podem ser armazenados no Azure.</li>
</ul>
Além disso, há melhorias no tempo de rebuild dos índices durante o processo de recovery (lembre-se que os índices das tabelas in-memory são recriados a cada restart do banco/instância).

Para ver mais novidades do SQL Server 2017, consulte o conteúdo deste link:

<a href="https://docs.microsoft.com/en-us/sql/database-engine/whats-new-in-sql-server-2017">https://docs.microsoft.com/en-us/sql/database-engine/whats-new-in-sql-server-2017</a>

&nbsp;

Silas Mendes

&nbsp;
<h6>============================</h6>
<em>The code and techniques described in this blog are presented to the reader ‘as is’, without any warranty, whether express or implied, of its accuracy, completeness, fitness for a particular purpose, title or non-infringement, and none of the third-party products or information mentioned in the work are authored, recommended, supported or guaranteed by any of the authors or Microsoft. Further, the authors shall not be liable for any damages you may sustain by using this information, whether direct, indirect, special, incidental or consequential, even if it has been advised of the possibility of such damages. Your use of the information contained in these pages, is at your sole risk.</em>]]></content:encoded>
    </item>
    <item>
      <title>[Replicação] SQL Server Comandos DDL</title>
      <link>https://docs.microsoft.com/archive/blogs/silasmendes/sql-repl-comandos-ddl</link>
      <pubDate>Fri, 28 Jul 2017 09:15:17 GMT</pubDate>
      <dc:creator><![CDATA[Silas Mendes]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/silasmendes/?p=205</guid>
      <description><![CDATA[Essa semana me deparei com um cenário bem particular em um de nossos clientes. O cliente utiliza...]]></description>
      <content:encoded><![CDATA[Essa semana me deparei com um cenário bem particular em um de nossos clientes. O cliente utiliza replicação transacional e desabilitou nas propriedades da publicação a opção "<strong>Replicate Schema Changes</strong>", conforme imagem abaixo:

<a href="https://msdnshared.blob.core.windows.net/media/2017/07/rsc.png"><img src="https://msdnshared.blob.core.windows.net/media/2017/07/rsc.png" alt="" width="699" height="420" class="alignnone wp-image-216" /></a>

Para habilitar ou desabilitar esta propriedade, podemos utilizar o SSMS, conforme imagem acima, ou utilizar a procedure <strong>sp_changepublication </strong>como no script abaixo:
<blockquote>DECLARE @publication AS sysname

SET @publication = N'ReplTesteDropColumn'

USE AdventureWorks2016

EXEC sp_changepublication

@publication = @publication,

@property = N'replicate_ddl',

<strong>@value = 0 </strong>-- disable

GO</blockquote>
Por padrão esta opção é "true" e quando esta propriedade está habilitada, comandos DDL como ALTER TABLE, ALTER PROCEDURE e ALTER FUNCTION são replicados para os assinantes.

Como essa opção estava desabilitada (false) o cliente esperava que <em><strong>nenhum</strong> </em>comando DDL fosse replicado, porém, eles notaram que um ALTER TABLE com DROP COLUMN foi sincronizado para os assinantes.

Analisando a documentação da propriedade "Replicate Schema Changes" verificamos que <strong>o ALTER TABLE com DROP COLUMN é uma excessão</strong>; portanto, independente dessa propriedade estar habilitada ou não, o ALTER TABLE com DROP COLUMN será replicado para os assinantes.

Pra ficar no radar :)

Referência adicional:

<a href="https://docs.microsoft.com/en-us/sql/relational-databases/replication/publish/replicate-schema-changes">https://docs.microsoft.com/en-us/sql/relational-databases/replication/publish/replicate-schema-changes</a>

Silas
<h6>============================

<em>The code and techniques described in this blog are presented to the reader ‘as is’, without any warranty, whether express or implied, of its accuracy, completeness, fitness for a particular purpose, title or non-infringement, and none of the third-party products or information mentioned in the work are authored, recommended, supported or guaranteed by any of the authors or Microsoft. Further, the authors shall not be liable for any damages you may sustain by using this information, whether direct, indirect, special, incidental or consequential, even if it has been advised of the possibility of such damages. Your use of the information contained in these pages, is at your sole risk.</em></h6>
<h6></h6>]]></content:encoded>
    </item>
    <item>
      <title>[SQL Server 2017] SELECT INTO FILEGROUP</title>
      <link>https://docs.microsoft.com/archive/blogs/silasmendes/sql2017-select-into-filegroup</link>
      <pubDate>Fri, 14 Jul 2017 08:05:12 GMT</pubDate>
      <dc:creator><![CDATA[Silas Mendes]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/silasmendes/?p=175</guid>
      <description><![CDATA[Uma das novidades do SQL Server 2017 é a possibilidade de utilizar o SELECT INTO, criando a nova...]]></description>
      <content:encoded><![CDATA[Uma das novidades do SQL Server 2017 é a possibilidade de utilizar o SELECT INTO, criando a nova tabela em um filegroup diferente do filegroup default.

O comando é bem simples:
<blockquote>SELECT *  INTO PedidosTemp ON FG1  from Pedidos;</blockquote>
No meu cenário a tabela <strong>Pedidos</strong> está no filegroup [PRIMARY], porém, a tabela <strong>PedidosTemp</strong> que foi criada a partir da tabela Pedidos está no filegroup FG1:

<a href="https://msdnshared.blob.core.windows.net/media/2017/07/SELECT-INTO-FILEGROUP.png"><img width="360" height="324" class="alignnone wp-image-185" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/07/SELECT-INTO-FILEGROUP.png" /></a>

Silas]]></content:encoded>
    </item>
    <item>
      <title>[Administração] SQL Server Instant File Initialization</title>
      <link>https://docs.microsoft.com/archive/blogs/silasmendes/sql-instant-file-initialization</link>
      <pubDate>Thu, 29 Jun 2017 17:44:51 GMT</pubDate>
      <dc:creator><![CDATA[Silas Mendes]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/silasmendes/?p=125</guid>
      <description><![CDATA[Quando atribuimos a permissão de Perform Volume Maintenance Tasks para a conta que inicia o serviço...]]></description>
      <content:encoded><![CDATA[Quando atribuimos a permissão de <em><strong>Perform Volume Maintenance Tasks </strong></em>para a conta que inicia o serviço do SQL Server (em <em><strong>Local Security Policies</strong> </em>do Windows), permitimos que o SQL Server aloque espaço para arquivos de dados quase que instantaneamente; esse recurso é conhecido por "<strong>Instant File Initialization</strong>" (<strong>IFI</strong>).

Na prática isso facilita muito o processo de criação ou crescimento de arquivos de dados, restauração de backups, etc; mas o IFI <strong>não tem efeito em arquivos de log</strong>.

Muitos clientes perguntam o motivo do IFI tornar o processo de alocação de espaço tão rápido e o motivo é que, por padrão, quando o SQL Server precisa alocar espaço para um arquivo, ele preenche o novo espaço com zeros. Quanto maior é a alocação de espaço, mais zeros o SQL Server tem que escrever, portanto, maior a espera. Quando o IFI está habilitado o SQL Server não preenche o novo espaço com zeros e assim o processo é concluído quase que instantaneamente.

Para visualizar o comportamento do IFI podemos utilizar um pequeno disco e criar nele um grande arquivo .txt com algum conteúdo; no meu cenário, criei um arquivo com a frase "<em>O Rato Roeu a Roupa do Rei de Roma</em>" inúmeras vezes. Em seguida podemos apagar o <em>.txt</em>.

Se verificarmos o conteúdo do disco com um editor hexadecimal, veremos que apesar de termos apagado o arquivo .txt, o conteúdo do arquivo ainda está gravado lá:

<a href="https://msdnshared.blob.core.windows.net/media/2017/06/00_ifi.png"><img width="614" height="375" class="alignnone wp-image-135 " alt="" src="https://msdnshared.blob.core.windows.net/media/2017/06/00_ifi.png" /></a>

Agora com o <em>Instant File Initialization</em> habilitado, criamos um banco SQL Server nesse disco. O editor hexadecimal mostrará (para espanto de muitos) que o novo <em>.mdf</em> parece estar preenchido com milhares de "<em>O Rato Roeu a Roupa do Rei de Roma</em>". Como o IFI estava habilitado o SQL Server não teve o trabalho extra de preencher o espaço alocado com zeros no novo .mdf, portanto os dados do antigo .txt não foram sobrescritos. Conforme o SQL Server começar a receber novos dados nesse banco, os dados antigos serão sobrescritos.

Se repetirmos o mesmo teste com o IFI desabilitado, veremos que a criação do banco demora mais e no editor hexadecimal veremos que o SQL Server preencheu com zeros o novo espaço alocado:

<a href="https://msdnshared.blob.core.windows.net/media/2017/06/01_ifi.png"><img width="615" height="375" class="alignnone wp-image-145" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/06/01_ifi.png" /></a>

<strong>Pontos adicionais</strong>
<ul type="disc">
 	<li><span>Após conceder a permissão </span><span><em>Perform Volume Maintenance Tasks</em> </span><span>é necessário reiniciar o serviço do SQL Server;</span></li>
 	<li><span>Para instâncias clusterizadas é preciso conceder essa permissão em todos os nós;</span></li>
 	<li><span>No SQL Server 2016 é possível conceder essa permissão durante o setup:</span></li>
</ul>
<a href="https://msdnshared.blob.core.windows.net/media/2017/06/02_ifi_16.png"><img width="547" height="249" class="wp-image-155 aligncenter" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/06/02_ifi_16.png" /></a>

<strong>Update em 06/10/2017</strong>

<em>A partir do SQL Server 2016 SP1 e SQL Server 2012 SP4 é possível validar se o IFI está habilitado na instância consultando a DMV <strong>sys.dm_server_services</strong>. </em>A DMV não considera se o serviço foi reiniciado.

&nbsp;

<strong>Referências adicionais</strong>

Database Instant File Initialization: <a href="https://docs.microsoft.com/en-us/sql/relational-databases/databases/database-instant-file-initialization">https://docs.microsoft.com/en-us/sql/relational-databases/databases/database-instant-file-initialization</a>

SetFileValidData function: <a href="https://msdn.microsoft.com/en-us/library/aa365544(VS.85).aspx">https://msdn.microsoft.com/en-us/library/aa365544(VS.85).aspx</a>

&nbsp;

Silas

============================

<em>The code and techniques described in this blog are presented to the reader ‘as is’, without any warranty, whether express or implied, of its accuracy, completeness, fitness for a particular purpose, title or non-infringement, and none of the third-party products or information mentioned in the work are authored, recommended, supported or guaranteed by any of the authors or Microsoft. Further, the authors shall not be liable for any damages you may sustain by using this information, whether direct, indirect, special, incidental or consequential, even if it has been advised of the possibility of such damages. Your use of the information contained in these pages, is at your sole risk.</em>]]></content:encoded>
    </item>
    <item>
      <title>[Administração] Permissões para manter Jobs do SQL Server Agent</title>
      <link>https://docs.microsoft.com/archive/blogs/silasmendes/permissao-jobs-sqlagent</link>
      <pubDate>Fri, 26 May 2017 17:02:46 GMT</pubDate>
      <dc:creator><![CDATA[Silas Mendes]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/silasmendes/?p=95</guid>
      <description><![CDATA[Recentemente um cliente solicitou apoio para limitar as ações dos usuários que podem visualizar os...]]></description>
      <content:encoded><![CDATA[Recentemente um cliente solicitou apoio para limitar as ações dos usuários que podem visualizar os <strong>jobs</strong> do <strong>SQL Server Agent</strong>. O objetivo do cliente era permitir que esses usuários somente pudessem visualizar, iniciar ou parar os jobs de uma instância.
O SQL Server Agent possui 3 database roles no banco MSDB. Segue um resumo dos principais acessos de cada uma delas:
<ul>
 	<li><strong>SQLAgentUserRole</strong>: permite criar/modificar/apagar/visualizar/executar/parar/habilitar/desabilitar os jobs que o usuário é <em>owner</em>;</li>
 	<li><strong>SQLAgentReaderRole</strong>: permite criar/modificar/apagar/executar/parar/habilitar/desabilitar jobs que o usuário é <em>owner</em>. Permite também a visualização dos jobs de outros <em>owners</em>, porém <strong>não é possível</strong> editar/executar/parar/alterar schedule dos jobs de outros <em>owners</em>;</li>
 	<li><strong>SQLAgentOperatorRole</strong>: permite criar/modificar/apagar/executar/parar/habilitar/desabilitar jobs que o usuário é <em>owner</em>; <strong>além disso</strong> permite executar/parar/habilitar/desabilitar/alterar schedule dos jobs de outros <em>owners</em>.</li>
</ul>
Para ver todas os detalhes e permissões de cada uma das <em>database role</em> citadas, consulte a documentação:
<a href="https://docs.microsoft.com/en-us/sql/ssms/agent/sql-server-agent-fixed-database-roles">https://docs.microsoft.com/en-us/sql/ssms/agent/sql-server-agent-fixed-database-roles</a>

No cenário do cliente a role <em>SQLAgentOperatorRole</em> era a mais adequada; porém o cliente não queria que os usuários desta <em>role </em>tivessem permissão para executar qualquer outra operação (por exemplo: habilitar/desabilitar/criar/etc).

A solução mais simples nesse cenário foi manter o usuário na role <strong>SQLAgentOperatorRole</strong> e negar a permissão de execução nas procedures <strong>sp_update_job</strong>, <strong>sp_update_schedule</strong> e <strong>sp_purge_jobhistory </strong> no banco MSDB; dessa forma o usuário continuou com as permissões necessárias para acessar o <em><strong>Job Activity Monitor</strong></em>, visualizando o status de qualquer job da instância e se preciso iniciar/parar a execução dos jobs, porém, sem a possibilidade de habilitar/desabilitar/alterar schedule/etc.

Silas
<h6>============================

<em>The code and techniques described in this blog are presented to the reader ‘as is’, without any warranty, whether express or implied, of its accuracy, completeness, fitness for a particular purpose, title or non-infringement, and none of the third-party products or information mentioned in the work are authored, recommended, supported or guaranteed by any of the authors or Microsoft. Further, the authors shall not be liable for any damages you may sustain by using this information, whether direct, indirect, special, incidental or consequential, even if it has been advised of the possibility of such damages. Your use of the information contained in these pages, is at your sole risk.</em></h6>]]></content:encoded>
    </item>
    <item>
      <title>[SQLAudit] Como visualizar mais de 1000 registros no Audit Log Viewer</title>
      <link>https://docs.microsoft.com/archive/blogs/silasmendes/sqlaudit-visualizar-mais-1000-registros-audit-log-viewer</link>
      <pubDate>Fri, 28 Apr 2017 17:40:34 GMT</pubDate>
      <dc:creator><![CDATA[Silas Mendes]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/silasmendes/?p=76</guid>
      <description><![CDATA[Recentemente um cliente questionou se era possível aumentar o volume de registros retornados pelo...]]></description>
      <content:encoded><![CDATA[Recentemente um cliente questionou se era possível aumentar o volume de registros retornados pelo <b>Audit Log Viewer</b>. Por padrão essa tela só retorna os 1000 registros mais recentes.

É possível aumentar esse número; no entanto a opção fica um pouco "escondida" no Management Studio. Além disso é preciso considerar que se você definir um número muito alto, isso poderá impactar o desempenho dessa tela.

Para aumentar o número de linhas retornadas, basta acessar o menu <b>Tools</b> &gt; <b>Options</b> &gt; opção "<b>SQL Server Object Explorer</b>" &gt; sub-opção "<b>Audit Log Viewer Options</b>":

<a href="https://msdnshared.blob.core.windows.net/media/2017/04/AuditLogViewerOptions.png"><img width="846" height="566" class="alignnone size-full wp-image-86" alt="auditlogvieweroptions" src="https://msdnshared.blob.core.windows.net/media/2017/04/AuditLogViewerOptions.png" /></a>

Outra abordagem para recuperar dados de auditoria é utilizar a função de sistema: <b>sys.fn_get_audit_file</b>. No comando abaixo, leremos todos os arquivos de auditoria do endereço 'E:\LogAuditoria\', recuperando todos os eventos que ocorreram no dia 26-04-2017:
<pre>SELECT *
FROM sys.fn_get_audit_file ('E:\LogAuditoria\*',default,default)
WHERE event_time BETWEEN '2017-04-26 00:00:00' and '2017-04-26 23:59:59'; 
GO</pre>
Silas

&nbsp;
<h6>============================

<em>The code and techniques described in this blog are presented to the reader ‘as is’, without any warranty, whether express or implied, of its accuracy, completeness, fitness for a particular purpose, title or non-infringement, and none of the third-party products or information mentioned in the work are authored, recommended, supported or guaranteed by any of the authors or Microsoft. Further, the authors shall not be liable for any damages you may sustain by using this information, whether direct, indirect, special, incidental or consequential, even if it has been advised of the possibility of such damages. Your use of the information contained in these pages, is at your sole risk.</em></h6>]]></content:encoded>
    </item>
    <item>
      <title>[Administração] Novidades no plano de manutenção de índices no SQL Server 2016</title>
      <link>https://docs.microsoft.com/archive/blogs/silasmendes/plano-manutencao-idx-sqlserver-2016</link>
      <pubDate>Wed, 15 Mar 2017 17:03:26 GMT</pubDate>
      <dc:creator><![CDATA[Silas Mendes]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/silasmendes/?p=65</guid>
      <description><![CDATA[O plano de manutenção (maintenance plan) é uma ferramenta que facilita muito a criação de rotinas...]]></description>
      <content:encoded><![CDATA[O plano de manutenção (<span>maintenance plan</span>) é uma ferramenta que facilita muito a criação de rotinas para manter os bancos de dados SQL Server, com ele podemos configurar rotinas periódicas para CHECKDB, manutenção de índices e estatísticas, backups, etc; porém, utilizar o plano de manutenção para manter índices de grandes bases nem sempre era viável, porque não era possível definir regras para evitar que o plano fizesse a manutenção de <strong>todos</strong> os índices (independente se o índice estivesse fragmentado); para evitar o <em>rebuild/reorganize </em>de todos os índices o DBA tinha que criar uma rotina customizada.

A partir do SQL Server 2016 temos algumas melhorias: veja na imagem abaixo que agora, por padrão, o plano de manutenção de <em>rebuild </em>de índices vem com uma configuração onde o <em>rebuild </em>só afetará índices com mais de 30% de fragmentação e com mais de 1000 páginas (~8MB):

<a href="https://msdnshared.blob.core.windows.net/media/2017/03/IndexMaintenancePlan.png"><img width="387" height="512" class="alignnone wp-image-75" alt="indexmaintenanceplan" src="https://msdnshared.blob.core.windows.net/media/2017/03/IndexMaintenancePlan.png" /></a>

Temos o mesmo recurso para o <em>reorganize</em>, mas nesse caso o valor do campo <span>%Fragmentation</span> é 15%.

Silas Mendes
<h6>============================

<em>The code and techniques described in this blog are presented to the reader ‘as is’, without any warranty, whether express or implied, of its accuracy, completeness, fitness for a particular purpose, title or non-infringement, and none of the third-party products or information mentioned in the work are authored, recommended, supported or guaranteed by any of the authors or Microsoft. Further, the authors shall not be liable for any damages you may sustain by using this information, whether direct, indirect, special, incidental or consequential, even if it has been advised of the possibility of such damages. Your use of the information contained in these pages, is at your sole risk.</em></h6>
&nbsp;]]></content:encoded>
    </item>
  </channel>
</rss>