Beschreibung der Prozedur

Die Prozedur dbo.sp_ReadErrorLogFiltered dient als moderne, sichere und flexible Ablösung der veralteten xp_readerrorlog-Aufrufe. Sie bietet:

  • Unterstützung für SQL Server 2012 und höher (durch Verwendung von sys.sp_readerrorlog).

  • Vordefinierte Ereignistypenloginbackupspn oder all für eigene Suchbegriffe.

  • Statusfilterung (failedsuccess) – speziell für Logins und Backups.

  • Zeitraumfilter über @startDate und @endDate (beliebig kombinierbar).

  • Auswahl des Log-Archivs über @logArchiveNo (0 = aktuelles Log, höhere Zahlen = ältere Archive).

  • Freie Textsuche über @searchText1 und @searchText2 (UND-Verknüpfung) für maximale Flexibilität.

  • Fehlerbehandlung – fängt Fehler beim Lesen des Logs ab und gibt sie weiter.

  • Keine Änderung von Serverkonfigurationen – im Gegensatz zu xp_cmdshell oder xp_regread ist diese Prozedur rein lesend und sicher.

Typische Einsatzbereiche:

  • Tägliche Überwachung von fehlgeschlagenen Anmeldeversuchen (Security-Audit).

  • Prüfung, ob nächtliche Backups erfolgreich waren.

  • Analyse von Kerberos/SPN-Problemen.

  • Allgemeine Fehlersuche im Fehlerprotokoll, z. B. nach Deadlocks, Fehlern 823, 824 usw.

Hinweis: Die Prozedur verwendet eine temporäre Tabelle, um die Logdaten zwischenzuspeichern und nach Datum zu filtern. Dies ist auch bei sehr großen Logdateien performant, da sp_readerrorlog bereits die Hauptfilterung (nach Suchtexten) vornimmt.

CREATE OR ALTER PROCEDURE dbo.sp_ReadErrorLogFiltered
    @eventType      NVARCHAR(20)   = 'all',      -- 'login', 'backup', 'spn', 'all'
    @status         NVARCHAR(10)   = NULL,       -- 'failed', 'success', NULL (alle)
    @startDate      DATETIME       = NULL,       -- Beginn des Zeitraums
    @endDate        DATETIME       = NULL,       -- Ende des Zeitraums
    @logArchiveNo   INT            = 0,          -- 0 = aktuelles Log, 1 = ältestes Archiv, usw.
    @searchText1    NVARCHAR(255)  = NULL,       -- zusätzlicher freier Suchtext (z.B. 'error')
    @searchText2    NVARCHAR(255)  = NULL        -- zweiter Suchtext (UND-Verknüpfung)
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @search1 NVARCHAR(255),
            @search2 NVARCHAR(255),
            @logType INT = 1;                   -- 1 = SQL Server Log, 2 = SQL Agent Log

    -- Ereignistyp-spezifische Suchbegriffe festlegen
    IF @eventType = 'login'
    BEGIN
        SET @search1 = 'login';
        IF @status = 'failed' SET @search2 = 'failed';
        ELSE IF @status = 'success' SET @search2 = 'successfully';
        -- sonst kein zweiter Suchbegriff
    END
    ELSE IF @eventType = 'backup'
    BEGIN
        SET @search1 = 'backup';
        IF @status = 'failed' SET @search2 = 'failed';
        ELSE IF @status = 'success' SET @search2 = 'successfully';
    END
    ELSE IF @eventType = 'spn'
    BEGIN
        SET @search1 = 'spn';
        SET @search2 = NULL;   -- SPN-Meldungen haben keinen standardisierten Status
    END
    ELSE IF @eventType = 'all'
    BEGIN
        SET @search1 = @searchText1;
        SET @search2 = @searchText2;
    END
    ELSE
    BEGIN
        RAISERROR('Ungültiger @eventType. Erlaubt: login, backup, spn, all', 16, 1);
        RETURN;
    END

    -- Temporäre Tabelle für die Logausgabe
    CREATE TABLE #logOutput
    (
        LogDate     DATETIME,
        ProcessInfo NVARCHAR(50),
        LogText     NVARCHAR(MAX)
    );

    BEGIN TRY
        INSERT INTO #logOutput
        EXEC sys.sp_readerrorlog 
            @logArchiveNo,
            @logType,
            @search1,
            @search2,
            NULL,           -- @startDate (wird ignoriert, wir filtern nachher)
            NULL,           -- @endDate
            N'desc';        -- Sortierung absteigend (neueste zuerst)
    END TRY
    BEGIN CATCH
        DROP TABLE #logOutput;
        THROW;
    END CATCH

    -- Datumsfilter anwenden (falls angegeben)
    IF @startDate IS NOT NULL
        DELETE FROM #logOutput WHERE LogDate < @startDate;
    IF @endDate IS NOT NULL
        DELETE FROM #logOutput WHERE LogDate > @endDate;

    -- Ergebnis ausgeben
    SELECT 
        LogDate,
        ProcessInfo,
        LogText
    FROM #logOutput
    ORDER BY LogDate DESC;

    DROP TABLE #logOutput;
END;
GO

 

 

Beispiele für die Verwendung

1. Fehlgeschlagene Logins der letzten 7 Tage anzeigen

EXEC dbo.sp_ReadErrorLogFiltered
    @eventType = 'login',
    @status = 'failed',
    @startDate = DATEADD(day, -7, GETDATE());

2. Alle erfolgreichen Backups des aktuellen Monats

EXEC dbo.sp_ReadErrorLogFiltered
    @eventType = 'backup',
    @status = 'success',
    @startDate = '2025-04-01',
    @endDate = '2025-04-30';

3. SPN-bezogene Meldungen (egal ob Fehler oder Info)

EXEC dbo.sp_ReadErrorLogFiltered @eventType = 'spn';

4. Eigene freie Suche im Fehlerlog (z. B. nach „deadlock“)

EXEC dbo.sp_ReadErrorLogFiltered
    @eventType = 'all',
    @searchText1 = 'deadlock',
    @startDate = '2025-04-01';

5. Komplettes aktuelles Log 

EXEC dbo.sp_ReadErrorLogFiltered @eventType = 'all';

6. Älteres Log-Archiv durchsuchen (z. B. Archiv Nr. 2)

EXEC dbo.sp_ReadErrorLogFiltered
    @eventType = 'backup',
    @status = 'failed',
    @logArchiveNo = 2;

 

 

Cookies user preferences
We use cookies to ensure you to get the best experience on our website. If you decline the use of cookies, this website may not function as expected.
Accept all
Decline all
Analytics
Tools used to analyze the data to measure the effectiveness of a website and to understand how it works.
Google Analytics
Advertisement
If you accept, the ads on the page will be adapted to your preferences.
Google Ad
Save