2017-02-14 20 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次に、あなたが直面している実際の問題を反映したデータで質問を更新する必要があります。私の質問はあなたが私たちに示したテストデータを満たしています。 –

関連する問題