/*--調用示例 select 數據庫文件目錄=dbo.f_getdbpath('tempdb') ,[默認SQL SERVER數據目錄]=dbo.f_getdbpath('') ,[默認SQL SERVER備份目錄]=dbo.f_getdbpath(null) --*/ ifexists (select*from dbo.sysobjects where id =object_id(N'[dbo].[f_getdbpath]') and xtype in (N'FN', N'IF', N'TF')) dropfunction[dbo].[f_getdbpath] GO
createfunction f_getdbpath(@dbname sysname) returnsnvarchar(260) as begin declare@renvarchar(260) if@dbnameisnullordb_id(@dbname) isnull select@re=rtrim(reverse(filename)) from master..sysdatabases where name='master' else select@re=rtrim(reverse(filename)) from master..sysdatabases where name=@dbname
if@dbnameisnull set@re=reverse(substring(@re,charindex('\',@re)+5,260))+'BACKUP' else set@re=reverse(substring(@re,charindex('\',@re),260)) return(@re) end go
ifexists (select*from dbo.sysobjects where id =object_id(N'[dbo].[p_backupdb]') andOBJECTPROPERTY(id, N'IsProcedure') =1) dropprocedure[dbo].[p_backupdb] GO
createproc p_backupdb @dbname sysname='', --要備份的數據庫名稱,不指定則備份當前數據庫 @bkpathnvarchar(260)='', --備份文件的存放目錄,不指定則使用SQL默認的備份目錄 @bkfnamenvarchar(260)='', --備份文件名,文件名中可以用\DBNAME\代表數據庫名,\DATE\代表日期,\TIME\代表時間 @bktypenvarchar(10)='DB', --備份類型:'DB'備份數據庫,'DF' 差異備份,'LOG' 日志備份 @appendfilebit=1--追加/覆蓋備份文件 as declare@sqlvarchar(8000) ifisnull(@dbname,'')=''set@dbname=db_name() ifisnull(@bkpath,'')=''set@bkpath=dbo.f_getdbpath(null) 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@bktypewhen'LOG'then'log 'else'database 'end+@dbname +' to disk='''+@bkpath+@bkfname +''' with '+case@bktypewhen'DF'then'DIFFERENTIAL,'else''end +case@appendfilewhen1then'NOINIT'else'INIT'end print@sql exec(@sql) go
ifexists (select*from dbo.sysobjects where id =object_id(N'[dbo].[p_RestoreDb]') andOBJECTPROPERTY(id, N'IsProcedure') =1) dropprocedure[dbo].[p_RestoreDb] GO
--得到恢復后的數據庫名 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)
--生成數據庫恢復語句 set@sql='restore '+case@retypewhen'LOG'then'log 'else'database 'end+@dbname +' from disk='''+@bkfile+'''' +' with file='+cast(@filenumberasvarchar) +casewhen@overexist=1and@retypein('DB','DBNOR') then',replace'else''end +case@retypewhen'DBNOR'then',NORECOVERY'else',RECOVERY'end print@sql --添加移動邏輯文件的處理 if@retype='DB'or@retype='DBNOR' begin --從備份文件中獲取邏輯文件名 declare@lfnnvarchar(128),@tpchar(1),@iint
--創(chuàng)建臨時表,保存獲取的信息 createtable #tb(ln nvarchar(128),pn nvarchar(260),tp char(1),fgn nvarchar(128),sz numeric(20,0),Msz numeric(20,0)) --從備份文件中獲取信息 insertinto #tb exec('restore filelistonly from disk='''+@bkfile+'''') declare #f cursorforselect ln,tp from #tb open #f fetchnextfrom #f into@lfn,@tp set@i=0 while@@fetch_status=0 begin select@sql=@sql+',move '''+@lfn+''' to '''+@dbpath+@dbname+cast(@iasvarchar) +case@tpwhen'D'then'.mdf'''else'.ldf'''end ,@i=@i+1 fetchnextfrom #f into@lfn,@tp end close #f deallocate #f end
--關閉用戶進程處理 if@overexist=1and@killuser=1 begin declare@spidvarchar(20) declare #spid cursorfor select spid=cast(spid asvarchar(20)) from master..sysprocesses where dbid=db_id(@dbname) open #spid fetchnextfrom #spid into@spid while@@fetch_status=0 begin exec('kill '+@spid) fetchnextfrom #spid into@spid end close #spid deallocate #spid end
--恢復數據庫 exec(@sql)
go
/*4.--創(chuàng)建作業(yè)
*/
/*--調用示例
--每月執(zhí)行的作業(yè) exec p_createjob @jobname='mm',@sql='select * from syscolumns',@freqtype='month'
--每周執(zhí)行的作業(yè) exec p_createjob @jobname='ww',@sql='select * from syscolumns',@freqtype='week'
--每日執(zhí)行的作業(yè) exec p_createjob @jobname='a',@sql='select * from syscolumns'
--每日執(zhí)行的作業(yè),每天隔4小時重復的作業(yè) exec p_createjob @jobname='b',@sql='select * from syscolumns',@fsinterval=4
--*/ ifexists (select*from dbo.sysobjects where id =object_id(N'[dbo].[p_createjob]') andOBJECTPROPERTY(id, N'IsProcedure') =1) dropprocedure[dbo].[p_createjob] GO
--1.建立每月備份和生成月備份數據庫的作業(yè),每月每1天下午16:40分進行: set@sql=' declare @path nvarchar(260),@fname nvarchar(100) set @fname=''PRODUCE_''+convert(varchar(10),getdate(),112)+''_m.bak'' set @path=dbo.f_getdbpath(null)+@fname
--2.建立每周差異備份和生成周備份數據庫的作業(yè),每周日下午17:00分進行: set@sql=' declare @path nvarchar(260),@fname nvarchar(100) set @fname=''PRODUCE_''+convert(varchar(10),getdate(),112)+''_w.bak'' set @path=dbo.f_getdbpath(null)+@fname
--3.建立每日日志備份和生成日備份數據庫的作業(yè),每周日下午17:15分進行: set@sql=' declare @path nvarchar(260),@fname nvarchar(100) set @fname=''PRODUCE_''+convert(varchar(10),getdate(),112)+''_l.bak'' set @path=dbo.f_getdbpath(null)+@fname