2017-02-14 2 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 그런 다음 실제 문제가 반영된 데이터로 질문을 업데이트해야합니다. 내 쿼리가 우리에게 보여준 테스트 데이터를 만족시킵니다. –