Invia e-mail da un trigger

Sto cercando di sviluppare un trigger di posta elettronica. Qualcuno potrebbe assistere su come questo potrebbe essere raggiunto in modo che quando un uso inserisce un record controlla il campo “velocità” in modo tale che quando il valore inserito supera 100, una mail viene inviata all’indirizzo specificato.

Per prima cosa devi configurare la posta del database – se non lo hai fatto, questa domanda potrebbe aiutare:

  • Configurazione script della posta del database

Allora hai bisogno di un trigger:

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 

Ora, probabilmente stai per dire che vuoi che i dati dall’inserto siano effettivamente inclusi nell’e-mail. E la tua prima inclinazione sarà quella di dichiarare alcune variabili locali e assegnarle dall’inserimento – questo non funziona perché il tuo trigger potrebbe rispondere ad un inserto multi-fila. Quindi il modo giusto per farlo è:

 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 

Ciò detto, non sono un grande fan dell’invio di e-mail da un trigger. Anche se la posta del database utilizza il broker di servizi e quindi è asincrona, sarei molto più incline a popolare una tabella di code, e ho un thread in background che viene fornito e invia tutte le e-mail appropriate. Le due cose belle di questo sono:

  1. minimizzi i potenziali ritardi nel commettere la transazione esterna che ha innescato il trigger: più complicata è la logica nel trigger, più lentamente lo fai.
  2. poiché probabilmente non è essenziale che l’e-mail sia inviata il microsecondo in cui è inserita la riga, puoi facilmente variare i tempi del processo in background, evitando di dover controllare il tavolo molto minuto, tutto il giorno, quando molto poche volte mai dover effettivamente fare qualcosa.
  3. Come sottolineato da @goodeye, mantenere questo processo separato può impedire che errori nella parte e-mail del processo interferiscano con il DML originale (nel loro caso, un parametro non valido per sp_send_dbmail – che inavvertitamente suggerivo – impediva l’inserimento).