2012-05-25 39 views
14

Estoy intentando 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.Enviar correo electrónico desde un desencadenador

+0

También necesita OTORGAR EJECUTAR al usuario para msdb.dbo.sp_send_dbmail si se está ejecutando en una aplicación, por ejemplo. – smoore4

Respuesta

37

primer lugar usted necesita para configurar el correo de base de datos - si no lo ha hecho, esta pregunta podría ayudar:

Luego hay 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 = '[email protected]', 
      @profile_name = 'default', 
      @subject = 'Someone was speeding', 
      @body = 'Yep, they sure were.'; 
    END 
END 
GO 

Ahora, probablemente diga que desea que los datos del inserto 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. Así que la forma correcta de hacer esto 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 = '[email protected]', 
      @profile_name = 'default', 
      @subject = 'At least one person was speeding', 
      @body = @body; 
    END 
END 
GO 

Dicho todo esto, yo no soy un gran fan de envío de e-mail de un gatillo. 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. Los dos tres cosas buenas acerca de esto son:

  1. a minimizar los posibles retrasos en la comisión de la transacción externa que disparó el gatillo - cuanto más complicada sea la lógica en el gatillo, el más lento de realizar este proceso.
  2. dado que probablemente no sea esencial que el correo electrónico se envíe en el microsegundo en que se insertó la fila, puede fluctuar fácilmente el tiempo del proceso en segundo plano; esto evita tener que consultar la tabla muy minuciosamente, todo el día, cuando veces tendrá que hacer algo.
  3. Como @goodeye señaló, mantener este proceso separado puede evitar que los errores en la parte del correo electrónico interfieran con el archivo DML original (en su caso, un parámetro no válido en sp_send_dbmail - que sugerí inadvertidamente) impidió la inserción)
+0

Gracias por los comentarios. ¿Cómo configuro el correo de la base de datos? –

+1

+1 por 'Sí, seguro que sí.' – JNK

+0

Gracias. Tu solución funciona bien –

Cuestiones relacionadas