2017-02-14 122 views
2

我试图获取缺失完整备份的列表,但我需要此列表来显示哪个用户执行了最新的备份。问题是,我不知道如何过滤,因为我查询的是为每个用户返回所有最后的备份。SQL Server缺少备份

例子:

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 

当我只需要它从最新的日期返回ID和结果。理想的结果是这样的:

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然后,也许你应该用反映你正面临的实际问题的数据来更新你的问题。我的查询符合您向我们显示的测试数据。 –