CTOCIO IT专家网

天极传媒 比特网 | 天极网 | IT专家网 | IT商网 | 52PK游戏网 | 手机天极 | IT分众 |
IT专家网搜索

数据库 | Oracle | DB2 | SQL Server | MySQL | 商业智能 | BI | DBA | Sybase| SQL Server 2008

您现在的位置: IT专家网 > 数据库子站 > 数据库技巧

SQL语句实现移动数据库文件

作者: OK_008 ,  出处:blog, 责任编辑: 王晓晨, 
2008-07-22 10:33
  移动数据库物理文件方法:先分离数据库,再移动数据库文件,然后再附加新数据库文件。

  移动数据库物理文件方法:先分离数据库,再移动数据库文件,然后再附加新数据库文件。

     方法:

Use master 
  Go 
  If Object_id('sp_MoveDB','P') Is Not null 
  Drop Proc sp_MoveDB 
  Go 
  Create Proc sp_MoveDB 
  ( 
  @DataBase sysname, 
  @PathTo nvarchar(1024) 
  ) 
  As 
  Declare 
  @Sql nvarchar(max), 
  @AttachDatabase nvarchar(max), 
  @Error nvarchar(1024), 
  @Dir varchar(1024), 
  @ok int 
  If db_id(@DataBase) Is null 
  Begin 
  Set @Error='错误的数据库名: '+@DataBase 
  Raiserror 50001 @Error 
  Return 
  End 
  Set @Dir='Dir '+@PathTo 
  Exec @ok=xp_cmdshell @Dir,No_output 
  If @ok<>0 
  Begin 
  Set @Error='错误的文件路径: '+@PathTo 
  Raiserror 50001 @Error 
  Return 
  End 
  Select @DataBase=name From sys.databases Where name=@DataBase 
  Print '数据库: '+@DataBase+Char(13)+Char(10)+'正在移动数据库文件,请稍候 ' 
  Select @Sql=Isnull(@Sql+Char(13)+Char(10),'')+'Kill '+Rtrim(spid) From sys.sysprocesses Where db_name(dbid)=@DataBase 
  Exec (@Sql) 
  Set @Sql=null 
  Select 
  @Sql=Isnull(@Sql+Char(13)+Char(10),'')+'Exec xp_cmdshell ''Move '+physical_name+Char(32)+@PathTo+Right(physical_name,Charindex('\',Reverse(physical_name)))+''',No_output', 
  @AttachDatabase=Isnull(@AttachDatabase+',','Create Database '+Quotename(@DataBase)+' On ')+'(Filename='''+@PathTo+Right(physical_name,Charindex('\',Reverse(physical_name)))+''')' 
  From sys.master_files Where database_id=db_id(@DataBase) 
  Set @Sql='Exec sp_detach_db '+Quotename(@DataBase)+Char(13)+Char(10)+@Sql+Char(13)+Char(10)+@AttachDatabase+' For Attach' 
  Exec(@Sql) 
  If @@Error=0 
  Print '完成移动数据库文件.' 
  Else 
  Print '移动数据库文件失败.' 
  test: 
  Exec sp_MoveDB 'test1' ,'F:\SQL2005\test' 
  /*数据库: test1 
  正在移动数据库文件,请稍候... ...
  完成移动数据库文件.
     */ 
  --移动所有的用户数据库文件如下: 
  Declare @sql nvarchar(max) 
  Declare @Path nvarchar(1024) 
  Set @Path='F:\SQL2005\test' 
  Select @sql=Isnull(@sql+Char(13)+Char(10),'')+'Exec sp_MoveDB '+Quotename(name) +','''+@Path+'''' 
  From sys.databases where name Not in('master','model','msdb','tempdb','ReportServer','ReportServerTempDB') 
  Exec (@sql) 
  /*
 数据库: deadlocktest 
 正在移动数据库文件,请稍候 
  完成移动数据库文件.
  数据库: test1
  正在移动数据库文件,请稍候 
  完成移动数据库文件.
  */

    

网友评论

笔名 
请您注意:遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。    IT专家网友拥有管理笔名和留言的一切权利。
  • 周排行榜
  • 月排行榜

邮件订阅


    
天极服务 | 关于我们 | 网站律师 | 加入我们 | 联系我们 | 广告业务 | 友情链接 | 我要挑错
All Rights Reserved, Copyright 2004-2008, Ctocio.com.cn
渝ICP证B2-20030003号 如有意见请与我们联系 powered by 天极内容管理平台CMS4i