sp_send_dbmail servidor resultado query pueden por mensajes mail los job enviar ejemplos desde correo como sql-server

servidor - Enviar mensaje desde el desencadenador SQL Server



no se pueden enviar los mensajes de correo al servidor de correo sql server (7)

Dependiendo del tipo de mensaje que desee enviar, puede usar un procedimiento CLR almacenado para conectarse a un socket en el proceso en ejecución y escribir el mensaje para eso. Si no tiene control sobre el proceso (es decir, no puede modificarlo), puede construir un puente o utilizar una biblioteca que pueda emitir un mensaje en un formato adecuado.

Para una entrega confiable, puede hacer algo que use MSMQ para entregar el mensaje.

Necesito señalizar una aplicación en ejecución (servicio de Windows) cuando suceden ciertas cosas en SQL Server (2005). ¿Existe la posibilidad de enviar un mensaje desde un desencadenador a una aplicación externa en el mismo sistema?


No estoy seguro de que los DBA lo aprueben, pero hay una forma de ejecutar comandos usando xp_cmdshell

"Ejecuta una cadena de comando dada como un shell de comandos del sistema operativo y devuelve cualquier salida como filas de texto. Otorga permisos a usuarios no administrativos para ejecutar xp_cmdshell".

Ejemplo del sitio de MS:

CREATE PROC shutdown10 AS EXEC xp_cmdshell ''net send /domain:SQL_USERS ''''SQL Server shutting down in 10 minutes. No more connections allowed.'', no_output EXEC xp_cmdshell ''net pause sqlserver'' WAITFOR DELAY ''00:05:00'' EXEC xp_cmdshell ''net send /domain: SQL_USERS ''''SQL Server shutting down in 5 minutes.'', no_output WAITFOR DELAY ''00:04:00'' EXEC xp_cmdshell ''net send /domain:SQL_USERS ''''SQL Server shutting down in 1 minute. Log off now.'', no_output WAITFOR DELAY ''00:01:00'' EXEC xp_cmdshell ''net stop sqlserver'', no_output


Puede enviar un correo electrónico desde un desencadenador, pero no es una práctica recomendada porque el sistema de correo electrónico está inactivo, no se pueden hacer cambios de datos en la tabla.

Personalmente, si puede vivir con menos de tiempo real, le daré información sobre el evento que le interesa a otra mesa (para que el cambio real de datos pueda realizarse sin problemas incluso si el correo electrónico no funciona por algún motivo). Entonces tendría un trabajo que revisa esa tabla cada 5-10 minutos para ver si hay nuevas entradas y las envía por correo electrónico.


Puede usar un mensaje de correo electrónico de dbmail. No debería ralentizar el desencadenador si el servidor de correo está inactivo porque el mensaje está en cola y luego enviado por un proceso externo (a sql).

La idea de tabla suena bien si la aplicación puede acceder al servidor sql.

También podría dar acceso a esa misma tabla a través de los servicios XML nativos de sql 2005, que exponen los procesos a través de xml. http://msdn.microsoft.com/en-us/library/ms345123(SQL.90).aspx


Puede usar una cola de SQL Service Broker para hacer lo que desee. El desencadenador puede crear una conversación y enviar un mensaje en la cola. Cuando comienza, el proceso externo debe conectarse a la base de datos y emitir una declaración WAITFOR (RECEIVE) en esta cola. Recibirá el mensaje cuando el desencadenador lo envíe.


Un recordatorio de que los desencadenantes pueden ser problemáticos para cosas como esta porque están integrados en operaciones de conjunto. Y al estar asociados con tablas, no son muy sensibles al contexto en el que están despedidos. El problema puede ser si activan una operación que involucra varias filas, porque es difícil evitar invocar tantas instancias de su acción como registros hay en la operación. Varios cientos de correos electrónicos no son improbables, por ejemplo.

Con suerte, "las cosas que suceden" se pueden detectar en una asociación más cercana con el contexto en el que ocurren (que también puede ser interesante para intentar dar marcha atrás desde un desencadenador).


Ya sea:

  • Use RAISERROR (gravedad 10) para activar un trabajo y alerta de agente SQL.

  • Cargue una tabla separada que se sondee periódicamente mediante un proceso de manejo de correo por separado. (como sugirió HLGEM)

  • Use un procedimiento almacenado para enviar el mensaje y escribir en la tabla.

Cada solución desacopla el disparador transaccional de una llamada de mensajería potencialmente larga.