|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
提供TCP/IP、ODBC和JDBC等多种数据库连接路径。数据|数据库
/*--原帖地点:http://community.csdn.net/Expert/topic/3818/3818559.xml?temp=.9593317--*/
/*--处置请求
在sql数据库里有一个名为Pos200502的Database,每月会有一个相似于如许称号(Pos200502Pos200503)的database
我该怎样使用sqlserver的主动功课+一段存储历程,完成以下功效:1.每月的25号,主动创立一个下一个月的database,database名字定为:PosYYYYMM(YYYYMM是年和月,一直是实行操纵工夫的下一个月)2.再将本月database的一切布局(包含表、视图、存储历程等)千篇一律的复制到下一个月的database中。(注重仅复制布局,不复制任何数据!)--*/
---办法1.备份+恢复usemastergo
ifexists(select*fromdbo.sysobjectswhereid=object_id(N[dbo].[sp_ProcCopyDb])andOBJECTPROPERTY(id,NIsProcedure)=1)dropprocedure[dbo].[sp_ProcCopyDb]GO
/*--数据库主动复制
将指定前缘的数据库,复制为一个以以后月份+1为库名的数据库中,而且扫除一切的数据比方,数据库前缘为Pos,以后日期为2005-3-27则请求复制数据Pos200503为Pos200504,而且清空内里的数据
用备份+恢复的办法完成优点是在清算数据时,能够设置前提,保存指定的数据欠好的中央是数据多时,速率慢,损耗的资本多
--邹建2005.03(援用请保存此信息)--*/
/*--挪用示例
--复制Posexecsp_ProcCopyDbPos--*/createprocsp_ProcCopyDb@DB_Headsysname=N--数据库前缀asdeclare@sdbnamesysname,@ddbnamesysnamedeclare@sNvarchar(4000),@bkfileNvarchar(1000),@moveNvarchar(4000)
--复制的源库名及方针库名if@DB_Headisnullset@DB_Head=N
select@sdbname=@DB_Head+convert(char(6),getdate(),112),@ddbname=@DB_Head+convert(char(6),dateadd(month,1,getdate()),112)
ifdb_id(@sdbname)isnullbeginraiserror(N源数据库"%s"不存在,1,16,@sdbname)returnend
ifdb_id(@ddbname)isnotnullbeginraiserror(N方针数据库"%s"已存在,1,16,@ddbname)returnend
--一时备份文件名selecttop1@bkfile=rtrim(reverse(filename))frommaster.dbo.sysfileswherename=Nmasterselect@bkfile=stuff(@bkfile,1,charindex(,@bkfile),N),@bkfile=reverse(stuff(@bkfile,1,charindex(,@bkfile),N))+NBACKUP+cast(newid()asnvarchar(36))+N.bak
--数据文件挪动语句set@s=Nset@move=Nselect@move=@move+N,move+quotename(rtrim(name),N)+Nto+quotename(rtrim(casewhencharindex(N+quotename(@sdbname,N)+N,filename)>0thenstuff(filename,charindex(N+quotename(@sdbname,N)+N,filename),+cast(len(@sdbname)asnvarchar)+N,N+quotename(@ddbname,N)+N)elsereverse(stuff(reverse(filename),charindex(,reverse(filename)),0,+N_+reverse(N+quotename(@ddbname,N)+N)))end),N)from+quotename(@sdbname)+N.dbo.sysfilesexecsp_executesql@s,N@moveNvarchar(4000)out,@moveout
--备份源数据库set@s=Nbackupdatabase+quotename(@sdbname)+Ntodisk=@bkfilewithformatexecsp_executesql@s,N@bkfileNvarchar(1000),@bkfile
--复原为方针数据库set@s=Nrestoredatabase+quotename(@ddbname)+Nfromdisk=@bkfilewithreplace+@moveexecsp_executesql@s,N@bkfileNvarchar(1000),@bkfile
--删除一时备份文件set@s=del"+@bkfile+"execmaster..xp_cmdshell@s,no_output
--清算方针数据库中的一切数据set@s=Nuse+quotename(@ddbname)+Nexecsp_msforeachtable@command1=Ntruncatetable?,@whereand=Nandobjectproperty(o.id,NTableHasForeignRef)=0execsp_msforeachtable@command1=Ndeletefrom?,@whereand=Nandobjectproperty(o.id,NTableHasForeignRef)=1execsp_executesql@sgo
有了数据以后,我们就要想一个比较统一的方法来闪回。上面我们说了对于DML操作,可以通过反向执行所有逆操作来实现,对于语句里面的DDL,只能直接跳过。原因是一个DDL不一定有直接的逆操作。 |
|