WMI com SQL SERVER: Um exemplo prático que gerou até correção na documentação oficial do SQL

Tempo de leitura estimado: 4 minutos

Este foi um email que recebi na última sexta (12/04/2019).

Ele confirma que uma correção que eu postei na documentação oficial do SQL Server foi validada e aprovada!

A correção já foi aplicada na página sobre o uso do WMI com o SQL Server.

 

Sobre as contribuições

Como a Microsoft está se aproximando mais e mais da comunidade!!! Além de abrir o código-fonte de tecnologias como powershell,  a Microsoft também permite que qualquer um possa sugerir melhorias nas documentações do produto. E o mais legal é que tudo isso é feito usando o repositório oficial da documentação no GitHub e markdown!!!

Eu lembro que há algum tempo eu enviei a seguinte mensagem num grupo de estudos de SQL Server recomendando o aprendizado de markdown, reforçando que seria o futuro da documentação! E algum tempo depois, a mãe Microsoft, nos aparece com a fonte da documentação do SQL escrita em markdown!!!!

Eu realmente sugiro que, se você ainda não o fez, aprenda Git e markdown, porque estas tecnologias vão muito além de desenvolvimento de software!!!

A primeira vez que tive contato com markdown, foi na equipe do Command Center, da Stefanini, local que atuo até hoje! E sim, usamos markdown extensivamente para gerar documentação dos nossos scripts!

Sobre a correção

A correção que eu postei pode ser visualizada no GitHub oficial da documentação do SQL Server, registrada na Issue 1817

Na verdade foi uma correção e inclusão de exemplos!

A correção foi referente ao namespace do provider do WMI do SQL Server!  Anteriormente, a documentação mencionava um formato incorreto, o que poderia confundir os leitores. O trecho anterior, com as informações incorretas é esse:

 

 

E ficou assim:

 

Além da correção no formato do namespace, eu ainda sugerí a inclusão de alguns exemplos em powershell para que o leitor tenha formas de descobrir os vários namespaces que possam estar instalados.

 

Sobre o WMI

Se você não conhece o WMI, pode estar se perguntando qual a real necessidade disso tudo!! A questão é que o WMI é uma poderosa fonte de informações e automação no SQL Server!

Por exemplo, já se perguntou como você pode mudar o IP do SQL ou mesmo habilitar o TCP/IP sem o uso de interface gráfica? Você faz isso com powershell e WMI . Aqui está um script de exemplo:

$ErrorActionPreference = "Stop";

$nomeInstancia = 'SQL16'

#namespace onde estão as classes do wmi para gerenciar o sql server
#(foi isso que submeti para correção!)
#Pega o nome mais recente, pode ter vários namespaces, dependendo das versões instaladas!!!
$nsLastName = @(gwmi -ns 'root\Microsoft\SqlServer' __NAMESPACE | ? {$_.name -match 'ComputerManagement' } | sort Name)[-1].Name

if(!$nsLastName){
    throw "NAMESPACE_COMPUTERMANAGEMENT_NAOINSTALADO: Tem certeza que o sql server ou as clients tools foi instalado corretamente???"
}
    
#Guardando o nome do namespace em uma variável, já que vamos usar mais de uma vez!!!
$sqlns = "root\Microsoft\SqlServer\$nsLastName"


#Vamos habilitar o protocolo TCP/IP!
$ProtoFilter = "InstanceName = '$nomeInstancia' and ProtocolName = 'Tcp'"
$ProtoTcp = Get-WmiObject -ns $sqlns -Class ServerNetworkProtocol -Filter $ProtoFilter 
$res = $ProtoTcp.SetEnable();

#Se deu algum problema pra habilitar, erro!
if($res.ReturnValue){
    throw "ERRO_HABILITAR_TCP: Codigo do erro = $($res.ReturnValue)"
}


#Agora, vamos colocar a porta em que o SQL irá rodar (aqui estou setando no Ip = IpAll, igual geralmente fazemos no configuration manager)
#Nesse exemplo, to setando a porta 1433
$IpFilter = "IpAddressName = 'IpAll' and PropertyName = 'TcpPort' and InstanceName = 'SQL16'"
$TcpIpAll = Get-WmiObject -ns $sqlns -Class ServerNetworkProtocolProperty -Filter $IpFilter
$res = $TcpIpAll.SetStringValue("1433")

#Se deu algum problema pra habilitar, erro!
if($res.ReturnValue){
    throw "ERRO_DEFINICAO_PORTA: Codigo do erro = $($res.ReturnValue)"
}

#Desabilita ip dinamico!!
$IpFilter = "IpAddressName = 'IpAll' and PropertyName = 'TcpDynamicPorts' and InstanceName = 'SQL16'"
$DynamicTcpIpAll = Get-WmiObject -ns $sqlns -Class ServerNetworkProtocolProperty -Filter $IpFilter
$res = $DynamicTcpIpAll.SetStringValue("")


if($res.ReturnValue){
    throw "ERRO_DEFINICAO_PORTA: Codigo do erro = $($res.ReturnValue)"
}

write-host "Pronto, tudo certo, agore reinicei o SQL Server"
write-host "Comando para você reiniciar é (rode como admin): Restart-Service 'mssql`$$nomeInstancia' -force "

 

Executei o script em um ambiente de teste, onde  uma instância SQL16 não estava com o TCP habilitado!!!  Salvei o mesmo script acima em um arquivo T:\changesqltcp.ps1 e olha o teste:

Recentemente, precisei fazer essas alterações usando um Windows Server Core (que não tem muita interface gráfica, e a maioria das ações são na linha de comando). Instalei o SQL Server usando chocolatey, e depois, usando o powershell e WMI, consegui habilitar os protocolos! Foi nesse dia que identifiquei a necessidade desta correção!

 

Coincidência!

Por pura coincidência,  nos próximos dias estarei lançando um curso que te conta muita coisa sobre o WMI com SQL!!! É o “Fundamentos de Windows para DBA SQL Server – Módulo 01“. O curso será lançado na plataforma de cursos https://cursos.fabriciolima.net/!!

Neste curso, irei falar, através de muita demonstração, conceitos e casos reais, sobre os básico de Windows que todo DBA precisa saber pra começar a mexer com SQL Server! Este curso foi feito para aqueles que estão começando a administrar SQL Server e para aqueles que já administram há algum tempo! Tenho certeza que irão aprender coisas novas e úteis para o seu dia-a-dia!!!

Então, aproveito e deixo aqui a sugestão para você entrar na lista de espera e ir aproveitando o curso de segurança do Dirceu que acabou de sair do forno! E também tem as incríveis 25 dicas de performance do Fabiano!

 

E aí, você já conhecida o WMI pra realizar ações no SQL Server? Conta pra gente nos comentários suas experiências com automações no SQL Server!!!

Até mais (e, em breve, um novo post na série de CPU)!!!

Compartilhe este post!

Leave a reply

Your email address will not be published.