TSQL-如果备份数据少于指定,则运行存储过程

时间:2014-08-18 14:00:37

标签: sql sql-server tsql stored-procedures

一些背景故事。我们有一个包含测试数据的测试环境。每天晚上,作业从生产中复制数据库备份并将其还原以进行测试。不常见的是,我们将拥有一个数据库备份,这个数据库备份可能会在有应用程序打开的情况下持续几天。

我正在寻找运行将数据插入表的存储过程,但只有当最后一个数据库备份时间少于几天时,如果不是,则向用户发送一封电子邮件。我希望这可以用作SQL Server中的预定作业。这是我在网上找到的一个查询,并根据我们的喜好对其进行了编辑:

WITH RecentBackup
AS
(  
SELECT sdb.Name AS DatabaseName,
bus.backup_finish_date AS LastBackUpTime,
ROW_NUMBER() OVER (PARTITION BY sdb.Name ORDER BY bus.backup_finish_date DESC) AS     1RowNum
FROM sys.sysdatabases sdb
LEFT OUTER JOIN msdb.dbo.backupset bus ON bus.database_name = sdb.name
GROUP BY sdb.Name, bus.backup_finish_date
)

SELECT DatabaseName, LastBackUpTime
      ,CASE
       WHEN CAST(LastBackUpTime AS DATE) >= GETDATE() - 3 THEN 1 ELSE 0
      END AS GoodBackup
  FROM RecentBackup 
 WHERE RowNum = 1

如果所有行显示GoodBackup = 1,我希望存储过程运行,如果任何行上的GoodBackup = 0,那么我希望作业失败。

以下是一些示例数据:

DatabaseName    LastBackUpTime              GoodBackup
Database1       2014-08-16 22:00:45.000     1
Database2       2014-08-14 22:30:20.000     0
Database3       2014-08-16 21:15:07.000     1
Database4       2014-08-16 21:25:03.000     1
Database5       2014-08-16 21:30:54.000     1
Database6       2014-08-16 21:00:03.000     1

2 个答案:

答案 0 :(得分:2)

将查询结果存储在#results中,然后

IF ( EXISTS(SELECT * FROM #results WHERE GoodBackup = 0) )
     EXEC sp_my_stored_proc
ELSE
     RAISEERROR('Old backup', 11, 0)

您还可以将代码集成到模式中,而不是依赖临时表。

答案 1 :(得分:1)

我可能过度简化了这个但是会有类似的工作吗?

IF EXISTS (SELECT GoodBackUp FROM
                RecentBackup
                WHERE GoodBackUp = 1
            )

BEGIN
EXEC usp_Success_proc
END
ELSE
BEGIN
EXEC usp_Issue_email
END