Faaaaala chicos!!
Hoy estoy muy emocionado con este post. La primera vez que uso Python en SQL Server 2017, y puedes esperar mucho más por venir... El 4 de febrero de 2017, publiqué la publicación. SQL Server – Cómo integrar la base de datos con Slack y enviar mensajes usando CLR (C#) y esta vez vuelvo aquí para mostrarles cómo realizar esta misma integración utilizando únicamente características nativas de SQL Server 2017.

Introducción

Como sabrá, SQL 2017 trajo una serie de noticias y nuevas características para nuestra vida diaria, y una de ellas era la posibilidad de ejecutar scripts escritos en Python mediante SQL Server, tanto para análisis estadístico (muy utilizado por científicos de datos y estadísticos) como para la realización de tareas del día a día.

No conozco holgura

Ver más información

¿Qué es la holgura?

Para aquellos que no lo saben, el Flojo es uno de los comunicadores corporativos más famosos y utilizados en todo el mundo, principal competidor de Ryver y pretende sustituir la comunicación vía correo electrónico con grupos privados y públicos (dentro del equipo) centrados en determinados equipos y/o temas. Puedes crear grupos públicos, donde todo tu equipo puede interactuar y colaborar, y grupos privados para cada sector, donde solo los del grupo pueden ver los mensajes.

Slack te permite responder correos electrónicos a través de la propia herramienta, enviar y compartir archivos, enviar mensajes privados, instalar varios complementos para agregar nuevas funciones y mucho más.

En el plan gratuito la búsqueda de mensajes solo recupera los últimos 10 mil mensajes, el límite de almacenamiento es de 5 GB y algunas otras limitaciones que puedes consultar en este enlace.

¿Dónde y cómo puedo utilizar Slack en mi empresa?

Esta característica es especialmente útil para crear equipos en tu empresa y generar alertas y seguimiento por equipo, donde cada equipo solo recibe alertas relacionadas con sus actividades. Además, puede utilizar grupos abiertos para enviar boletines y notificaciones que sean relevantes para toda la empresa. Todo ello, sin coste alguno y podrás recibirlo por correo electrónico, visualizarlo en la web y en tu smartphone.

Otra forma interesante de utilizar Slack es enviar el seguimiento de los objetivos de ventas al sector comercial, de modo que los gerentes regionales y locales puedan monitorear el desempeño del equipo de ventas en tiempo real, sin tener que consultar y abrir informes, estén donde estén, incluso fuera de la empresa.

Si su empresa adopta Slack, el departamento de recursos humanos puede utilizar el servicio para enviar mensajes y boletines a los empleados. Enviar mensajes navideños, un mensaje especial por el cumpleaños del empleado, etc.

De todos modos, la ventaja de Slack es que se puede enviar de varias formas diferentes (correo electrónico, web, teléfono inteligente), estés donde estés, dentro o fuera de la empresa y representa una gran revolución en la forma en que las personas interactúan con la información.

Utilizo Slack donde trabajo como herramienta de comunicación, monitoreo y alertas para rutinas de TI, como fallas críticas en trabajos, problemas de respaldo, corrupción de bases de datos, consultas lentas, bloqueos, etc. Cada vez que falla una rutina crítica, se envía un correo electrónico interno y una notificación a través de Slack, donde llega una notificación Push a mi celular (al igual que WhatsApp) y esté donde esté, estoy consciente de esta falla.

Cómo agregar usuarios a Slack

El primer paso para crear la integración es crear su cuenta de Slack, accediendo a este enlace. Una vez creado, recibirá un correo electrónico para iniciar sesión en su cuenta.

Pantalla de inicio de Slack, con algunos grupos que creé para esta publicación

Para agregar nuevos usuarios, simplemente haga clic en el menú (Su nombre) y seleccione la opción “Invitar personas”

Puede agregar sus contactos desde su cuenta de Google, importar varios contactos en formato CSV y más. Una vez que invite a otras personas, recibirán un enlace para unirse a su equipo y, después de completar el registro, podrán ver los datos a través del navegador web o la aplicación móvil.

Cómo habilitar Python en SQL Server 2017

Para habilitar Python en SQL Server 2017, deberá activar la función scripts externos habilitados, con el siguiente comando:

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.

Una vez ejecutado, deberá reiniciar el servicio SQL Server 2017 en Configuration Manager:

Ahora simplemente reinicie el servicio, como se muestra en la imagen a continuación:

También recomiendo reiniciar el servicio “SQL Server Launchpad”, ya que cuando intenté ejecutar el script Python, recibí este mensaje de error:

Mensaje 39011, Nivel 16, Estado 1, Línea 10
SQL Server no pudo comunicarse con el servicio LaunchPad. Por favor verifique la configuración del servicio.

Cómo instalar la biblioteca Slacker

Para nuestra integración con Slack a través de SQL Server, usaremos la biblioteca Slacker. Para instalarlo, abra el símbolo del sistema como administrador:

Una vez abierto, simplemente escriba el siguiente comando:

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

Si no conoce su ruta de instalación, puede averiguarla fácilmente con este comando aquí:

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:

Después de escribir los comandos anteriores, la biblioteca se habrá instalado correctamente:

Cómo habilitar la API de Slack

Para poder enviar mensajes a través de Slack, necesitamos crear una integración personalizada. Para ello acceda a la URL https://api.slack.com/docs/oauth-test-tokens ha iniciado sesión en la cuenta de usuario que servirá como BOT y enviará mensajes automáticos.

Haga clic en el botón "Crear token".

Copie el token generado en su aplicación. Es con este enorme código (76 caracteres en mi caso) que te autenticarás con la API y podrás enviar tus mensajes a través de la API.

Cómo enviar mensajes en Slack a través de SQL Server

Ahora que expliqué qué es Slack, habilitamos los scripts de Python en la instancia y generó su token de acceso, podemos comenzar a enviar mensajes en Slack a través de SQL Server 2017.

Versión simple (solo formateo)

Código de procedimiento almacenado que envía mensajes:

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

Ejemplo de uso para mensaje privado a otro usuario:

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

Resultado:

Ejemplo de uso de un mensaje en un canal:

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

Resultado:

Versión completa (con colores, enlaces y formato)

Código de procedimiento almacenado que envía el mensaje:

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 = '/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

Ejemplos de uso

Enviar mensajes formateados

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)

Envío de mensajes con enlaces externos
Cuando haces clic en el título del mensaje, serás dirigido a la URL https://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://dirceuresende.com/blog', -- nvarchar(max)
    @Ds_Mensagem_Interna = N'Essa é a mensagem do Slack. Aceita *negrito*, _italico_ e ~sublinhado~' -- nvarchar(max)

Enviar un mensaje con saltos de línea

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 obtener más información sobre el formateo en Slack, accede a este enlace.

¡Y eso es todo, amigos!
Espero que hayas disfrutado de esta publicación y ¡hasta la próxima!