对于某些人来说,这可能很容易,但我还没有找到一个简单的解决方案。
我现在正在自动化一个更大的进程,一步是备份然后删除数据库,然后从头开始重新创建它。
我有一个脚本可以进行备份和删除,如下所示:
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不会发生?
提前致谢!
答案 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
会为您提供所有已知错误代码和消息的列表。