SQL Server – Como fazer uma integração do banco de dados com o Slack e enviar mensagens utilizando Python e sp_execute_external_script

0

Como vocês devem saber, o SQL 2017 trouxe uma série de novidades e novos recursos para o nosso dia a dia, e uma delas, foi a possibilidade de executar scripts escritos em Python pelo SQL Server, tanto para análises estatísticas (muito utilizado por cientistas de dados e estatísticos), tanto para realizar tarefas do dia a dia, como utilizar API’s para enviar mensagens e alertas pelo Slack.

Hoje estou bastante animado por causa desse post. Meu primeiro utilizando Python no SQL Server 2017, e podem esperar bem mais por aí.. No dia 04 de fevereiro de 2017, eu havia liberado o post SQL Server – Como fazer uma integração do banco de dados com o Slack e enviar mensagens utilizando o CLR (C#) e desta vez eu volto aqui para lhes mostrar como realizar essa mesma integração utilizando apenas recursos nativos do SQL Server 2017.

Introdução

Como vocês devem saber, o SQL 2017 trouxe uma série de novidades e novos recursos para o nosso dia a dia, e uma delas, foi a possibilidade de executar scripts escritos em Python pelo SQL Server, tanto para análises estatísticas (muito utilizado por cientistas de dados e estatísticos), tanto para realizar tarefas do dia a dia.

O que é o Slack?

Para quem não conhece, o Slack é um dos comunicadores corporativos mais famosos e utilizados em todo o mundo, principal concorrente do Ryver e tem a proposta de substituir a comunicação via e-mail por grupos privados e públicos (dentro do time) focados em determinadas equipes e/ou assuntos. Você pode criar grupos públicos, onde toda sua equipe pode interagir e colaborar e grupos privados para cada setor, onde somente quem está no grupo pode visualizar as mensagens.

O Slack permite que você responda e-mails pela própria ferramenta, envio e compartilhamento de arquivos, envio de mensagens privadas, instalação de diversos plugins para adicionar novos recursos e muito mais.

No plano gratuito, a busca de mensagens recupera apenas as últimas 10 mil mensagens, o limite de armazenamento é de 5 GB e mais algumas limitações que você pode verificar neste link.

Onde e como posso usar o Slack na minha empresa?

Esse recurso é especialmente útil para criar equipes na sua empresa e gerar alertas e monitoramentos por equipe, onde cada equipe recebe apenas os alertas referentes às suas atividades. Além disso, você pode utilizar os grupos abertos para enviar informativos e notificações que interessam para a empresa toda. Tudo isso, sem custo algum e você pode receber por e-mail, visualizar na Web e no seu smartphone.

Uma outra forma legal de se utilizar o Slack, é enviar acompanhamento de metas de vendas para o setor de comercial, de forma que os gerentes regionais e locais possam acompanhar a performance da equipe de vendas em tempo real, sem ter que ficar consultando e abrindo relatórios, onde quer que eles estejam, mesmo fora da empresa.

Caso sua empresa adote o Slack, o setor de RH pode utilizar o serviço para enviar mensagens e informativos para os colaboradores. Enviar mensagens de natal, uma mensagem especial no aniversário do colaborador, etc.

Enfim, a vantagem do Slack é que ele pode ser enviado de várias formas diferentes (E-mail, Web, Smartphone), onde quer que você esteja, dentro ou fora da empresa e representa uma grande revolução na forma em que as pessoas interagem com as informações.

Utilizo o Slack onde eu trabalho como ferramenta de comunicação, monitoramento e alertas das rotinas de TI, como falhas em jobs críticos, problemas em backups, corrupções de bases, queries lentas, locks, etc. Sempre que alguma rotina crítica falha, é enviado um e-mail interno e uma notificação via Slack, onde chega uma notificação Push no meu celular (igual do Whatsapp) e onde quer que eu esteja, tomo conhecimento dessa falha.

Como adicionar usuários ao Slack

O primeiro passo para criar a integração, é criar sua conta no Slack, acessando este link. Uma vez criada, você receberá um e-mail para logar na sua conta.

Tela inicial do Slack, já com alguns grupos que criei para este post

Para adicionar novos usuários, basta clicar no menu (Seu nome) e selecionar a opção “Invite people”

Você pode adicionar seus contatos da usa conta do Google, importar vários contatos no formato CSV e outros. Uma vez que você convide outras pessoas, ela receberão um link para se juntar à sua equipe e após finalizar o cadastro, elas já poderão visualizar os dados pelo navegador Web ou aplicativo para celular.

Como habilitar o Python no SQL Server 2017

Para habilitar o Python no SQL Server 2017 você irá precisar ativar o recurso external scripts enabled, com o comando abaixo:

EXEC sp_configure 'external scripts enabled', 1
GO
RECONFIGURE WITH OVERRIDE;
GO

Resultado:
Configuration option 'external scripts enabled' changed from 0 to 1. Run the RECONFIGURE statement to install.

Uma vez executado, você precisará reiniciar o serviço do SQL Server 2017 no Configuration Manager:

Agora é só reiniciar o serviço, conforme a imagem abaixo:

Recomendo também reiniciar o serviço “SQL Server Launchpad”, uma vez que quando tentei executar o script Python, recebi essa mensagem de erro:

Msg 39011, Level 16, State 1, Line 10
SQL Server was unable to communicate with the LaunchPad service. Please verify the configuration of the service.

Como instalar a biblioteca Slacker

Para a nossa integração com o Slack pelo SQL Server, vamos utilizar a biblioteca Slacker. Para a sua instalação, abra o Prompt de comando como Administrador:


Uma vez aberto, basta digitar o comando abaixo:

cd "C:\Program Files\Microsoft SQL Server\MSSQL14.NOME_DA_SUA_INSTANCIA\PYTHON_SERVICES\Scripts"

pip install slacker


Caso você não saiba o caminho da sua instalação, você pode descobrir facilmente com esse comando aqui:

SELECT TOP (1) TRIM(REPLACE(B.[value], 'MSSQL\Binn\sqlservr.exe', '')) + 'PYTHON_SERVICES\Scripts'
FROM sys.dm_server_registry A
CROSS APPLY STRING_SPLIT(REPLACE(CAST(value_data AS VARCHAR(MAX)), '"', ''), '-') B
WHERE A.registry_key LIKE 'HKLM\SYSTEM\CurrentControlSet\Services\MSSQL%'
AND A.value_name = 'ImagePath'

Resultado:

Após digitar os comandos acima, a biblioteca terá sido instalada com sucesso:

Como ativar a API do Slack

Para que seja possível enviar as mensagens pelo Slack, precisamos criar uma integração customizada. Para isso acesse a URL https://api.slack.com/docs/oauth-test-tokens logado na conta do usuário que servirá como BOT e fará o envio das mensagens automáticas.

Clique no botão “Create token”.

Copie o token gerado para a sua aplicação. É com esse código enorme (76 caracteres no meu caso) que você será fará a autenticação com a API e poderá enviar suas mensagens através da API.

Como enviar mensagens no Slack pelo SQL Server

Agora que já expliquei o que é o Slack, habilitamos os scripts Python na instância e você já gerou o seu token de acesso, podemos começar a enviar mensagens no Slack através do SQL Server 2017.

Versão simples (apenas formatação)

Código da Stored Procedure que faz o envio das mensagens:

CREATE OR ALTER PROCEDURE dbo.stpEnvia_Mensagem_Slack (
    @Ds_Mensagem NVARCHAR(4000),
    @Ds_Canal NVARCHAR(256)
)
AS 
BEGIN

    DECLARE @SlackToken NVARCHAR(100) = 'seu token aqui' -- https://api.slack.com/docs/oauth-test-tokens
    DECLARE @Script NVARCHAR(MAX) = '
from slacker import Slacker
slack = Slacker("' + @SlackToken + '")
slack.chat.post_message(channel, text)'


    EXEC sys.sp_execute_external_script 
        @language = N'Python',
        @script = @Script,
        @params = N'@channel nvarchar(256), @text nvarchar(max)',
        @channel = @Ds_Canal,
        @text = @Ds_Mensagem


END

Exemplo de uso para mensagem privada para outro usuário:

 EXEC dbo.stpEnvia_Mensagem_Slack
    @Ds_Mensagem = N'Teste de integração', -- nvarchar(max)
    @Ds_Canal = N'@bot_dirceuresende' -- nvarchar(128)

Resultado:

Exemplo de uso para mensagem em um canal:

EXEC dbo.stpEnvia_Mensagem_Slack
    @Ds_Mensagem = N'Teste de integração', -- nvarchar(max)
    @Ds_Canal = N'#ti' -- nvarchar(128)

Resultado:

Versão completa (com cores, links e formatações)

Código da Stored Procedure que faz o envio da mensagem:

 


CREATE OR ALTER PROCEDURE dbo.stpEnvia_Mensagem_Slack_Completa (
    @Ds_Mensagem NVARCHAR(4000),
    @Ds_Canal NVARCHAR(256),
    @Ds_Cor_Hexa NVARCHAR(10) = '',
    @Ds_Titulo NVARCHAR(128) = '',
    @Ds_Link NVARCHAR(256) = '',
    @Ds_Mensagem_Interna NVARCHAR(4000) = ''
)
AS 
BEGIN


    DECLARE 
        @SlackToken NVARCHAR(100) = 'seu token aqui', -- https://api.slack.com/docs/oauth-test-tokens
        @ConteudoTexto NVARCHAR(MAX) = '[
    {
        "fallback": "' + @Ds_Mensagem + '",
        "color": "#' + @Ds_Cor_Hexa + '",
        "pretext": "' + @Ds_Mensagem + '",
        "title": "' + @Ds_Titulo + '",
        "title_link": "' + @Ds_Link + '",
        "text": "' + @Ds_Mensagem_Interna + '",
        "mrkdwn_in": ["text", "pretext"]
    }
]'


    DECLARE 
        @Script NVARCHAR(MAX) = '
from slacker import Slacker
slack = Slacker("' + @SlackToken + '")
slack.chat.post_message(channel, text, username, as_user, parse, link_names, attachments, unfurl_links, unfurl_media, icon_url, icon_emoji, thread_ts)'
    
    
    EXEC sys.sp_execute_external_script 
        @language = N'Python',
        @script = @Script,
        @params = N'@channel nvarchar(256), @text nvarchar(max), @username nvarchar(128), @as_user nvarchar(10), @parse nvarchar(100), @link_names nvarchar(10), @attachments nvarchar(max), @unfurl_links nvarchar(10), @unfurl_media nvarchar(10), @icon_url nvarchar(255), @icon_emoji nvarchar(100), @thread_ts nvarchar(100)',
        @channel = @Ds_Canal,
        @text = @Ds_Mensagem,
        @as_user = 'false',
        @attachments = @ConteudoTexto,
        @icon_emoji = '',
        @icon_url = 'https://www.dirceuresende.com/wp-content/uploads/2018/01/cropped-Azure-SQL-Database-generic_COLOR-2-180x180.png',
        @link_names = 'true',
        @parse = 'none',
        @thread_ts = '',
        @unfurl_links = 'true',
        @unfurl_media = 'true',
        @username = 'BOT Dirceu Resende'


END

Exemplos de uso

Envio de mensagens com formatação

EXEC dbo.stpEnvia_Mensagem_Slack_Completa 
    @Ds_Canal = N'informativos', -- nvarchar(max)
    @Ds_Mensagem = N'Teste de Mensagem', -- nvarchar(max)
    @Ds_Cor_Hexa = N'ff0000', -- nvarchar(max)
    @Ds_Titulo = N'Título da Mensagem com Borda Vermelha', -- nvarchar(max)
    @Ds_Link = N'', -- nvarchar(max)
    @Ds_Mensagem_Interna = N'Essa é a mensagem do Slack. Aceita *negrito*, _italico_ e ~sublinhado~' -- nvarchar(max)

Envio de mensagens com Links externos
Ao clicar no título da mensagem, você será direcionado para a URL https://www.dirceuresende.com/blog 🙂

EXEC dbo.stpEnvia_Mensagem_Slack_Completa 
    @Ds_Canal = N'informativos', -- nvarchar(max)
    @Ds_Mensagem = N'', -- nvarchar(max)
    @Ds_Cor_Hexa = N'00ff00', -- nvarchar(max)
    @Ds_Titulo = N'Título da Mensagem com Borda Verde', -- nvarchar(max)
    @Ds_Link = N'https://www.dirceuresende.com/blog', -- nvarchar(max)
    @Ds_Mensagem_Interna = N'Essa é a mensagem do Slack. Aceita *negrito*, _italico_ e ~sublinhado~' -- nvarchar(max)

Envio de mensagem com quebra de linha

EXEC dbo.stpEnvia_Mensagem_Slack_Completa 
    @Ds_Canal = N'informativos', -- nvarchar(max)
    @Ds_Mensagem = N'', -- nvarchar(max)
    @Ds_Cor_Hexa = N'0000ff', -- nvarchar(max)
    @Ds_Titulo = N'', -- nvarchar(max)
    @Ds_Link = N'', -- nvarchar(max)
    @Ds_Mensagem_Interna = N'Essa é a mensagem do Slack com Borda Azul.\n\nAceita *negrito*\nAceita_italico_\nAceita ~sublinhado~' -- nvarchar(max)

Para saber mais sobre formatação no Slack, acesse este link. E é isso aí, pessoal!

Espero que tenham gostado desse post e até a próxima!

Compartilhe.

Sobre o autor