最近在寫乙個類是財務系統中套帳的系統。每年或者每月的的資料儲存在不同的資料庫中,以方便備份,也防止了歷史資料膨脹。雖然儲存的資料不同但格式都是一樣。資料庫中的物件都是相同的。下面就是該系統中的乙個儲存過程。此過程中對錯誤處理不夠詳細,望有看法有想法的朋友給予指出。
我所理解的資料庫恢復,其實就是使用備份檔案重新建立資料庫的過程。
/***********功能:使用備份檔案建立資料******************************/
create procedure p_createdb
@bakfilepath varchar(200)= null,--例如d:/***/的格式
@bakfilename varchar(30)=null,--備份檔案的名字
@dbname varchar(20)=null,---要建立資料庫的名字
@dbpath varchar(200)=null--例如:d:/test/
asdeclare @sql varchar(1000),@bakfilefullpath varchar(250),@ip varchar(20)
declare @basedbpath varchar(100),@i int --儲存基本資料庫中反向的'/'的位置
set concat_null_yields_null off
-------------------獲得新資料的路徑-------------------
if (@dbpath is null)
begin
if exists(select * from master..sysdatabases where name='schlbasicdb') --獲取基本資料庫的路徑
select @basedbpath=filename from master..sysdatabases where name='schlbasicdb'
else
select @basedbpath=filename from master..sysdatabases where name='master'
set @i=charindex('/',reverse(@basedbpath))-1
set @basedbpath=substring(@basedbpath,1,len(@basedbpath)-@i) --獲取基本資料庫的路徑
endelse
set @basedbpath=@dbpath
------------------獲取備份檔案的完整網路路徑(路徑+檔名)當然伺服器要有操作備份檔案所在機器的許可權----------------
set @ip=host_name()
set @bakfilepath=replace(@bakfilepath,':','$');
set @bakfilepath='//'+@ip+'/'+@bakfilepath;
set @bakfilefullpath=@bakfilepath+@bakfilename;
------------------建立臨時表儲存備份檔案的檔案列表資訊--------------------------------------
-----載至http://dev.csdn.***/article/28/28463.shtm ---------------------------------------
-----sql server2000資料庫備份和恢復儲存過程(加強版本)--選擇自 aierong 的 blog ---------------
create table #tmp(
fileid int identity(1,1),/*自增型,將來用來作為檔名的一部分*/
logicalname nvarchar(128), /*檔案的邏輯名稱*/
physicalname nvarchar(260) , /*檔案的物理名稱或作業系統名稱*/
type char(1), /*資料檔案 (d) 或日誌檔案 (l)*/
filegroupname nvarchar(128), /*包含檔案的檔案組名稱*/
[size] numeric(20,0), /*當前大小(以位元組為單位)*/
[maxsize] numeric(20,0) /*允許的最大大小(以位元組為單位)*/
)insert into #tmp(logicalname,physicalname,type,filegroupname,[size],[maxsize])
exec('restore filelistonly from disk='''+@bakfilefullpath+'''')
-------從tmp中獲取自己所要的資料
select fileid,logicalname,type into #tmp2 from #tmp
------------宣告游標,對獲取的資料作迴圈處理----------------------------
declare @logicalname sysname,@type varchar(10),@fileid varchar(10)
declare cur_bakupfile cursor
forselect fileid,logicalname,type from #tmp2
---------此時用@i來儲存要還原的資料庫的資料檔案的個數,如過是第乙個檔案即*.mdf,----------------------
---------因為主檔案是乙個資料庫的起點所以最好不要亂字尾改名-----------------------------------------
set @i=0
set @sql=' use master restore database '+@dbname+' from disk ='''+@bakfilefullpath+''''+' with '
---------開啟游標--------------------
open cur_bakupfile
fetch next from cur_bakupfile into @fileid,@logicalname,@type
while (@@fetch_status=0)
begin
if (upper(@type)='d')
begin
if (@i=0)
begin
set @sql=@sql+' move '''+@logicalname+''' to '''+@basedbpath+@dbname+'.mdf'',';
set @i=@i+1;
endelse
begin
set @sql=@sql+' move '''+@logicalname+''' to '''+@basedbpath+@dbname+@fileid+'_data.ndf'','
endend
else if(upper(@type)='l')
begin
set @sql=@sql+' move '''+@logicalname+''' to '''+@basedbpath+@dbname+@fileid+'_log.ldf'','
end;
fetch next from cur_bakupfile into @fileid,@logicalname,@type
end
deallocate cur_bakupfile
------replace,強制替換資料庫檔案,具體看sql幫助了----------------------------------
set @sql=@sql+' replace'
set concat_null_yields_null on
--print @sql
exec(@sql)
if (@@error=0)
return 100
else
return -100
----以下是測試,各位朋友注意檔案路徑中不要少了'/',例如:將'e:/test/' 寫成'e:/test'了,
---其實不難為大家,只是拋磚引玉而已
p_createdb 'e:/','testtest2.bak','test','e:/test/'
言語不準確之處,望各位網友指出,謝謝!
SQLSERVER2000技術規格
sqlserver2000技術規格 系統技術規格 每個伺服器最多可以允許16個sqlserver例項 每個例項可擁有 2147483467 個鎖 資料庫技術規格 sqlserver的資料庫大小1048516tb 每個資料庫可擁有的檔案組數32767 每個資料庫可擁有的檔案組數256 檔案大小 資料檔...
SQLSERVER2000啟動失敗
服務管理器中啟動sqlserver服務 彈出視窗的錯誤資訊是 本地計算機上的mssqlserver服務啟動後又停止了。一些服務自動停止,如果它們沒有什麼可做的,例如 效能日誌和警報 服務 1 解決方法 調整系統時間到你上一次能夠正常啟動的時間,啟動sqlserver服務,成功後,然後再把時間調回來。...
SQLSERVER2000技術規格
quote 系統技術規格 每個伺服器最多可以允許16個sqlserver例項 每個例項可擁有 2147483467 個鎖 資料庫技術規格 sqlserver的資料庫大小1048516tb 每個資料庫可擁有的檔案組數32767 每個資料庫可擁有的檔案組數256 檔案大小 資料檔案 32tb 夠大了吧,...