2017-02-14 3 views
2

Ich versuche, eine Liste der fehlenden vollständigen Sicherungen zu erhalten, aber ich brauche diese Liste, um mir zu zeigen, welcher Benutzer die letzte Sicherung durchgeführt hat. Das Problem ist, ich weiß nicht, wie man das filtert, da das, was ich abfrage, alle letzten Backups für jeden Benutzer zurückgibt.SQL Server fehlende Sicherungen

Beispiel:

SELECT 
    @@SERVERNAME AS ServerName, 
    d.[name] AS DatabaseName, 
    b.user_name as UserName, 
    'Backups Not Performed Recently' AS Finding, 
    'Last backed up: ' + COALESCE(CAST(MAX(b.backup_finish_date) AS VARCHAR(25)),'never') AS Details 
FROM  
    master.sys.databases d 
LEFT OUTER JOIN 
    msdb.dbo.backupset b ON d.name COLLATE SQL_Latin1_General_CP1_CI_AS = b.database_name COLLATE SQL_Latin1_General_CP1_CI_AS 
         AND b.type = 'D' 
         AND b.server_name = SERVERPROPERTY('ServerName') /*Backupset ran on current server */ 
WHERE 
    d.database_id <> 2 /* Bonus points if you know what that means */ 
    AND d.state NOT IN(1, 6, 10) /* Not currently offline or restoring, like log shipping databases */ 
    AND d.is_in_standby = 0 /* Not a log shipping target database */ 
    AND d.source_database_id IS NULL /* Excludes database snapshots */ 
GROUP BY 
    d.name, b.user_name 
HAVING 
    MAX(b.backup_finish_date) <= DATEADD(dd, -7, GETDATE()) 
    OR MAX(b.backup_finish_date) IS NULL 

Returns:

ServerName DatabaseName UserName Finding Details 
ServerA  DatabaseA  Userxyz  Backups Not Performed Recently Last backed up: Nov 30 2016 2:45PM 
ServerA  DatabaseA  Userabc  Backups Not Performed Recently Last backed up: Nov 24 2016 12:36PM 
ServerA  DatabaseA  Userdef  Backups Not Performed Recently Last backed up: Feb 5 2017 1:26AM 

Als ich es brauchen nur die ID und die Ergebnisse aus dem aktuellen Datum zurückzubringen. Gewünschte Ergebnis würde wie folgt aussehen:

ServerName DatabaseName UserName Finding Details 
ServerA  DatabaseA  Userxyz  Backups Not Performed Recently Last backed up: Feb 5 2017 1:26AM 

Antwort

1

Wir hier Zeilennummer können Sie die aktuellste Sicherung Eintrag für jede Datenbank wählen:

WITH cte AS (
    SELECT @@SERVERNAME AS ServerName, 
      d.[name] AS DatabaseName, 
      b.user_name as UserName, 
      'Backups Not Performed Recently' AS Finding, 
      'Last backed up: ' + COALESCE(CAST(MAX(b.backup_finish_date) AS VARCHAR(25)),'never') AS Details, 
      ROW_NUMBER() OVER (PARTITION BY d.[name] ORDER BY MAX(b.backup_finish_date) DESC) rn 
    FROM master.sys.databases d 
    LEFT OUTER JOIN msdb.dbo.backupset b 
     ON d.name COLLATE SQL_Latin1_General_CP1_CI_AS = b.database_name COLLATE SQL_Latin1_General_CP1_CI_AS AND 
      b.type = 'D' AND 
      b.server_name = SERVERPROPERTY('ServerName') 
    WHERE d.database_id <> 2 AND 
      d.state NOT IN(1, 6, 10) AND 
      d.is_in_standby = 0 AND 
      d.source_database_id IS NULL 
    GROUP BY d.name, 
      b.user_name 
    HAVING MAX(b.backup_finish_date) <= DATEADD(dd, -7, GETDATE()) OR 
      MAX(b.backup_finish_date) IS NULL 
) 
SELECT * 
FROM cte t 
WHERE t.rn = 1 
+0

Ihre Lösung ist interessant, aber ich bin nach wie vor Probleme auf Server, die die Abfrage nichts zurückgeben sollte – carolcastelli

+0

@carolcastelli Dann sollten Sie vielleicht Ihre Frage mit Daten aktualisieren, die das eigentliche Problem widerspiegelt, mit dem Sie konfrontiert sind. Meine Anfrage erfüllt die Testdaten, die Sie uns gezeigt haben. –

Verwandte Themen