仅在备份成功时删除数据库

时间:2010-01-21 23:42:14

标签: sql sql-server database backup rollback

对于某些人来说,这可能很容易,但我还没有找到一个简单的解决方案。

我现在正在自动化一个更大的进程,一步是备份然后删除数据库,然后从头开始重新创建它。

我有一个脚本可以进行备份和删除,如下所示:

Use [Master]
BACKUP DATABASE [databaseName]
  TO DISK='D:\Backup\databaseName\20100122.bak'

ALTER DATABASE [databaseName] 
    SET SINGLE_USER 
    WITH ROLLBACK IMMEDIATE

DROP DATABASE [databaseName] 

但是我担心即使BACKUP失败也会发生DROP。

如何更改脚本,以便在BACKUP失败时,DROP不会发生?

提前致谢!

2 个答案:

答案 0 :(得分:5)

如果您的SQL Server版本是2005或更高版本,您可以使用try catch包装语句。如果备份失败,它将跳转到catch而不丢弃数据库...

Use [Master]
BEGIN TRY

BACKUP DATABASE [databaseName]
  TO DISK='D:\Backup\databaseName\20100122.bak'

ALTER DATABASE [databaseName] 
    SET SINGLE_USER 
    WITH ROLLBACK IMMEDIATE

DROP DATABASE [databaseName] 
END TRY
BEGIN CATCH
PRINT 'Unable to backup and drop database'
END CATCH

答案 1 :(得分:2)

您可以捕获SQL Server错误变量发生的任何错误代码,如下所示。零表示未发生错误。请注意,每次执行T-SQL语句时都会设置该值,因此您需要在备份后立即捕获它:

USE [Master]

DECLARE @errorCode int

BACKUP DATABASE [databaseName]
  TO DISK='D:\Backup\databaseName\20100122.bak'

SET @errorCode = @@ERROR

IF (@errorCode = 0)
BEGIN

    ALTER DATABASE [databaseName] 
        SET SINGLE_USER 
        WITH ROLLBACK IMMEDIATE

    DROP DATABASE [databaseName] 

END

这是我能想到的最简单的方法,并且允许您捕获已知的错误代码并在需要时以不同方式处理它们。如果您想进一步了解,SELECT * FROM master.sys.messages会为您提供所有已知错误代码和消息的列表。