Frage

Can I (Wie kann ich) Konfigurieren von SQL Server 2008 einen Operator zu benachrichtigen, wenn jeder Schritt im Job nicht?

Ich habe einen SQL Server-Job mit mehreren Schritten auf Update-Daten aus mehreren verschiedenen Quellen, gefolgt von einem letzten Schritt, der auf dem Datum mehrere Berechnungen durchführt. Alle „Daten aktualisieren“ Schritte „Gehe zum nächsten Schritt auf Fehler“ gesetzt. Generell, wenn einer der Daten Auffrischungen ausfällt, will ich noch den letzten Schritt zu laufen, aber ich will noch über die Zwischen Ausfälle informiert werden, so dass, wenn sie consistantly ausfallen, kann ich untersuchen.

War es hilfreich?

Lösung

Hier ist, wie wir es tun. Wir fügen einen letzten T-SQL-Schritt (in der Regel als „Prüfschritte“) mit diesem

SELECT  step_name, message
FROM    msdb.dbo.sysjobhistory
WHERE   instance_id > COALESCE((SELECT MAX(instance_id) FROM msdb.dbo.sysjobhistory
                                WHERE job_id = $(ESCAPE_SQUOTE(JOBID)) AND step_id = 0), 0)
        AND job_id = $(ESCAPE_SQUOTE(JOBID))
        AND run_status <> 1 -- success

IF      @@ROWCOUNT <> 0
        RAISERROR('Ooops', 16, 1)

Beachten Sie, dass dieser Code verwendet Token in Auftragsschritten (die $(...) Teil), so Code kann nicht in SSMS ausgeführt werden wie es ist. Es wird versucht basicly Einträge der vorherigen Schritte des aktuellen Auftrags in sysjobhistory und sucht nach Ausfall-Status zu finden.

In Eigenschaften-> Erweitert können Sie auch prüfen, Schrittausgabe in der Geschichte einschließen die Nachricht aus Schritt Scheitern zu erhalten. Lassen Sie die Bei Ausfall Aktion Beenden Sie den Job Bericht Ausfall .

Andere Tipps

@wqw ‚s akzeptierte Antwort ist ausgezeichnet.

Ich habe es für diejenigen erweitert, die Database Mail aktiviert haben ein wenig mehr Details über genau eine E-Mail, was ausgefallen ist und wie. Auch icvader Antwort auf dieser Seite enthält Konto der Wiederholungen zu nehmen.

Sollte für die von uns wirklich hilfreich sein, die genauer zu beurteilen müssen, ob dringende Maßnahmen erforderlich, wenn Offsite / Bereitschafts.

DECLARE 

@YourRecipients as varchar(1000) = 'myadminemail@bloatcorp.com'
,@YourMailProfileName as varchar(255) = 'Database Mail'

,@Msg as varchar(1000)
,@NumofFails as smallint
,@JobName as varchar(1000)
,@Subj as varchar(1000)
,@i as smallint = 1


---------------Fetch List of Step Errors------------
SELECT *
INTO #Errs

FROM

    (
    SELECT 
      rank() over (PARTITION BY step_id ORDER BY step_id) rn
    , ROW_NUMBER() over (partition by step_id order by run_date desc, run_time desc) ReverseTryOrder
    ,j.name job_name
    ,run_status
    , step_id
    , step_name
    , [message]

    FROM    msdb.dbo.sysjobhistory h
    join msdb.dbo.sysjobs j on j.job_id = h.job_id

    WHERE   instance_id > COALESCE((SELECT MAX(instance_id) FROM msdb.dbo.sysjobhistory
                                    WHERE job_id = $(ESCAPE_SQUOTE(JOBID)) AND step_id = 0), 0)
            AND h.job_id = $(ESCAPE_SQUOTE(JOBID))
    ) as agg

WHERE ReverseTryOrder = 1 ---Pick the last retry attempt of each step
  AND run_status <> 1 -- show only those that didn't succeed 


SET @NumofFails = ISNULL(@@ROWCOUNT,0)---Stored here because we'll still need the rowcount after it's reset.


-------------------------If there are any failures assemble email and send ------------------------------------------------
IF  @NumofFails <> 0
    BEGIN

        DECLARE @PluralS as char(1) = CASE WHEN @NumofFails > 1 THEN 's' ELSE '' END ---To make it look like a computer knows English
        SELECT top 1 @Subj = 'Job: ' + job_name + ' had ' + CAST(@NumofFails as varchar(3)) + ' step' + @PluralS + ' that failed'
                    ,@Msg =  'The trouble is... ' +CHAR(13) + CHAR(10)+CHAR(13) + CHAR(10)

                        FROM dbo.#Errs


        WHILE @i <= @NumofFails 
        BEGIN
            SELECT @Msg = @Msg + 'Step:' + CAST(step_id as varchar(3)) + ': ' + step_name  +CHAR(13) + CHAR(10)

            + [message] +CHAR(13) + CHAR(10)+CHAR(13) + CHAR(10) FROM dbo.#Errs
            WHERE rn = @i


            SET @i = @i + 1
        END

            exec msdb.dbo.sp_send_dbmail
            @recipients = @YourRecipients,
            @subject = @Subj,
            @profile_name = @YourMailProfileName,
            @body = @Msg


    END

Ein Unterschied zu den anderen Antworten, auf denen ihre Basis: Does die ganze Arbeit nicht als Fehler erhöhen. Das ist der Unterschied in Job-Historie zwischen Aborted und mit Fehlern abgeschlossen zu halten.

Eine Verbesserung der obigen Antwort, falls jemand will die Operatoren in SQL Server-Agenten zu senden E-Mail verwenden; und verwenden Sie die Datenbank Profilnamen in msdb gespeichert:

DECLARE @EmailRecipients as varchar(1000)
DECLARE @MailProfileName as varchar(255)
DECLARE @Msg as varchar(1000)
DECLARE @NumofFails as smallint
DECLARE @JobName as varchar(1000)
DECLARE @Subj as varchar(1000)
DECLARE @i as smallint = 1

SELECT @EmailRecipients = email_address 
FROM msdb.dbo.sysoperators
WHERE name = <Operator Name>

SELECT TOP(1) @MailProfileName = name 
FROM msdb.dbo.sysmail_profile

SELECT * INTO #Errs
FROM
    (SELECT rank() over (PARTITION BY step_id ORDER BY step_id) rn, 
            ROW_NUMBER() over (partition by step_id order by run_date desc, run_time desc) ReverseTryOrder,
           j.name job_name,
           run_status,
           step_id,
           step_name,
           [message]
     FROM msdb.dbo.sysjobhistory h
     JOIN msdb.dbo.sysjobs j ON j.job_id = h.job_id
     WHERE instance_id > COALESCE((SELECT MAX(instance_id) FROM msdb.dbo.sysjobhistory
                                    WHERE job_id = $(ESCAPE_SQUOTE(JOBID)) AND step_id = 0), 0)
     AND h.job_id = $(ESCAPE_SQUOTE(JOBID))
    ) AS agg
WHERE ReverseTryOrder = 1 ---Pick the last retry attempt of each step
AND run_status <> 1 -- show only those that didn't succeed 


SET @NumofFails = ISNULL(@@ROWCOUNT,0)---Stored here because we'll still need the rowcount after it's reset.

IF  @NumofFails <> 0
BEGIN
    DECLARE @PluralS as char(1) = CASE WHEN @NumofFails > 1 THEN 's' ELSE '' END

    SELECT top 1 @Subj = job_name + ':'+ CAST(@NumofFails as varchar(3)) + '''Check Steps'' Report',
                 @Msg =  '''Check Steps'' has reported that one or more Steps failed during execution of ' + job_name + CHAR(13) + CHAR(10)+ CHAR(13) + CHAR(10)
    FROM dbo.#Errs

    WHILE @i <= @NumofFails 
    BEGIN
        SELECT @Msg = @Msg + 'Step ' + CAST(step_id as varchar(3)) + ': ' + step_name  +CHAR(13) + CHAR(10)
                     + [message] +CHAR(13) + CHAR(10)+CHAR(13) + CHAR(10) 
        FROM dbo.#Errs
        WHERE rn = @i

        SET @i = @i + 1
    END

    EXEC msdb.dbo.sp_send_dbmail
    @recipients = @EmailRecipients,
    @subject = @Subj,
    @profile_name = @MailProfileName,
    @body = @Msg
END

Ich habe die meisten meiner Schritte, um Wiederholungs gesetzt aufgrund eines einzigartigen translog Szenario, das gelegentliche Blockierung verursacht. wqw der Post alarmiert, auch wenn ein Schritt erfolgreich erneut versucht hat. Ich habe eine Anpassung vorgenommen, die nicht-Alarm, wenn ein Schritt fehlgeschlagen ist, aber dann war ein Erfolg auf erneut versuchen kann.

SELECT  step_id, MIN(run_status)
FROM    msdb.dbo.sysjobhistory
WHERE   instance_id > COALESCE((SELECT MAX(instance_id) FROM msdb.dbo.sysjobhistory
                                WHERE job_id = $(ESCAPE_SQUOTE(JOBID)) AND step_id = 0), 0)
        AND job_id = $(ESCAPE_SQUOTE(JOBID))
GROUP BY step_id
HAVING MIN(run_status) <> 1 -- success

IF @@ROWCOUNT <> 0
RAISERROR('FailedStep', 16, 1)

Adamantish Antwort ist die perfekte Lösung (Danke): funktioniert einwandfrei .. Kleine Änderungen. Wie wqw bereits erwähnt, wird in SSMS nicht arbeiten, fügen Sie diese als letzten Schritt und den Auftrag ausführen.

WHERE instance_id > COALESCE
(
(
SELECT MAX(instance_id) 
FROM msdb.dbo.sysjobhistory
WHERE job_id = '2XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX' AND step_id = 0), 0
)
AND h.job_id = '2XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX'
) 
as agg

Zum Auftragseigenschaften> Registerkarte Benachrichtigung> Aktion auszuführen, wenn der Auftrag abgeschlossen

unter dieser Kontrolle der E-Mail-Checkbox und wählen Sie aus der Drop-down „Wenn der Auftrag nicht“ und speichern Sie den Job.

Read 4. Punkt auf http://msdn.microsoft.com/en- us / library / ms191130.aspx

Wenn Sie einen Operator per E-Mail benachrichtigt werden sollen, überprüfen Sie E-Mail, wählen Sie einen Operator aus der Liste und dann eine der folgenden Optionen wählen:

  • Wenn der Auftrag erfolgreich ist. Den Bediener, wenn der Auftrag abgeschlossen ist erfolgreich benachrichtigen

  • Wenn der Auftrag nicht. Die Bediener, wenn der Auftrag abgeschlossen ist erfolglos benachrichtigen

  • Wenn der Auftrag abgeschlossen. Die Bediener unabhängig von Abschlussstatus informieren

in jedem Schritt Zusatzcode:

if @@error > 0
EXEC sp_send_dbmail @profile_name='DBATeam',
@recipients=dbadmin@somewhere.com',
@subject='SomeJob SomeStep failed',
@body='This is the body of SomeJob SomeStep failed' 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top