Get-SQLBuildVersion uma forma diferente para se manter atualizado
No seguinte artigo, Reginaldo Silva apresenta uma ferramenta bastante interessante, capaz de automatizar as checagens de build Online.

Fala, pessoal!
Hoje tem novidade: irei compartilhar um script PowerShell que vai ajudar no seu dia a dia.
No passado eu já havia feito um artigo sobre como checar a build do seu SQL Server e como saber se você está atualizado. Para relembrar, veja esse link:
Frequentemente precisamos estar checando os portais e feeds para saber das novas atualizações do SQL Server, como o service packs e cumulative updates. Atualmente eu utilizo os dois sites abaixo para me manter atualizado e checar as novas atualizações:
O script que apresentarei hoje automatizará essa checagem de build Online, irá comparar com a versão que seu SQL Server está operando e te enviará um e-mail com mais detalhes.
Para isso eu criei uma função chamada Get-SQLBuildVersion no PowerShell e seu código está público no Github. Essa função irá capturar a build da instância do seu SQL Server utilizando SMO, e buscará informações sobre essa build no blog. Essa requisição retornará uma tabela atualizada sobre as atualizações da sua instância.
Vamos conhecer um pouco mais sobre este comando utilizando a função Get-Help:
Get-Help Get-SQLBuildVersion -Detailed
Utilizando a função Get-Help com o parâmetro -detailed, conseguimos obter informações básicas sobre a function Get-SQLBuildVersion, assim como a descrição dos parâmetros. Você pode utilizar o parâmetro -full para informação completa da função.
Get-Help Get-SQLBuildVersion -Examples
Com o parâmetro -examples conseguimos ver exemplos básicos de utilização da função Get-SQLBuildVersion.
Agora usaremos a função para validar a versão da instância chamada SQLSERVER2016, que está em execução na máquina DESKTOP-A7S2JPV.
Get-SQLBuildVersion -SqlInstance “DESKTOP-A7S2JPV\SQLSERVER2016”
Podemos ver o retorno no console, onde apresenta na primeira parte a tabela com as builds e qual o nível de atualização para cada uma. Na segunda parte temos a build da instância passada como parâmetro, onde podemos ver claramente que está desatualizada, pois está operando na versão RTM e o SQL Server 2016 já possuí o service pack 2 mais alguns cumulatives updates, cujo último é o KB4458612.
A tabela utilizada para retornar à consulta é a imagem abaixo:

Mas agora eu quero que esse resultado seja enviado por e-mail semanalmente, onde validarei a versão das minhas instâncias de SQL Server, então adicionei alguns parâmetros e tratamentos para facilitar esse envio de e-mail:
#Import your email credential, you can export using this command: Get-Credential | Export-Clixml C:\Temp\credemail.xml, put yours credentials on the pop-up and save it.
$cred = Import-Clixml C:\Temp\credemail.xml
#Call function with your parameters
Get-SQLBuildVersion -SqlInstance “DESKTOP-A7S2JPV\SQLSERVER2016″,”DESKTOP-A7S2JPV\SQLSERVER2014” -SmtpServer “smtp.gmail.com” -EmailFrom “reginaldo.silva27@gmail.com” -EmailTo “reginaldo.silva27@gmail.com” –CredentialEmail $cred- SqlInstance: lista de instâncias que deseja verificar. Pode ser mais de uma separada por vírgula.
- SmtpServer: servidor de SMTP que deseja utilizar para enviar os e-mails.
- EmailFrom: conta que enviará o e-mail.
- EmailTo: conta que receberá o e-mail.
- CredentialEmail: credencial para autenticação com seu servidor de SMTP, como visto no exemplo. Pode exportar as credenciais utilizando o comando Get-Credential | Export-Clixml C:\Temp\credemail.xml. Informe suas credencias para conexão – elas serão salvas em um arquivo e sua senha criptografada.
Como resultado da execução acima, você receberá dois e-mails: um para cada instância informada no parâmetro SqlInstance.
Abaixo, exemplos dos e-mails que receberá:
Se a sua versão estiver atualizada

Mantenha a calma e tome uma cerveja: estamos atualizados! É uma ótima notícia para receber, não acha?
Se a sua versão estiver desatualizada

Houston, temos um problema com a versão do seu SQL Server, conforme podemos ver na imagem acima. A instância SQLSERVER2016 está operando na versão RTM, mas já tem novas atualizações, onde a mais recente é a atualização 13.0.5201.1.
Recebendo esse e-mail você já pode conectar pelo link dentro do e-mail (link em azul), avaliar quais as mudanças daquela build, e assim planejar um upgrade do seu ambiente, que pode estar vulnerável e operando com bugs e vulnerabilidades já corrigidas.
Para testar na sua máquina, utilize o PowerShell ISE, abra o script Get-SQLBuildVersion.ps1 e execute para carregar a função. Na mesma, ou em outra sessão, execute o comando abaixo trocando o parâmetro SqlInstance para o nome de sua instância:
Get-SQLBuildVersion -SqlInstance “DESKTOP-A7S2JPV\SQLSERVER2016”
- Reginaldo, como agendar um Job no SQL Server para receber e-mail semanal ou mensal?
O SQL Server já possuí a opção de executar um comando PowerShell dentro de um step. Porém, ele utilizará a versão do módulo SQLPS instalado. Normalmente pode ser uma versão mais desatualizada do que a versão do Powershell instalado no servidor, então recomendarei a execução do step com o tipo CmdExec e chamando o powershell.exe.
Dessa forma, estará utilizando a versão mais recente do PowerShell instalado na máquina, e para isso vamos criaremos dois objetos no SQL Server: uma credencial e um proxy. Vamos lá!
Baixe os dois scripts .ps1 do GitHub e salve em um local de sua máquina. Para o exemplo eu salvei em C:\Temp\:
- https://github.com/Jamal27/SQLServer_Scripts/blob/master/CallSQLVersion.ps1
- https://github.com/Jamal27/SQLServer_Scripts/blob/master/Get-SQLBuildVersion.ps1
Abra o script CallSQLVersion.ps1 e edite-o com os parâmetros corretos de e-mails, credenciais e instâncias. Esse script é encarregado de carregar a função e suas dependências em memória e executá-la.

Depois iremos no SQL Server criar uma credencial no caminho: Security > Credential. Informe um login local ou de domínio, que tenha acesso nos arquivos baixados.

Agora vamos em SQL Server Agent > Proxies. Crie um novo proxy com as configurações abaixo, onde no campo “Credential name” será a credencial que criamos no passo anterior. Selecione a opção “Operating system (CmdExec)”.

Em SQL Server Agent > Jobs, crie um novo job.

Na aba Steps, adicione um novo step, em “Type”, selecione “Operating System (CmdExec)”, e em “Run as” selecione o proxy criado no passo anterior.
Em comando adicione o código abaixo de acordo com o caminho que você salvou os arquivos:
powershell.exe -command “C:\temp\CallSQLVersion.ps1”
Na aba Schedules, crie um novo schedule e selecione a periodicidade que desejar executar o Job.

Pronto! Semanalmente irá receber e-mails dos servidores definidos no CallSQLVersion.ps1. Essa é a primeira release da função Get-SQLBuildVersion. Fique à vontade para aplicar suas customizações, e caso tenha sugestões críticas ou problemas, deixe nos comentários ou me envie um e-mail.
Um ótimo artigo para lhe servir como referência quanto a execução de PowerShell dentro de SQL Server Jobs:
Se identificar problemas ou tiver dificuldades ao implantar, entre em contato comigo, eu posso auxiliar em alguns erros comuns dentro do PowerShell.
Alguns problemas conhecidos:
Versões do PowerShell menores que 3.0 esse script não irá funcionar. Para validar sua versão utilize o comando abaixo e verifique a linha “PSVersion”:
$PSVersionTable
Para contornar esse problema da versão do PowerShell, você pode escolher uma máquina com PowerShell mais atualizado e centralizar a chamada apenas por ela, passando no parâmetro SqlInstance todas as suas instâncias.
Permissão para execução de scripts:

Possíveis soluções
Execute um dos comandos abaixo:
Set-ExecutionPolicy -Scope Process Unrestricted -Force -ConfirmOu:
Set-ExecutionPolicy Unrestricted- Reginaldo, devo sempre aplicar os cumulative updates em dia?
Cumulative update: aplicar ou não, eis a questão!
Para o SQL Server 2017 e versões que virão após ele, não haverá mais service packs, então a questão não será se deve aplicar ou não, mas sim quando irá aplicar!
No More Service Packs for SQL Server
Ótima leitura pra você!
É isso ai pessoal, espero que gostem e apreciem com moderação. Abraços!








