MSSQL网页编程之数据库备份与恢复的存储历程
Archive非常适合存储大量的独立的,作为历史记录的数据。因为它们不经常被读取。Archive拥有高效的插入速度,但其对查询的支持相对较差备份|存储历程|恢复|数据|数据库ifexists(
select*fromsysobjects
wherename=pr_backup_dbandxtype=p
)
begin
dropprocpr_backup_db
end
go
/*备份数据库*/
createprocpr_backup_db
@flagvarchar(10)out,
@backup_db_namevarchar(128),
@filenamevarchar(1000)--路径+文件名字
as
declare@sqlnvarchar(4000),@parnvarchar(1000)
select@par=@filenamevarchar(1000)
select@sql=BACKUPDATABASE+@backup_db_name+todisk=@filenamewithinit
executesp_executesql@sql,@par,@filename
select@flag=ok
go
ifexists(
select*fromsysobjects
wherename=fn_GetFilePathandxtype=fn
)
begin
dropfunctionfn_GetFilePath
end
go
/*创立函数,失掉文件得路径*/
createfunctionfn_GetFilePath(@filenamenvarchar(260))
returnsnvarchar(260)
as
begin
declare@file_pathnvarchar(260)
declare@filename_reversenvarchar(260)
select@filename_reverse=reverse(@filename)
select@file_path=substring(@filename,1,len(@filename)+1-charindex(,@filename_reverse))
return@file_path
end
go
ifexists(
select*fromsysobjects
wherename=pr_restore_dbandxtype=p
)
begin
dropprocpr_restore_db
end
go
createprocpr_restore_db/*恢单数据库*/
@flagvarchar(20)out,/*历程运转的形态标记,是输出参数*/
@restore_db_namenvarchar(128),/*要恢复的数据名字*/
@filenamenvarchar(260)/*备份文件寄存的路径+备份文件名字*/
as
declare@proc_resulttinyint/*前往体系存储历程xp_cmdshell运转了局*/
declare@loop_timesmallint/*轮回次数*/
declare@max_idssmallint/*@tem表的ids列最年夜数*/
declare@file_bak_pathnvarchar(260)/*原数据库寄存路径*/
declare@flag_filebit/*文件寄存标记*/
declare@master_pathnvarchar(260)/*数据库master文件路径*/
declare@sqlnvarchar(4000),@parnvarchar(1000)
declare@sql_subnvarchar(4000)
declare@sql_cmdnvarchar(4000)
/*
判别参数@filename文件格局正当性,以避免用户输出相似d:大概c:a等不法文件名
参数@filename内里必需有而且不以开头
*/
ifright(@filename,1)andcharindex(,@filename)0
begin
select@sql_cmd=dir+@filename
EXEC@proc_result=master..xp_cmdshell@sql_cmd,no_output
IF(@proc_result0)/*体系存储历程xp_cmdshell前往代码值:0(乐成)或1(失利)*/
begin
select@flag=notexist/*备份文件不存在*/
return/*加入历程*/
end
/*创立一时表,保留由备份集内包括的数据库和日记文件列表构成的了局集*/
createtable#tem(
LogicalNamenvarchar(128),/*文件的逻辑称号*/
PhysicalNamenvarchar(260),/*文件的物理称号或操纵体系称号*/
Typechar(1),/*数据文件(D)或日记文件(L)*/
FileGroupNamenvarchar(128),/*包括文件的文件组称号*/
numeric(20,0),/*以后巨细(以字节为单元)*/
numeric(20,0)/*同意的最年夜巨细(以字节为单元)*/
)
/*
创立表变量,表布局与一时表基础一样
就是多了两列,
列ids(自增编号列),
列file_path,寄存文件的路径
*/
declare@temtable(
idssmallintidentity,/*自增编号列*/
LogicalNamenvarchar(128),
PhysicalNamenvarchar(260),
File_pathnvarchar(260),
Typechar(1),
FileGroupNamenvarchar(128)
)
insertinto#tem
execute(restorefilelistonlyfromdisk=+@filename+)
/*将一时表导进表变量中,而且盘算出响应得路径*/
insertinto@tem(LogicalName,PhysicalName,File_path,Type,FileGroupName)
selectLogicalName,PhysicalName,dbo.fn_GetFilePath(PhysicalName),Type,FileGroupName
from#tem
if@@rowcount>0
begin
droptable#tem
end
select@loop_time=1
select@max_ids=max(ids)/*@tem表的ids列最年夜数*/
from@tem
while@loop_time<=@max_ids
begin
select@file_bak_path=file_path
from@temwhereids=@loop_time
select@sql_cmd=dir+@file_bak_path
EXEC@proc_result=master..xp_cmdshell@sql_cmd,no_output
/*体系存储历程xp_cmdshell前往代码值:0(乐成)或1(失利)*/
IF(@proc_result0)
select@loop_time=@loop_time+1
else
BREAK/*没有找到备份前数据文件原有寄存路径,加入轮回*/
end
select@master_path=
if@loop_time>@max_ids
select@flag_file=1/*备份前数据文件原有寄存路径存在*/
else
begin
select@flag_file=0/*备份前数据文件原有寄存路径不存在*/
select@master_path=dbo.fn_GetFilePath(filename)
frommaster..sysdatabaseswherename=master
end
select@sql_sub=
/*type=d是数据文件,type=l是日记文件*/
/*@flag_file=1时新的数据库文件仍是寄存在本来路径,不然寄存路径和master数据库路径一样*/
select@sql_sub=@sql_sub+move+LogicalName+to
+casetype
whendthencase@flag_file
when1thenFile_path
else@master_path
end
whenlthencase@flag_file
when1thenFile_path
else@master_path
end
end
+casetype
whendthen@restore_db_name+_+LogicalName+_data.mdf,
whenlthen@restore_db_name+_+LogicalName+_log.ldf,
end
from@tem
select@sql=RESTOREDATABASE@db_nameFROMDISK=@filenamewith
select@sql=@sql+@sql_sub+replace
select@par=@db_namenvarchar(128),@filenamenvarchar(260)
print@sql
executesp_executesql@sql,@par,@db_name=@restore_db_name,@filename=@filename
select@flag=ok/*操纵乐成*/
end
else
begin
SELECT@flag=filetypeerror/*参数@filename输出格局毛病*/
end
--备份数据库test_database
declare@flvarchar(10)
executepr_backup_db@flout,test_database,c: est_database.bak
select@fl
--恢单数据库,输出的参数毛病
declare@flvarchar(20)
execpr_restore_db@flout,sa,c:
select@fl
--恢单数据库,即创立数据库test_database的复本test_db
declare@flvarchar(20)
execpr_restore_db@flout,test_db,c: est_database.bak
select@fl
闪回的目的是要让数据库在commit之后,还能恢复到之前的某个状态,整库或指定的表。 对递归类的树遍历很有帮助。个人感觉这个真是太棒了!阅读清晰,非常有时代感。 代替了原来VB式的错误判断。比Oracle高级不少。 对一张百万级别的表建游标,同时又没有什么过滤条件,取得游标效率是如果直接SQL查询百万条数据;如果再对每条记录做处理,耗时将更长。 可以动态传入参数,省却了动态SQL的拼写。 sqlserver的痛苦之处在于有用文档的匮乏,很多只是表明的东西 入门没那么困难,精通没那么容易 只能告诉你,学好数据库语言和原理,多见识几种数据库软件,比一棵树上吊死要好。
页:
[1]