2017-02-14 2 views
2

Я пытаюсь получить список отсутствующих полных резервных копий, но мне нужен этот список, чтобы показать мне, какой пользователь выполнил последнюю резервную копию. Проблема в том, что я не знаю, как это фильтровать, поскольку то, что я запрашиваю, возвращает все последние резервные копии для каждого пользователя.SQL Server Missing Backups

Пример:

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 

Возвращает:

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 

Когда мне просто нужно его вернуть идентификатор и результаты от последней даты. Желаемый результат будет выглядеть следующим образом:

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

ответ

1

Мы можем использовать номер строки здесь, чтобы выбрать самую последнюю запись резервной копии для каждой базы данных:

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

ваше решение интересно, но я по-прежнему сталкиваются с проблемами на серверы, в которых запрос ничего не должен возвращать – carolcastelli

+0

@carolcastelli Тогда, возможно, вам следует обновить свой вопрос данными, которые отражают фактическую проблему, с которой вы сталкиваетесь. Мой запрос удовлетворяет тестовым данным, которые вы нам показали. –