原文: 
  
  
    SQL远程恢复
  
  
    
      
       
   
    
    
      
       
   
    
    
      
       
   
    
    
      
       
   
    
    
      
       
   
    
    
      
       
   
    
  
  
 
      
     -- ============================================= 
   
    
    
      
     -- Author: dcrenl 
   
    
    
      
     -- Create date: 2013-9-5 14:08:35 
   
    
    
      
     -- Description: WEB服务器远程恢复数据库,远程恢复和远程备份的思路是一样的。 
   
    
    
      
     --不过恢复的时候有个释放连接的问题,所以多加了一个释放连接的存储过程。 
   
    
    
      
     --本来可以整合到一个里面但是考虑到其它地方也会用到释放连接所以把它单独拿出来了。 
   
    
    
      
     -- ============================================= 
   
    
    
      
     ALTER PROCEDURE [dbo].[RemoteRestore] 
   
    
    
      
     @DataDisk nvarchar(max),--需要在数据库服务器上映射的盘符 
   
    
    
      
     @WEBAddr nvarchar(max),--WEB服务器地址 
   
    
    
      
     @WEBDisk nvarchar(max),--WEB服务器共享目录(例如:D$ 或 C$\Windows) 
   
    
    
      
     @Password nvarchar(max),--WEB服务器密码 
   
    
    
      
     @UserName nvarchar(max),--WEB服务器用户名 
   
    
    
      
     @DataName nvarchar(max),--需要恢复的数据库名 
   
    
    
      
     @BackName nvarchar(max)--需要恢复的数据库名 
   
    
    
      
     AS 
   
    
    
      
     BEGIN 
   
    
    
      
     SET NOCOUNT ON; 
   
    
    
      
     --打开高级设置 
   
    
    
      
     exec sp_configure 'show advanced options',1 
   
    
    
      
     reconfigure 
   
    
    
      
     --开启xp_cmdshell 
   
    
    
      
     exec sp_configure 'xp_cmdshell',1 
   
    
    
      
     reconfigure 
   
    
    
      
     --将WEB服务器路径映射到数据库服务器 
   
    
    
      
     exec ('master..xp_cmdshell ''net use ' + @DataDisk + ': \\' + @WEBAddr + '\' + @WEBDisk + ' "' + @Password + '" /user:' + @WEBAddr + '\' + @UserName + '''') 
   
    
    
      
     --开始备份并复制到WEB服务器的映射路径 
   
    
    
      
     declare  @DataBaseName varchar(50) 
   
    
    
      
     set @DataBaseName = 'KF_Reg_' + @BackName 
   
    
    
      
     exec p_killspid @DataBaseName 
   
    
    
      
     exec ('RESTORE DATABASE [' + @DataName + '] FROM DISK = N'''+@DataDisk+':\' +@BackName+'.bak'' WITH REPLACE') 
   
    
    
      
     --关闭映射路径 
   
    
    
      
     exec ('master..xp_cmdshell ''net use ' + @DataDisk + ': /delete''') 
   
    
    
      
     --关闭xp_cmdshell 
   
    
    
      
     exec sp_configure 'xp_cmdshell',0 
   
    
    
      
     reconfigure 
   
    
    
      
     --关闭高级设置 
   
    
    
      
     exec sp_configure 'show advanced options',0 
   
    
    
      
     reconfigure 
   
    
    
      
     END 
   
    
    
      
     ------------------------------------------------------------------------------------------------- 
   
    
    
      
     --断开所有用户连接的存储过和 
   
    
    
      
     ALTER proc [dbo].[p_killspid] (@dbname varchar(100))    
   
    
    
      
     as    
   
    
    
      
     begin    
   
    
    
      
     declare @sql nvarchar(500)    
   
    
    
      
     declare @spid int    
   
    
    
      
     set @sql='declare getspid cursor for     
   
    
    
      
     select spid from master.sys.sysprocesses where dbid=db_id('''+@dbname+''')'    
   
    
    
      
     exec (@sql)    
   
    
    
      
     open getspid    
   
    
    
      
     fetch next from getspid into @spid    
   
    
    
      
     while @@fetch_status<>-1    
   
    
    
      
     begin    
   
    
    
      
     exec('kill '+@spid)    
   
    
    
      
     fetch next from getspid into @spid    
   
    
    
      
     end    
   
    
    
      
     close getspid    
   
    
    
      
     deallocate getspid    
   
    
    
      
     end    
   
    
    

