Benutzer mit den meisten Antworten
SQL Server Agent: Step Notification

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
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- Als Antwort markiert Yury Iwtschenko Donnerstag, 14. Oktober 2010 19:07
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- Als Antwort markiert Yury Iwtschenko Donnerstag, 14. Oktober 2010 19:07
-
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