Enviar correo electrónico desde un disparador

Estoy tratando de desarrollar un disparador de correo. ¿Podría alguien ayudarnos sobre cómo se puede lograr esto para que cuando un uso inserte un registro revise el campo “velocidad” de modo que cuando el valor insertado exceda 100, se envíe un correo a la dirección especificada.

Primero necesita configurar el correo de la base de datos; si no lo ha hecho, esta pregunta podría ayudar:

  • Configuración de scripting del correo de la base de datos

Entonces necesitas un disparador:

CREATE TRIGGER dbo.whatever ON dbo.wherever FOR INSERT AS BEGIN SET NOCOUNT ON; IF EXISTS (SELECT 1 FROM inserted WHERE speed > 100) BEGIN EXEC msdb.dbo.sp_send_dbmail @recipients = 'whoever@yourcompany.com', @profile_name = 'default', @subject = 'Someone was speeding', @body = 'Yep, they sure were.'; END END GO 

Ahora, probablemente va a decir que desea que los datos de la inserción se incluyan realmente en el correo electrónico. Y su primera inclinación será declarar algunas variables locales y asignarlas desde inserted ; esto no funciona porque su activador podría estar respondiendo a una inserción de varias filas. Entonces, la forma correcta de hacerlo es:

 CREATE TRIGGER dbo.whatever ON dbo.wherever FOR INSERT AS BEGIN SET NOCOUNT ON; DECLARE @body NVARCHAR(MAX) = N''; SELECT @body += CHAR(13) + CHAR(10) + RTRIM(some_col) FROM inserted; IF EXISTS (SELECT 1 FROM inserted WHERE speed > 100) BEGIN EXEC msdb.dbo.sp_send_dbmail @recipients = 'whoever@yourcompany.com', @profile_name = 'default', @subject = 'At least one person was speeding', @body = @body; END END GO 

Dicho todo esto, no soy un gran fan de enviar correos electrónicos desde un disparador. Aunque el correo de la base de datos utiliza el intermediario de servicios y, por lo tanto, es asíncrono, me inclinaría mucho más a rellenar una tabla de colas, y tengo un hilo de fondo que aparece y envía todos los correos electrónicos apropiados. Las dos cosas buenas de esto son:

  1. minimiza los retrasos potenciales en la transacción externa que desencadenó el desencadenador: cuanto más complicada sea la lógica en el desencadenador, más lento será el proceso.
  2. dado que probablemente no sea esencial que el correo electrónico se envíe en el microsegundo en que se inserta la fila, puede fluctuar fácilmente el tiempo del proceso en segundo plano; esto evita tener que verificar la tabla muy minuciosamente, todo el día, cuando muy pocas veces lo hará alguna vez tiene que hacer algo realmente
  3. Como señaló @goodeye, mantener este proceso separado puede evitar que los errores en la parte del correo electrónico del proceso interfieran con el archivo DML original (en su caso, un parámetro no válido para sp_send_dbmail , que sugerí inadvertidamente, impidió la inserción).