Faaaaala pessoal!!
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.
Introduction
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.
Não conheço o Slack
Visualizar mais informaçõesComo 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:
1 2 3 4 5 |
EXEC sp_configure 'external scripts enabled', 1 GO RECONFIGURE WITH OVERRIDE; GO |
Result:
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:
1 2 |
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:
1 2 3 4 5 |
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' |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
USE [dirceuresende] GO 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:
1 2 3 |
EXEC dbo.stpEnvia_Mensagem_Slack @Ds_Mensagem = N'Teste de integração', -- nvarchar(max) @Ds_Canal = N'@bot_dirceuresende' -- nvarchar(128) |
Exemplo de uso para mensagem em um canal:
1 2 3 |
EXEC dbo.stpEnvia_Mensagem_Slack @Ds_Mensagem = N'Teste de integração', -- nvarchar(max) @Ds_Canal = N'#ti' -- nvarchar(128) |
Versão completa (com cores, links e formatações)
Código da Stored Procedure que faz o envio da mensagem:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
USE [dirceuresende] GO 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://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
1 2 3 4 5 6 7 |
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://dirceuresende.com/blog 🙂
1 2 3 4 5 6 7 |
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://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
1 2 3 4 5 6 7 |
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.
And that's it, folks!
Espero que tenham gostado desse post e até a próxima!
Boa !!! #ripCLR
top d+.
O melhor comunicador que conheço!
Mais um post excelente. Forte abraço
Excelente post meu amigo! Vou usar nos meus alertas para o SQL Server. Grande Abraço!