none
SQL Server Agent: Step Notification RRS feed

  • Frage

  • Hallo zusammen,

    ich habe Notifikation für SQL Server Agent Jobs eingerichtet, es funktioniert problemlos.
    Nun möchte ich, dass SQL Server Agent mehr Info an mich sendet, damit ich direkt aus dem Mail Fehlerursache erkennen kann.

    Mir fehlen Fehlermeldungen einzelnen Schritten.
    Z.B.: wenn ein Job fehlgeschlagen ist, wird an mich nur die Info gesendet:

    JOB RUN: 'name' was run on 14.10.2010 at 02:00:00
    DURATION: 0 hours, 16 minutes, 4 seconds
    STATUS: Failed
    MESSAGES: The job failed. The Job was invoked by Schedule ** (name). The last step to run was step * (name).
    

    Ich hätte gern die vollständige Meldung bekommen:

    Executed as user: ***** . Microsoft (R) SQL Server Execute Package
    Utility Copyright (C) Microsoft Corp 1984-2005. All rights reserved.
    Started: 02:00:01 Progress: 2010-10-14 02:00:14.39   
    Source: {******}   Executing query "DECLARE @Guid UNIQUEIDENTIFIER   
    EXECUTE msdb..sp...".: 100% complete End Progress 
    Progress: 2010-10-14 02:00:21.68
    ………………
    Description: SSIS Warning Code DTS_W_MAXIMUMERRORCOUNTREACHED. 
    The Execution method succeeded, but the number of errors raised (2) 
    reached the maximum allowed (1); resulting in failure. 
    This occurs when the number of errors reaches the number specified in MaximumErrorCount. 
    Change the MaximumErrorCount or fix the errors. End Warning DTExec: 
    The package execution returned DTSER_FAILURE (1). 
    Started: 02:00:01 Finished: 02:16:03 Elapsed: 961.563 seconds. 
    The package execution failed. The step failed.
    

     

    Kann man es konfigurieren?

    SQL Server 2008 Standard SP2 (x64)


    Gruß Yury
    Donnerstag, 14. Oktober 2010 07:49

Antworten

  • Hallo Yury,

    mir ist nicht bekannt, das man das konfigurieren kann. Aber die Informationen werden in der Tabelle sysjobhistory gespeichert, so dass Du diese selbst ermittlen könntest. Du könntest Dir ein Stored Procedure anlegen, die die Information selektiert und Dir per sp_send_dbmail zusenden lassen, sei es als Attachement oder als HTML Tabelle aufbereitet; die SP rufst Du dann über einen letzten Job-Step oder über einen separaten Job ab.

    Hier das SQL Statement als Beispiel für die heute gelaufen, fehlerhaften Jobsteps:

    SELECT JOB.name as JobName

          ,STEPS.step_name as StepName

          ,HIST.message

    FROM msdb.dbo.sysjobs AS JOB

         INNER JOIN

         msdb.dbo.sysjobsteps AS STEPS

             ON JOB.job_id = STEPS.job_id

         INNER JOIN

         msdb.dbo.sysjobhistory AS HIST

             ON STEPS.job_id = HIST.job_id

                AND STEPS.step_id = HIST.step_id

    WHERE HIST.run_date = CONVERT(int, CONVERT(varchar(8), GetDate(), 112))

          AND HIST.run_status = 0 -- Nur fehlgeschlagene Steps

     


    Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de
    Donnerstag, 14. Oktober 2010 08:46

Alle Antworten

  • Hallo Yury,

    mir ist nicht bekannt, das man das konfigurieren kann. Aber die Informationen werden in der Tabelle sysjobhistory gespeichert, so dass Du diese selbst ermittlen könntest. Du könntest Dir ein Stored Procedure anlegen, die die Information selektiert und Dir per sp_send_dbmail zusenden lassen, sei es als Attachement oder als HTML Tabelle aufbereitet; die SP rufst Du dann über einen letzten Job-Step oder über einen separaten Job ab.

    Hier das SQL Statement als Beispiel für die heute gelaufen, fehlerhaften Jobsteps:

    SELECT JOB.name as JobName

          ,STEPS.step_name as StepName

          ,HIST.message

    FROM msdb.dbo.sysjobs AS JOB

         INNER JOIN

         msdb.dbo.sysjobsteps AS STEPS

             ON JOB.job_id = STEPS.job_id

         INNER JOIN

         msdb.dbo.sysjobhistory AS HIST

             ON STEPS.job_id = HIST.job_id

                AND STEPS.step_id = HIST.step_id

    WHERE HIST.run_date = CONVERT(int, CONVERT(varchar(8), GetDate(), 112))

          AND HIST.run_status = 0 -- Nur fehlgeschlagene Steps

     


    Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de
    Donnerstag, 14. Oktober 2010 08:46
  • Hallo Olaf,

    danke für Deine Antwort.

    Schade, dass es nicht konfigurierbar ist. Ich habe gehofft so eine Einstellung übersehen zu haben.


    Gruß Yury
    Donnerstag, 14. Oktober 2010 18:22
  • Hallo zusammen,

    also, ich benötige Info über einzelne fehlgeschlagene Schritte, bevor ich mich an System anmelde.
    Ich habe die Lösung implementiert, weil die detaillierte Info man mit Standardmittel nicht zuschicken lassen kann.

    USE msdb
    GO
    IF EXISTS (SELECT * FROM sys.triggers 
    WHERE object_id = OBJECT_ID(N'[dbo].[TR_sysjobhistory_INS]'))
    DROP TRIGGER [dbo].[TR_sysjobhistory_INS]
    GO
    -- ===============================================================
    -- Yury Iwtschenko
    -- 2010-10-15
    --
    -- Der Trigger versendet detaillierte Info
    -- über einzelne Schritte eines SQL Server Jobs
    --
    -- Voraussetzungen:
    -- Datenbank Mail, ein SQL Server Agent Operator 
    -- und Notifikation eines Jobs müssen eingerichtet sein
    --
    -- !!! Name des Datenbank Mail Profils (@profile_name) muss angegeben werden.
    -- ===============================================================			
    CREATE TRIGGER dbo.TR_sysjobhistory_INS 
      ON dbo.sysjobhistory
      AFTER INSERT
    AS 
    BEGIN
    	SET NOCOUNT ON;
    
    	declare @subject nvarchar(255)
    	declare @body nvarchar(max)
    	declare @message nvarchar(4000)
    	declare @run_date varchar(10)
    	declare @run_time int
    
    	declare @profile_name sysname = '<profile_name,,profile_name>'
    	declare @recipients nvarchar(max)
    
    	select
    		@subject = (CASE h.run_status WHEN 1 THEN 'Succeeded' ELSE 'Failed' END)
    		+ ' [' + h.[server] + '].[' + j.[name] + '].[' + h.[step_name] + ']',
    		@message = h.[message],
    		@run_date = CAST(CONVERT(date,(cast(h.[run_date] as varchar(10))), 120) as varchar(10)),
    		@run_time = h.[run_time],
    		@recipients = o.email_address
    	from
    		inserted h
    		inner join msdb.dbo.sysjobs j
    		on h.job_id = j.job_id
    		left join msdb.dbo.sysoperators o
    		on j.notify_email_operator_id = o.id
    	where
    		((h.[run_status] = 0 and j.notify_level_email = 2)		-- When the job fails
    		or (h.[run_status] = 1 and j.notify_level_email = 1))	-- When the job succeeds
    		and j.notify_level_email > 0							-- Notifikation ist aktive
    		and h.step_id > 0										-- Nur Meldungen eines Schrittes versenden
    
    	if (@subject is not null)
    	begin
    		declare @pos tinyint = (case when @run_time > 95959 then 3 else 2 end)
    		set @body = 'RUN STEP: ' + CAST(CONVERT(date,@run_date, 120) as varchar(10)) + ' ' 
    				+ STUFF(STUFF((cast(@run_time as varchar(32))),@pos,0,':'),@pos+3,0,':')
    		set @body = @body + CHAR(13) + CHAR(10) + CHAR(10)
    		set @body = @body + 'MESSAGE: ' + @message
    
    		-- Mail Versand
    		exec msdb.dbo.sp_send_dbmail
    			@profile_name = @profile_name,
    			@recipients = @recipients,
    			@body = @body,
    			@subject = @subject;
    	end
    END
    GO
    

    Gruß Yury
    Freitag, 15. Oktober 2010 11:14