Desenvolvimento

21 nov, 2018

Get-SQLBuildVersion uma forma diferente para se manter atualizado

Publicidade

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\:

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 -Confirm

Ou:

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!