CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  疑难问题

数据库恢复

楼主dengql()2005-11-09 16:19:41 在 MS-SQL Server / 疑难问题 提问

用Restore   database命令恢复已备份的数据库,必须是在没有任何用户使用、访问该数据库的条件下才能进行,但是如果是在C#的程序里怎么实现这种情况下的数据恢复? 问题点数:100、回复次数:2Top

1 楼vivianfdlpw()回复于 2005-11-09 16:30:43 得分 100

创建一个存储过程,然后C#执行此存储过程  
   
   
  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  
   
  Top

2 楼dengql()回复于 2005-11-14 11:46:16 得分 0

谢谢Top

相关问题

  • 恢复数据库
  • 恢复数据库
  • 数据库恢复
  • 恢复数据库
  • 数据库恢复
  • 数据库恢复?
  • 恢复数据库
  • 关于恢复数据库
  • 怎样恢复数据库??
  • 如何恢复数据库?

关键词

  • c#
  • 数据库
  • 文件
  • database
  • null
  • spforcerestoredb
  • backupfile
  • 恢复
  • exist
  • databasename

得分解答快速导航

  • 帖主:dengql
  • vivianfdlpw

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo