2010-01-21 68 views
3

对于某个人来说这可能很容易,但我还没有找到简单的解决方案。仅当备份成功时才删除数据库

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

我有一个脚本,将做备份和删除如下:

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

ALTER DATABASE [databaseName] 
    SET SINGLE_USER 
    WITH ROLLBACK IMMEDIATE 

DROP DATABASE [databaseName] 

,但我担心,即使备份失败,DROP会发生。

如何更改脚本,如果BACKUP失败,DROP不会发生?

在此先感谢!

回答

5

如果您的SQL Server版本是2005或更高版本,则可以用try 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 
+0

@kenJ - 我以前没有看到SQL中的try catch块,但我真的很喜欢它。感谢你的回答! – 2010-01-22 00:17:04

2

您可以捕获与SQL服务器错误变量发生的任何错误代码,如下所示。零表示没有发生错误。需要注意的是该值设置在每次执行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为您提供了所有已知错误代码和消息的列表,如果您想进一步了解。

+0

@Joe - 非常感谢您的快速和准确的反应!你有评论是否反对使用try ... catch块? – 2010-01-22 00:15:04

+0

他们执行相同的基本任务,但如果您使用SQL Server 2005及更高版本,则TRY/CATCH语句通常具有一些优势。你仍然可以通过函数error_message()获得错误细节,所以如果你有选择,我会坚持使用TRY/CATCH作为规则。 – 2010-01-22 01:09:33