如果数据库还原失败,如何回滚所有内容(t-sql)? [英] How to rollback everything(t-sql) if restoring of DB is failed?

查看:78
本文介绍了如果数据库还原失败,如何回滚所有内容(t-sql)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我将新记录插入到"Project"表中,然后还原数据库并向该数据库中插入一些行.
我需要以下内容:

1.如果将记录插入到"Project"表中,但是还原数据库失败,那么我想回滚所有内容
2.如果插入记录失败,我也想回滚所有内容

为此,我正在使用事务,但出现以下错误"RESTORE DATABASE异常终止".

以下是我用于此目的的脚本.

有什么问题以及如何解决?


-------------------------------------------------- -------------------------
CreateProject
-------------------------------------------------- -------------------------

I insert new record to `Project` table and after that I restore DB and inserting some row to that DB.
I want the following:

1. If record was inserted to `Project` table but restoring DB is failed, so I want to rollback everything
2. If inserting record failed I also want to rollback everything

To achieve this I''m using transaction, but I get the following error `RESTORE DATABASE is terminating abnormally.`

Below are the scripts I use for this purpose.

What is the problem and how to fix it?


---------------------------------------------------------------------------
CreateProject
---------------------------------------------------------------------------

ALTER PROCEDURE CreateProject 
    	@name nvarchar(50)    	
    AS
    SET XACT_ABORT, NOCOUNT ON    
    DECLARE @starttrancount int
    
    BEGIN TRY
    	SELECT @starttrancount = @@TRANCOUNT
    
        IF @starttrancount = 0
            BEGIN TRANSACTION                               		
    		DECLARE @sql nvarchar(MAX)   

		DECLARE @projId int
		DECLARE @dbName nvarchar(128)

		-- ======================================================================
		--	Create new project
		-- ======================================================================
		INSERT INTO Project(Name)
		VALUES(@name)
		-- ======================================================================
		--	Generate dbname that will be used to restore db with that name
		-- ======================================================================
		SET @projId = SCOPE_IDENTITY()
		SET @dbName = ''Site'' + CONVERT(nvarchar(20), @projId)
		-- ======================================================================
		--	Create db with @dbname
		-- ======================================================================
		EXEC CreateDB @dbName


		--Insert some records to tables in created DB
                ...
                ...
    		
    	IF @starttrancount = 0 
    		COMMIT TRANSACTION
    END TRY
    BEGIN CATCH	
    	DECLARE @ErrorMessage NVARCHAR(4000)
    	DECLARE @ErrorState INT
    	DECLARE @ErrorSeverity INT
    
    	IF XACT_STATE() <> 0 AND @starttrancount = 0     
            ROLLBACK TRANSACTION    
                      
    	SELECT 
    		@ErrorMessage = ''Source:CopyPage\r\t'' + ERROR_MESSAGE(),
    		@ErrorSeverity = ERROR_SEVERITY(),
    		@ErrorState = ERROR_STATE();
    			
    		RAISERROR (@ErrorMessage,
    				   @ErrorSeverity,
    				   @ErrorState);
    END CATCH	


-------------------------------------------------- -------------------------
CreateDB
-------------------------------------------------- -------------------------


---------------------------------------------------------------------------
CreateDB
---------------------------------------------------------------------------

ALTER PROCEDURE CreateDB
    @newDbname nvarchar(128),
    @restoreFrom nvarchar(MAX) = ''C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Backup\Site.bak''
AS
SET XACT_ABORT, NOCOUNT ON


BEGIN TRY

    DECLARE @newMdfPath nvarchar(MAX) = ''C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\'' + @newDbname + ''.mdf''
    DECLARE @newLdfPath nvarchar(MAX) = ''C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\'' + @newDbname + ''_log.ldf''

    RESTORE DATABASE @newDbname FROM DISK=@restoreFrom
    WITH RECOVERY,
    MOVE ''Site''  TO @newMdfPath,
    MOVE ''Site_log'' TO @newLdfPath

END TRY
BEGIN CATCH
    DECLARE @ErrorMessage NVARCHAR(4000)
    DECLARE @ErrorState INT
    DECLARE @ErrorSeverity INT

    SELECT
        @ErrorMessage = ''Source:PrepareNewSite\r\t'' + ERROR_MESSAGE(),
        @ErrorSeverity = ERROR_SEVERITY(),
        @ErrorState = ERROR_STATE();

        RAISERROR (@ErrorMessage,
                   @ErrorSeverity,
                   @ErrorState);
END CATCH

推荐答案

在CreateProject中进行更改将解决该错误.

在调用
之前,使用Commit transaction进行交易 EXEC CreateDB @dbName

并在调用SP后再次使用Begin事务

"RESTORE DATABASE异常终止."错误得到解决.
Change in CreateProject will resolve the error.

use Commit transaction the transaction before you call the
EXEC CreateDB @dbName

and again use begin transaction after the SP is called

"RESTORE DATABASE is terminating abnormally." error gets resolved.


这篇关于如果数据库还原失败,如何回滚所有内容(t-sql)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆