一些背景故事。我们有一个包含测试数据的测试环境。每天晚上,作业从生产中复制数据库备份并将其还原以进行测试。不常见的是,我们将拥有一个数据库备份,这个数据库备份可能会在有应用程序打开的情况下持续几天。
我正在寻找运行将数据插入表的存储过程,但只有当最后一个数据库备份时间少于几天时,如果不是,则向用户发送一封电子邮件。我希望这可以用作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
答案 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