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] 

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

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

提前致谢!

4

2 回答 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
于 2010-01-22T00:05:37.057 回答
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如果您想进一步了解,会为您提供所有已知错误代码和消息的列表。

于 2010-01-22T00:04:35.577 回答