最近在写一个类是财务系统中套帐的系统。每年或者每月的的数据存储在不同的数据库中,以方便备份,也防止了历史数据膨胀。虽然存储的数据不同但格式都是一样。数据库中的对象都是相同的。下面就是该系统中的一个存储过程。此过程中对错误处理不够详细,望有看法有想法的朋友给予指出。 我所理解的数据库恢复,其实就是使用备份文件重新创建数据库的过程。 /***********功能:使用备份文件创建数据******************************/ create procedure p_CreateDB @bakFilePath varchar(200)= null,--例如d:\xxx\的格式 @bakFileName varchar(30)=null,--备份文件的名字 @dbName varchar(20)=null,---要创建数据库的名字 @dbPath varchar(200)=null--例如:d:\test\ as declare @sql varchar(1000),@bakFileFullPath varchar(250),@ip varchar(20) declare @baseDbPath varchar(100),@i int --存储基本数据库中反向的''''\''''的位置 SET CONCAT_NULL_YIELDS_NULL off -------------------获得新数据的路径------------------- if (@dbPath is null) begin if exists(select * from master..sysdatabases where name=''''schlBasicDb'''') --获取基本数据库的路径 select @baseDbPath=fileName from master..sysdatabases where name=''''schlBasicDb'''' else select @baseDbPath=fileName from master..sysdatabases where name=''''master'''' set @i=charindex(''''\'''',reverse(@baseDbPath))-1 set @baseDbPath=substring(@baseDbPath,1,len(@baseDbPath)-@i) --获取基本数据库的路径 end else set @baseDbPath=@dbPath ------------------获取备份文件的完整网络路径(路径+文件名)当然服务器要有操作备份文件所在机器的权限---------------- set @ip=HOST_NAME() set @bakFilePath=replace(@bakFilePath,'''':'''',''''$''''); set @bakFilePath=''''\\''''+@ip+''''\''''+@bakFilePath; set @bakFileFullPath=@bakFilePath+@bakFileName; ------------------创建临时表存储备份文件的文件列表信息-------------------------------------- -----载至http://dev.csdn.net/article/28/28463.shtm --------------------------------------- -----SQL SERVER2000数据库备份和恢复存储过程(加强版本)--选择自 aierong 的 Blog --------------- create table #tmp( fileId int identity(1,1),/*自增型,将来用来作为文件名的一部分*/ LogicalName nvarchar(128), /*文件的逻辑名称*/ PhysicalName nvarchar(260) , /*文件的物理名称或操作系统名称*/ Type char(1), /*数据文件 (D) 或日志文件 (L)*/ FileGroupName nvarchar(128), /*包含文件的文件组名称*/ [Size] numeric(20,0), /*当前大小(以字节为单位)*/ [MaxSize] numeric(20,0) /*允许的最大大小(以字节为单位)*/ ) insert into #tmp(LogicalName,PhysicalName,Type,FileGroupName,[size],[maxSize]) exec(''''RESTORE filelistonly from disk=''''''''''''+@bakFileFullPath+'''''''''''''''') -------从tmp中获取自己所要的数据 select fileId,logicalName,type into #tmp2 from #tmp ------------声明游标,对获取的数据作循环处理---------------------------- declare @logicalName sysname,@type varchar(10),@fileId varchar(10) declare cur_bakupFile cursor for select fileId,logicalName,Type from #tmp2 ---------此时用@i来存储要还原的数据库的数据文件的个数,如过是第一个文件即*.mdf,---------------------- ---------因为主文件是一个数据库的起点所以最好不要乱后缀改名----------------------------------------- set @i=0 set @sql='''' use master restore database ''''+@dbName+'''' from disk =''''''''''''+@bakFileFullPath+''''''''''''''''+'''' with '''' ---------打开游标-------------------- open cur_bakupFile fetch next from cur_bakupFile into @fileid,@logicalName,@type while (@@fetch_status=0) begin if (upper(@type)=''''D'''') begin if (@i=0) begin set @sql=@sql+'''' move ''''''''''''+@logicalName+'''''''''''' to ''''''''''''+@baseDbPath+@dbName+''''.mdf'''''''',''''; set @i=@i+1; end else begin set @sql=@sql+'''' move ''''''''''''+@logicalName+'''''''''''' to ''''''''''''+@baseDbPath+@dbName+@fileId+''''_Data.ndf'''''''','''' end end else if(upper(@type)=''''L'''') begin set @sql=@sql+'''' move ''''''''''''+@logicalName+'''''''''''' to ''''''''''''+@baseDbPath+@dbName+@fileId+''''_Log.ldf'''''''','''' end; fetch next from cur_bakupFile into @fileid,@logicalName,@type end deallocate cur_bakupFile ------replace,强制替换数据库文件,具体看sql帮助了---------------------------------- set @sql=@sql+'''' replace'''' SET CONCAT_NULL_YIELDS_NULL on --print @sql exec(@sql) if (@@error=0) return 100 else return -100 ----以下是测试,各位朋友注意文件路径中不要少了''''\'''',例如:将''''e:\test\'''' 写成''''e:\test''''了,
---其实不难为大家,只是抛砖引玉而已 p_createDb ''''e:\'''',''''testtest2.bak'''',''''test'''',''''e:\test\''''
言语不准确之处,望各位网友指出,谢谢!
[办公软件]在sybase中插入图片、PDF、文本文件 [办公软件]安装Sybase ASE [办公软件]linux指令大全(完整篇) [办公软件]Linux新手入门常用命令大全 [办公软件]在RedHat Linux 9里安装gaim0.80 [办公软件]浅谈Linux 下Java 1.5 汉字方块问题解决方法 [办公软件]Linux程序员必读:中文化与GB18030标准 [办公软件]linux指令大全 [办公软件]制作Linux启动盘的四种方法 [办公软件]Linux文件系统的反删除方法
|