none
Trigger Mailversand bei neuer DB in Server RRS feed

  • Frage

  • Hallo an alle,

    ich möchte gern einen Trigger erstellen der mir eine Mail erzeugt wenn eine neue Datenbank angelegt wurde. Aus einem anderen Thread ging hervor das ich dazu wie folgt vorgehen kann. 

    CREATE TRIGGER trg_CreateDatabase3 ON ALL SERVER
    FOR CREATE_DATABASE
    AS
       EXEC msdb.dbo.sp_send_dbmail  
       @profile_name = 'Mailversand',   
       @importance = 'High',
       @recipients = 'mail@mail.mail',  
       @query = 'SELECT getdate()' ,  
       @subject = 'Testlauf2',  
       @attach_query_result_as_file = 1,  
       --@body =  @bodytext;
       @body = 'test',
       @body_format = 'HTML' ;
    GO

    Man merkt das der Trigger ausgelöst und man merkt auch leider das dieser in eine Endlosschleife läuft. 

    Wenn ich den einzelnen Bereich der EXEC-Anweisung ausführe erhalte ich eine Mail. Wenn ich den Trigger so aufbau das er zb. einen Wert in eine Tabelle schreibt funktioniert dies auch. 

    Aber der Trigger ist an sich nicht in der Lage ein Mail zu schicken wenn eine neue DB angelegt wird. 

    Vielleicht soll dies auch nicht gehen? Sicherheitsfeature?

    Dienstag, 24. März 2020 21:29

Alle Antworten

  • Hallo!

    Stefan hatte die Frage für Dich bereits in einem anderen Thread diskutiert:

    https://social.msdn.microsoft.com/Forums/de-DE/0d9da03d-0fef-4383-8756-2103d617e7ce/spsenddbmail-klappt-nicht-aus-ddl-trigger-heraus?forum=sqlserverde


    Einen schönen Tag noch, Christoph - http://www.insidesql.org/blogs/cmu

    Mittwoch, 25. März 2020 06:53
    Beantworter
  • Moin,

    da kann ich auch erst mal nur etwas raten: sp_send_dbmail (Transact-SQL) => "When executing sp_send_dbmail without a transaction context, Database Mail starts and commits an implicit transaction"

    Und Kommandos wie CREATE DATABASE und Transaktionen beißen sich zuweilen.

    Allerdings würde ich eben so eine Fehlermeldung erwarten.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Mittwoch, 25. März 2020 07:11
  • Hier ist mal eine Variante, die ich früher produktiv genutzt habe. Vielleicht macht es ja einen Unterschied, dass die Werte für die Mail dort statisch sind?

    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE TRIGGER [ddl_trig_create_database] 
    ON ALL SERVER 
    FOR CREATE_DATABASE 
    AS 
        declare @datenbank nvarchar(max)
        declare @server nvarchar(max)
        declare @mailtext nvarchar(max)
        
        select @datenbank = EVENTDATA().value('(/EVENT_INSTANCE/DatabaseName)[1]','nvarchar(max)')
        select @server = EVENTDATA().value('(/EVENT_INSTANCE/ServerName)[1]','nvarchar(max)')
        
        set @mailtext = 'Hallo zusammen,' + nchar(13) + nchar(13) + 'bitte für die neu angelegte Datenbank "' 
    					+ @datenbank + '" auf dem "' + @server + '"' + nchar(13) 
    					+ 'eine erste Vollsicherung durchführen und diese ins Backup-System aufnehmen!' + nchar(13) + nchar(13) +
    					'Danke und viele Grüße' + nchar(13) + 
    					'Die SQL-Admins'
        
    	   EXEC msdb.dbo.sp_send_dbmail
    		@profile_name = 'SQLMail',
    		@recipients = 'backupteam@e.de',
    		@body = @mailtext,
    		@subject = 'Neue Datenbank';
    		
    GO
    
    SET ANSI_NULLS OFF
    GO
    
    SET QUOTED_IDENTIFIER OFF
    GO
    
    ENABLE TRIGGER [ddl_trig_create_database] ON ALL SERVER
    GO
    


    Einen schönen Tag noch, Christoph - http://www.insidesql.org/blogs/cmu

    Mittwoch, 25. März 2020 07:44
    Beantworter