只有在备份成功的情况下才能删除数据库。

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] 

但我担心,即使备份失败,删除操作仍会发生。

我该如何修改脚本,以便在备份失败时不进行删除操作?

提前感谢!

2个回答

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

@kenJ - 我以前从未在SQL中看到过try catch块,但我真的很喜欢它。感谢您的答案! - Ev.

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会给您提供所有已知错误代码和消息的列表。


@Joe - 非常感谢您快速准确的回复!您对使用try...catch块有何评论? - Ev.
它们执行相同的基本任务,但如果您使用SQL Server 2005及更高版本,则TRY/CATCH语句通常具有一些优势。您仍然可以使用error_message()等函数获取错误详细信息,因此,如果有选择,我建议遵循TRY/CATCH作为规则。 - Joe Lloyd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接