2010-01-21 3 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 블록을 보지 못했지만 정말 좋아합니다. 답변 해주셔서 감사합니다! –

2

다음과 같이 SQL 서버 오류 변수와 함께 발생하는 오류 코드를 포착 할 수 있습니다. 0은 오류가 발생하지 않았 음을 나타냅니다. 값이 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 블록 사용에 대한 의견이 있으십니까? –

+0

이들은 동일한 기본 작업을 수행하지만 SQL Server 2005 이상을 사용하는 경우 TRY/CATCH 문은 일반적으로 몇 가지 이점이 있습니다. error_message()와 같은 함수를 사용하여 오류 정보를 얻을 수 있으므로 옵션이있는 경우 TRY/CATCH를 사용하는 것이 좋습니다. –

관련 문제