MSSQL网站制作之编程完成备份和复原数据库
这类操作的执行过程是,1)按照新的表定义建立一个临时表tmpa,2)将原表数据拷贝到临时表,3)将原始表改名tmpb,4)将tmpa改名为原表名,5)将tmpb删除。备份|编程|数据|数据库注重,上面备份复原都是用存储历程完成!ifexists(select*fromdbo.sysobjectswhereid=object_id(N.)andOBJECTPROPERTY(id,NIsProcedure)=1)
dropprocedure.
GO
/*--备份数据库的通用存储历程
--邹建2003.10--*/
/*--挪用示例
--备份以后数据库
execp_backupdb@bkpath=c:,@bkfname=DBNAME\_DATE\_db.bak
存储历程完成备份和复原数据库:
ifexists(select*fromdbo.sysobjectswhereid=object_id(N.)andOBJECTPROPERTY(id,NIsProcedure)=1)
dropprocedure.
GO
/*--备份数据库的通用存储历程
--邹建2003.10--*/
/*--挪用示例
--备份以后数据库
execp_backupdb@bkpath=c:,@bkfname=DBNAME\_DATE\_db.bak
--差别备份以后数据库
execp_backupdb@bkpath=c:,@bkfname=db_DATE\_df.bak,@bktype=DF
--备份以后数据库日记
execp_backupdb@bkpath=c:,@bkfname=db_DATE\_log.bak,@bktype=LOG
--*/
createprocp_backupdb
@dbnamesysname=,--要备份的数据库称号,不指定章备份以后数据库
@bkpathnvarchar(260)=,--备份文件的寄存目次,不指定章利用SQL默许的备份目次
@bkfnamenvarchar(260)=,--备份文件名,文件名中能够用DBNAME代表数据库名,DATE代表日期,TIME代表工夫
@bktypenvarchar(10)=DB,--备份范例:DB备份数据库,DF差别备份,LOG日记备份
@appendfilebit=1,--追加/掩盖备份文件
@passwordnvarchar(20)=--为备份文件设置的暗码(仅sql2000撑持),设置后,恢复时必需供应此暗码
as
declare@sqlvarchar(8000)
ifisnull(@dbname,)=set@dbname=db_name()
ifisnull(@bkpath,)=
begin
select@bkpath=rtrim(reverse(filename))frommaster..sysfileswherename=master
select@bkpath=substring(@bkpath,charindex(,@bkpath)+1,4000)
,@bkpath=reverse(substring(@bkpath,charindex(,@bkpath),4000))+BACKUP
end
ifisnull(@bkfname,)=set@bkfname=DBNAME\_DATE\_TIME.BAK
set@bkfname=replace(replace(replace(@bkfname,DBNAME,@dbname)
,DATE,convert(varchar,getdate(),112))
,TIME,replace(convert(varchar,getdate(),108),:,))
set@sql=backup+case@bktypewhenLOGthenlogelsedatabaseend+@dbname
+todisk=+@bkpath+@bkfname
+with+case@bktypewhenDFthenDIFFERENTIAL,elseend
+case@appendfilewhen1thenNOINITelseINITend
+caseisnull(@password,)whenthenelse,PASSWORD=+@password+end
exec(@sql)
go
ifexists(select*fromdbo.sysobjectswhereid=object_id(N.)andOBJECTPROPERTY(id,NIsProcedure)=1)
dropprocedure.
GO
/*--恢单数据库的通用存储历程
--邹建2003.10--*/
/*--挪用示例
--完全恢单数据库
execp_RestoreDb@bkfile=c:db_20031015_db.bak,@dbname=db
--差别备份恢复
execp_RestoreDb@bkfile=c:db_20031015_db.bak,@dbname=db,@retype=DBNOR
execp_RestoreDb@bkfile=c:db_20031015_df.bak,@dbname=db,@retype=DF
--日记备份恢复
execp_RestoreDb@bkfile=c:db_20031015_db.bak,@dbname=db,@retype=DBNOR
execp_RestoreDb@bkfile=c:db_20031015_log.bak,@dbname=db,@retype=LOG
--*/
createprocp_RestoreDb
@bkfilenvarchar(1000),--界说要恢复的备份文件名(领路径)
@dbnamesysname=,--界说恢复后的数据库名,默许为备份的文件名
@dbpathnvarchar(260)=,--恢复后的数据库寄存目次,不指定章为SQL的默许数据目次
@retypenvarchar(10)=DB,--恢复范例:DB完事恢单数据库,DBNOR为差别恢复,日记恢复举行完全恢复,DF差别备份的恢复,LOG日记恢复
@filenumberint=1,--恢复的文件号
@overexistbit=1,--是不是掩盖已存在的数据库,仅@retype为DB/DBNOR是无效
@killuserbit=1,--是不是封闭用户利用历程,仅@overexist=1时无效
@passwordnvarchar(20)=--备份文件的暗码(仅sql2000撑持),假如备份时设置了暗码,必需供应此暗码
as
declare@sqlvarchar(8000)
--失掉恢复后的数据库名
ifisnull(@dbname,)=
select@sql=reverse(@bkfile)
,@sql=casewhencharindex(.,@sql)=0then@sql
elsesubstring(@sql,charindex(.,@sql)+1,1000)end
,@sql=casewhencharindex(,@sql)=0then@sql
elseleft(@sql,charindex(,@sql)-1)end
,@dbname=reverse(@sql)
--失掉恢复后的数据库寄存目次
ifisnull(@dbpath,)=
begin
select@dbpath=rtrim(reverse(filename))frommaster..sysfileswherename=master
select@dbpath=reverse(substring(@dbpath,charindex(,@dbpath),4000))
end
--天生数据库恢复语句
set@sql=restore+case@retypewhenLOGthenlogelsedatabaseend+@dbname
+fromdisk=+@bkfile+
+withfile=+cast(@filenumberasvarchar)
+casewhen@overexist=1and@retypein(DB,DBNOR)then,replaceelseend
+case@retypewhenDBNORthen,NORECOVERYelse,RECOVERYend
+caseisnull(@password,)whenthenelse,PASSWORD=+@password+end
--增加挪动逻辑文件的处置
if@retype=DBor@retype=DBNOR
begin
--从备份文件中猎取逻辑文件名
declare@lfnnvarchar(128),@tpchar(1),@iint,@svarchar(1000)
--创立一时表,保留猎取的信息
createtable#tb(lnnvarchar(128),pnnvarchar(260),tpchar(1),fgnnvarchar(128),sznumeric(20,0),Msznumeric(20,0))
--从备份文件中猎取信息
set@s=restorefilelistonlyfromdisk=+@bkfile+
++caseisnull(@password,)whenthenelsewithPASSWORD=+@password+end
insertinto#tbexec(@s)
declare#fcursorforselectln,tpfrom#tb
open#f
fetchnextfrom#finto@lfn,@tp
set@i=0
while@@fetch_status=0
begin
select@sql=@sql+,move+@lfn+to+@dbpath+@dbname+cast(@iasvarchar)
+case@tpwhenDthen.mdfelse.ldfend
,@i=@i+1
fetchnextfrom#finto@lfn,@tp
end
close#f
deallocate#f
end
--封闭用户历程处置
if@overexist=1and@killuser=1
begin
declarehCForEachcursorfor
selects=kill+cast(spidasvarchar)frommaster..sysprocesses
wheredbid=db_id(@dbname)
execsp_msforeach_worker?
end
--恢单数据库
exec(@sql)
Go
邹建说:
说白了,就是备份数据库和复原数据库的SQL语句的使用:
--备份
backupdatabase数据库todisk=c:你的备份文件名
--复原
restoredatabase数据库fromdisk=c:你的备份文件名
PS:邹建老迈真是我的偶像阿!
操作被同步到从库上后,则主从都“回天无力”。 入门没那么困难,精通没那么容易 比如,MicrosoftSQLServer2008的某一个版本可以满足现在的这个业务的需要,而且价格还比Oracle11g要便宜,那么这一产品就是适合的。 一个是把SQL语句写到客户端,可以使用DataSet进行加工; 学习SQL语言的话如果要学会去做网站就不是很难!但是要做数据库管理的话就有难度了! 理解了存储结构,再阅读下性能优化的章节基本上会对sqlserver有个清晰地认识 having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。 不好!如果出了错;不好调试;不好处理!其实web开发将代码分为3层:web层;业务逻辑层和数据访问层;一般对数据库的操作都在数据访问层来做;这样便于调试和维护!而且将来如果是换了数据库的话;你只需要改数据层的代码;其他层的基本可以不变!要是你在jsp中直接调用sql数据库;那么如果换了数据库呢?岂不都要改?如果报了异常呢?怎么做异常处理? 你觉得我的非分区索引无法对起子分区,你可以提醒我一下呀!没有任何的提醒,直接就变成了非分区表。不知道这算不算一个bug。大家也可以试试。
页:
[1]