Удалить базу данных только в случае успешного резервного копирования - PullRequest
3 голосов
/ 22 января 2010

Это может быть легко для кого-то, но я еще не нашел простого решения.

В настоящее время я автоматизирую более крупный процесс, и одним из шагов является резервное копирование, а затем удаление базы данных перед ее воссозданием с нуля.

У меня есть скрипт, который будет выполнять резервное копирование следующим образом:

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 не удалась.

Как я могу изменить скрипт, чтобы в случае сбоя BACKUP не происходило DROP?

Заранее спасибо!

Ответы [ 2 ]

5 голосов
/ 22 января 2010

Если ваша версия SQL Server 2005 или более поздняя, ​​вы можете заключить свои выражения в попытку. Если резервное копирование завершится неудачно, оно перейдет к улову, не удаляя базу данных ...

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
2 голосов
/ 22 января 2010

Вы можете перехватить любые коды ошибок, которые происходят с переменной ошибки сервера 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 дает вам список всех известных кодов ошибок и сообщений, если вы хотите продолжить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...