2016-08-09 123 views
1

Ich habe einen Trigger auf einem Tisch. Es ist ein sehr einfacher Trigger, der nach dem Einfügen gesetzt wird, sendet mir eine E-Mail. Seit ich diesen Trigger aktiviert habe, wurden mir alle 5 oder 6 Minuten E-Mails vom System geschickt. Es gibt nur ein Problem. Jedes Mal, wenn ich eine E-Mail zu erhalten, ist die Tabelle leerSQL Server-Trigger wird unerklärlich ausgelöst

Hier mein Trigger ist

USE [didaprod] 
GO 
/****** Object: Trigger [dbo].[Caseplayer_CaseId_Restore_insert_mail] Script Date: 09-08-2016 11:59:41 ******/ 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE trigger [dbo].[Caseplayer_CaseId_Restore_insert_mail] on [dbo].[Caseplayer_CaseId_Restore] 

AFTER INSERT 
as 

    SET NOCOUNT ON 

    declare @tekst nvarchar(500); 

    set @tekst = 'caseid sat til null på caseplayer! Tjek Caseplayer_CaseId_Restore tabel!' + convert(varchar,getdate(),105); 

    EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Mail', 
           @recipients = '[email protected]', 
           @subject = 'CASEID SAT TIL NULL!!!', 
           @body = @tekst 

    SET NOCOUNT OFF 
GO 

Ich habe versucht, manuell eine Zeile einzufügen, oder ein paar Zeilen in der Tabelle, nur um zu überprüfen und ja, der Auslöser wird auch ausgelöst, wenn ein richtiger Einschub vorhanden ist. Aber ich kann nicht erklären, warum ich weiterhin die E-Mails empfange! Was den Tisch angeht, hat er nichts Besonderes.

USE [didaprod] 
GO 

/****** Object: Table [dbo].[Caseplayer_CaseId_Restore] Script Date: 09-08-2016 12:04:46 ******/ 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE TABLE [dbo].[Caseplayer_CaseId_Restore](
    [Id] [int] NOT NULL, 
    [CaseId] [int] NOT NULL, 
    [TimeOfChange] [datetime] NOT NULL 
) ON [PRIMARY] 

GO 

Ich habe jetzt den Auslöser deaktiviert und bestätigt, dass die E-Mails gestoppt haben. Aber das scheint für mich ein fast magisches Problem zu sein, und ich würde gerne eine Antwort bekommen.

Angenommen, ich tun

delete from [Caseplayer_CaseId_Restore] 

Und nur die Tabelle in Ruhe lassen. Ich werde immer noch E-Mails vom System bekommen und mir sagen, dass ich die Tabelle überprüfen soll. Wenn ich führen Sie dann eine

select * from [Caseplayer_CaseId_Restore] 

Der Tisch ist leer

+0

Ist diese Tabelle von einem anderen SPs verarbeitet? Ist es möglich, dass einige andere Funktionen nach Zeilen in dieser Tabelle suchen, sie verarbeiten und schließlich entfernen? –

+0

Es ist eine komplett neue Tabelle. Nichts interagiert mit ihm, außer dass ich einen Trigger auf eine andere Tabelle namens "CasePlayers" habe, die Zeilen in meine "Restore" -Tabelle einfügt, wenn ein bestimmtes Kriterium erfüllt ist. Dies habe ich getestet und funktioniert wie erwartet. Das Ganze ist auf ein Legacy-System zurückzuführen, das wir ab und zu versuchen, Selbstmord zu begehen, indem wir ab und zu ein bestimmtes Feld in der Caseplayer-Tabelle zurücksetzen. Mein Auslöser für Caseplayer, fügen Sie einfach ein, was benötigt wird, um eine Wiederherstellung durchzuführen, in meiner Wiederherstellungstabelle, so dass ich nicht auf Backups zurückgreifen muss, sondern stattdessen eine schnelle Aussage machen kann. –

Antwort

3

SQL Server Feuer einmal pro Anweisung löst anstatt einmal pro Reihe. Deshalb ist es wichtig, Trigger zu schreiben, die inserted entsprechend verwenden, um mit der Tatsache umzugehen, dass es 1, viele oder null Zeilen enthalten kann.

Ich vermute, dass es der letzte Fall hier ist. (Das heißt eine regelmäßig ausgeführt INSERT-Anweisung, die in der Tat ist das Einfügen null Zeilen)

Also, möchten Sie vielleicht so etwas wie:

CREATE trigger [dbo].[Caseplayer_CaseId_Restore_insert_mail] 
      on [dbo].[Caseplayer_CaseId_Restore] 

AFTER INSERT 
as 

    SET NOCOUNT ON 

    IF EXISTS(select * from inserted) 
    BEGIN 
     declare @tekst nvarchar(500); 

     set @tekst = 'caseid sat til null på caseplayer! Tjek Caseplayer_CaseId_Restore tabel!' + convert(varchar,getdate(),105); 

     EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Mail', 
           @recipients = '[email protected]', 
           @subject = 'CASEID SAT TIL NULL!!!', 
           @body = @tekst 

    END 
+0

Ich verstehe so viel und hätte nichts dagegen, eine E-Mail für jede Aussage zu bekommen. Was ich erlebe, ist eher "magisch" in meinen Gedanken. Meine Frage –

+1

@KasparKjeldsen aktualisieren - aber der Punkt, den ich mache, ist, dass wenn jemand 'INSERT ... SELECT ... WHERE 0 = 1' geschrieben hat (oder irgendeine SELECT-Anweisung, die keine Zeilen zurückgibt), die' INSERT' löst aus - aber es wurden keine Zeilen hinzugefügt. –

+0

Ich denke ich verstehe jetzt deinen Standpunkt. Es tut mir leid, dass ich es zuerst nicht bekommen habe. Ich werde deine Lösung ausprobieren. –