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.