强制还原已存在的数据库

USE master
GO
IF EXISTS (SELECT * FROM sysobjects
       WHERE id = object_id(N'[dbo].[spForceRestoreDB]')
      AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
DROP PROCEDURE [dbo].[spForceRestoreDB]
GO
SET QUOTED_IDENTIFIER  OFF    SET ANSI_NULLS  ON
GO

/*
   --强制还原已存在的数据库,基本原理是Kill掉数据库的所有会话
   --原贴在http://www.sqlservercentral.com/scripts/contributions/827.asp
   --在此基础上添加了with move选项,如果不提供新文件物理位置,则默认为SQL Server
   --安装目录

   --调用;
   --use master
   --go
   --exec master..spForceRestoreDB 'test2'
                                 ,'c:/test.bak'
                                 ,'c:/db/test_data.mdf'
                                 ,'c:/db/test_log.mdf'

   --vivianfdlpw 2005.9 引用请保留此信息
*/

CREATE PROCEDURE spForceRestoreDB
    @DatabaseName varchar(50),            --要恢复的数据库名
    @BackupFile varchar(255),             --备份文件路径
    @NewDataFilePath  varchar(255)=null,  --新物理文件位置
    @NewLogFilePath  varchar(255)=null    --新日志文件位置
WITH ENCRYPTION
AS
BEGIN
SET NOCOUNT ON
 DECLARE @exists int

 IF NOT EXISTS( select name from master.dbo.sysdatabases WHERE name = @DatabaseName)
 BEGIN
 PRINT '  Database ' + @DatabaseName + ' not found '
 PRINT '  Enter valid Datbase name'
 RETURN
 END

 EXEC master.dbo.xp_fileexist @BackupFile , @exists OUTPUT
 if (@exists = 0)
 BEGIN
 PRINT '  File ' + @BackupFile + ' Does bot Exist'
 PRINT '  Database cannot be restored'
 PRINT '  Enter the valid Backup File'
 RETURN
 END

     -- Cursor for all the spids running against this database
 DECLARE SysProc CURSOR LOCAL FORWARD_ONLY DYNAMIC READ_ONLY FOR
 SELECT spid
 FROM master.dbo.sysprocesses
 WHERE dbid = ( SELECT dbid FROM master.dbo.sysdatabases
     WHERE name = @DatabaseName)
   
 DECLARE @SysProcId smallint
 
 -- Opens the Cursor
 OPEN SysProc
 
 -- Fetch the Process ID into the cursor
  FETCH NEXT FROM SysProc INTO @SysProcId
 
 DECLARE @KillStatement char(30)
 
 WHILE @@FETCH_STATUS = 0
 BEGIN
  SET @KillStatement = 'KILL ' + CAST(@SysProcId AS char(30))
 
  -- Kills the processes running against the database
  EXEC (@KillStatement)
 
  FETCH NEXT FROM SysProc INTO @SysProcId
 END
 
 WAITFOR DELAY '000:00:01'

        create table #
       (LogicalName varchar(255),
        PhysicalName varchar(255),
        Type varchar(20),
        FileGroupName varchar(255),
        Size varchar(20),
        MaxSize varchar(20) )
        declare @cmd varchar(200)
                ,@DataLogicName varchar(20)
                ,@logLogicName varchar(20)
        select @cmd = 'RESTORE FILELISTONLY FROM disk = '''+ @BackupFile + ''''
        insert # exec(@cmd)

        select @DataLogicName=LogicalName from # where Type='D'
        select @logLogicName=LogicalName from # where Type='L'
        drop table #

        if @NewDataFilePath is null
        begin
           select @NewDataFilePath=replace(filename,'master.mdf','') from master..sysdatabases
           where dbid=db_id('master')
           select @NewDataFilePath=@NewDataFilePath+@DatabaseName+'_Data.mdf'
        end

        if @NewLogFilePath is null
        begin
           select @NewLogFilePath=replace(filename,'master.mdf','') from master..sysdatabases
           where dbid=db_id('master')
           select @NewLogFilePath=@NewLogFilePath+@DatabaseName+'_Log.ldf'
        end


 DECLARE @strSql varchar(2000)

 SET @strSql = 'RESTORE DATABASE '
 SET @strSql = @strSql + QUOTENAME(@DatabaseName) 
 SET @strSql = @strSql + 'FROM  DISK = N'+ '''' + @BackupFile + ''''
 SET @strSql = @strSql + ' WITH  FILE = 1,  NOUNLOAD ,  STATS = 10,  RECOVERY ,  REPLACE'
        SET @strSql = @strSql + ',Move '''+@DataLogicName+''' to '''+@NewDataFilePath+''''
        SET @strSql = @strSql + ',Move '''+@logLogicName+''' to '''+@NewLogFilePath+''''

 --PRINT @strSql
 -- Restore the Database
 EXEC (@strSql)

SET NOCOUNT OFF
END
GO

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值