2017-02-02 4 views
1

Ich muss einen Trigger in einer SQL-Tabelle erstellen, um eine E-Mail zu senden, wenn der eingefügte Datensatz bestimmte Bedingungen erfüllt. Das heißt, ich erstelle den Trigger in Table1, um eine E-Mail an X zu senden, wenn im eingefügten Datensatz das Feld IdCircuito = 53, IdTipoDoc = 45 und Gestor = 'Gest1' ist. Außerdem möchte ich im Text der E-Mail-Nachricht den Wert eines bestimmten Felds des eingefügten Datensatzes anzeigen. Ich habe etwas getan, aber Trigger immer unabhängig von der eingefügten Datensatz ausführen:SQL-Trigger zum Senden einer E-Mail

CREATE TRIGGER dbo.SendEmail 
    ON dbo.TitulosDoc 
    AFTER INSERT 
AS 

BEGIN   
SET NOCOUNT ON; 
IF EXISTS (SELECT 1 FROM TitulosDoc WHERE IdCircuito = 53 AND IdTipoDoc = 45 AND Gestor = 'Gest1') 
BEGIN 
    EXEC msdb.dbo.sp_send_dbmail 
     @recipients = '[email protected]', 
     @subject = 'New requeriment', 
     @body = 'It's a new requeriment: '; 
END 
END 
GO 

In Körper ist, wo ich einen wörtlichen Text mit dem Wert des Feldes des eingefügten Datensatz angezeigt werden soll: @body = ‚Es ist ein neue Anfrage: '+ TitulosDoc.NombreDocumento;

Kann mir jemand helfen? Danke

+0

Anstatt die E-Mail direkt von Ihrem Trigger Senden Sie sollten stattdessen eine Staging-Tabelle von Daten füllen, die per E-Mail gesendet werden muss. Erstellen Sie dann einen Prozess, der die Staging-Tabelle alle paar Minuten abfragt und die E-Mail sendet. Der Grund dafür ist, dass Sie mehr als eine Zeile gleichzeitig einfügen können, und Sie müssen diese Zeilen loopen. Anstatt Schleifen und E-Mails in den Trigger zu setzen, verschieben wir diese in eine Zwischenspeichertabelle, um die Leistung des Systems aufrechtzuerhalten. –

Antwort

1

Um auf die eingefügte Zeile zuzugreifen, müssen Sie unter INSERTED auswählen. Try this:

CREATE TRIGGER dbo.SendEmail 
    ON dbo.TitulosDoc 
    AFTER INSERT 
AS 

BEGIN   
SET NOCOUNT ON; 

DECLARE @NombreDocumento VARCHAR(MAX) = (SELECT INSERTED.NombreDocumento 
             FROM INSERTED 
             WHERE INSERTED.IdCircuito = 53 
             AND INSERTED.IdTipoDoc = 45 
             AND INSERTED.Gestor = 'Gest1') 

IF @NombreDocumento IS NOT NULL 
BEGIN 

    EXEC msdb.dbo.sp_send_dbmail 
     @recipients = '[email protected]', 
     @subject = 'New requeriment', 
     @body = 'It''s a new requeriment: ' + @NombreDocumento; 
END 
END 
GO 
+0

Da wir mehrere Zeilen einfügen können, ist dies eine der Zeiten, in denen eine Schleife benötigt wird. –

+0

Danke @Stephen !. Deine Antwort funktioniert für mich, aber mit ein wenig Modifikation: in der body-Variablen kannst du keinen literalen Text mit einer Variablen auf diese Art verketten, du musst das tun: setze @body = 'Es ist eine neue Anfrage:' + (Wählen Sie NombreDocumento von eingefügt); – Rsg

0

ich tun würde, was Sean Lange sagte ... eine physische Tabelle TempTitulosDoc, dann geben Sie Ihre Datensätze es, die per E-Mail gesendet werden müssen genannt erstellen. Tun Sie dies in Ihrem Auslöser.

Erstellen Sie eine gespeicherte Prozedur wie diese, die diese Datensätze durchläuft und eine E-Mail sendet. Wenn Sie fertig sind, aktualisieren Sie das TempTitlosDoc mit dem Status 1, der eine gesendete E-Mail angibt.

DECLARE @loopCount  INT 
DECLARE @field1   VARCHAR(10) 
DECLARE @field2   VARCHAR(10) 
DECLARE @EmailStatus int 

--Create Temp Table 
CREATE TABLE #Temp 
(
    id int not null identity, 
    field1 VARCHAR(10), 
    field2 VARCHAR(10), 
    EmailStatus int 
) 

--Insert Tasks to temp table 
INSERT INTO #Temp (field1, field2, EmailStatus) 
SELECT field1, field2, EmailStatus 
FROM dbo.TempTiulosDoc 
WHERE Status = 0 

--Set a loopCount for while loop 
SET @loopCount = 1 

--Use the while loop to check if we have any Tasks left to send 
while (exists(SELECT id FROM #Temp WHERE id = @loopCount)) 
    BEGIN 

     --Get current record in temp table 
     SELECT @field1    = field1, 
       @field2    = field2, 
       @EmailStatus  = EmailStatus 
     FROM #Temp 
     WHERE id = @loopCount 

     EXEC msdb.dbo.sp_send_dbmail 
      @recipients = '[email protected]', 
      @subject = 'New requeriment', 
      @body = 'It''s a new requeriment: ' + @NombreDocumento; 

     --Update your work table with the status of 1 so it's not picked up again 
     UPDATE teq 
     SET [email protected] = 1 
     FROM dbo.TempTiulosDoc teq 
     WHERE teq.id = @field1 

     SET @loopCount = @loopCount + 1 

    END 
+0

Große Alternative! Danke Manderson – Rsg