《数据库备份与恢复的存储过程》由会员分享,可在线阅读,更多相关《数据库备份与恢复的存储过程(7页珍藏版)》请在金锄头文库上搜索。
1、精心整理 用心发布 精品文集荟萃- 1 -数据库备份与恢复的存储过程数据库备份与恢复的存储过程 - - 资料类别:-收集整理于网络-精心整理 用心发布 精品文集荟萃- 2 -if exists( select * from sysobjects where name=pr_backup_db and xtype=p ) begin drop proc pr_backup_db endgo/*备份数据库*/ create proc pr_backup_db flag varchar(10) out, backup_db_name varchar(128), filename varchar(10
2、00) -路径文件名字 as declare sql nvarchar(4000),par nvarchar(1000) select par=filename varchar(1000) select sql=BACKUP DATABASE +backup_db_name+ to disk=filename with init execute sp_executesql sql,par,filename select flag=ok goif exists( select * from sysobjects where name=fn_GetFilePath and xtype=fn ) b
3、egin drop function fn_GetFilePath end go/*创建函数,得到文件得路径*/ create function fn_GetFilePath(filename nvarchar(260)精心整理 用心发布 精品文集荟萃- 3 -returns nvarchar(260) as begin declare file_path nvarchar(260) declare filename_reverse nvarchar(260) select filename_reverse=reverse(filename) select file_path=substrin
4、g(filename,1,len(filename)+1- charindex(,filename_reverse) return file_path endgoif exists( select * from sysobjects where name=pr_restore_db and xtype=p ) begin drop proc pr_restore_db end gocreate proc pr_restore_db /*恢复数据库*/ flag varchar(20) out, /*过程运行的状态标志,是输入参数*/ restore_db_name nvarchar(128),
5、 /*要恢复的数据名字*/ filename nvarchar(260) /*备份文件存放的路径+备份文件名字*/ as declare proc_result tinyint /*返回系统存储过程 xp_cmdshell 运行结果*/ declare loop_time smallint /*循环次数*/ declare max_ids smallint /*tem 表的 ids 列最大数*/ declare file_bak_path nvarchar(260) /*原数据库存放路径*/ declare flag_file bit /*文件存放标志*/ declare master_pat
6、h nvarchar(260) /*数据库 master 文件路径*/ declare sql nvarchar(4000),par nvarchar(1000) declare sql_sub nvarchar(4000) declare sql_cmd nvarchar(4000) /*精心整理 用心发布 精品文集荟萃- 4 -判断参数filename 文件格式合法性,以防止用户输入类似 d: 或者 c:a 等非法文件名 参数filename 里面必须有并且不以结尾 */ if right(filename,1)0 begin select sql_cmd=dir +filename EX
7、EC proc_result = master.xp_cmdshell sql_cmd,no_output IF (proc_result0 begin drop table #tem end精心整理 用心发布 精品文集荟萃- 5 -select loop_time=1 select max_ids=max(ids) /*tem 表的 ids 列最大数*/ from tem while loop_time0) select loop_time=loop_time+1 else BREAK /*没有找到备份前数据文件原有存放路径,退出循环*/ end select master_path= if
8、 loop_timemax_ids select flag_file=1 /*备份前数据文件原有存放路径存在*/ else begin select flag_file=0 /*备份前数据文件原有存放路径不存在*/ select master_path=dbo.fn_GetFilePath(filename) from master.sysdatabases where name=master end select sql_sub= /*type=d是数据文件,type=l是日志文件 */ /*flag_file=1 时新的数据库文件还是存放在原来路径,否则存放路径和 master 数据库路
9、径一样*/ select sql_sub=sql_sub+move +LogicalName+ to +case type when d then case flag_file when 1 then File_path else master_path end when l then case flag_file when 1 then File_path else master_path end end +case type when d then restore_db_name+_+LogicalName+_data.mdf, when l then restore_db_name+_+
10、LogicalName+_log.ldf, end from tem select sql=RESTORE DATABASE db_name FROM DISK=filename with select sql=sql+sql_sub+replace精心整理 用心发布 精品文集荟萃- 6 -select par=db_name nvarchar(128),filename nvarchar(260) print sql execute sp_executesql sql,par,db_name=restore_db_name,filename=filename select flag=ok /
11、*操作成功*/ end else begin SELECT flag=file type error /*参数filename 输入格式错误*/ end-备份数据库 test_database declare fl varchar(10) execute pr_backup_db fl out,test_database,c:test_database.bak select fl-恢复数据库,输入的参数错误 declare fl varchar(20) exec pr_restore_db fl out,sa,c: select fl-恢复数据库,即创建数据库 test_database 的复本 test_db declare fl varchar(20) exec pr_restore_db fl out,test_db,c:test_database.bak select fl回复者回复者 Blog:http:/