3

これは誰かにとっては簡単なことかもしれませんが、私はまだ簡単な解決策を見つけていません。

現在、より大きなプロセスを自動化しています。1つのステップは、データベースを最初から再作成する前に、データベースをバックアップしてから削除することです。

次のようにバックアップとドロップを行うスクリプトがあります。

Use [Master]
BACKUP DATABASE [databaseName]
  TO DISK='D:\Backup\databaseName\20100122.bak'

ALTER DATABASE [databaseName] 
    SET SINGLE_USER 
    WITH ROLLBACK IMMEDIATE

DROP DATABASE [databaseName] 

しかし、バックアップが失敗してもドロップが発生するのではないかと心配しています。

スクリプトを変更して、バックアップが失敗した場合にドロップが発生しないようにするにはどうすればよいですか?

前もって感謝します!

4

2 に答える 2

5

SQL Serverのバージョンが2005以降の場合は、ステートメントをtrycatchでラップできます。バックアップが失敗した場合、データベースを削除せずにキャッチにジャンプします...

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 に答える