SQL数据库还原代码 |
答題得分者是:malanlk
|
ntjrr
高階會員 ![]() ![]() ![]() ![]() 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
malanlk
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
|
ntjrr
高階會員 ![]() ![]() ![]() ![]() 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
timhuang
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
Hi, 要先將連結在該 database 的 connection 都 kill 掉以取得獨占才能進行 restore, 做法如下,
use master declare @spid int, @dbid int, @cmd nvarchar(200) declare c_processes cursor for select spid, dbid from sysprocesses where dbid = db_id('database_name') open c_processes fetch next from c_processes into @spid, @dbid while @@fetch_status=0 begin set @cmd = 'kill ' convert(nvarchar, @spid) exec sp_executesql @cmd fetch next from c_processes into @spid, @dbid end close c_processes deallocate c_processes restore database database_name from disk='xxxx.bak' |
malanlk
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
http://delphi.ktop.com.tw/topic.php?topic_id=77532 借花獻佛... TFrmBackup 裡面加幾個元件
TADOConnection ==> connAdo_res
connAdo_res.DefaultDatabase 設為 'master';
TButton ==> btnRestore
TADODataSet ==> ADODataSetWho
ADODataSetWho.Connection 設為 'connAdo_res'
function TFrmBackup.RestoreDB(strDBName,strFileName: string): boolean; var strSQL: string; begin Result := false; strSQL := 'RESTORE DATABASE [' strDBName '] FROM DISK = N''' strFileName ''' WITH FILE = 1, NOUNLOAD , STATS = 10, RECOVERY, REPLACE'; try ADODataSetWho.Recordset := connAdo_res.Execute('sp_who'); ADODataSetWho.First; while not ADODataSetWho.Eof do begin if ADODataSetWho.FieldByName('dbname').AsString = strDBName then begin MessageBox(Application.Handle,Pchar('Database ' strDBName 'is in use by ' ADODataSetWho.FieldByName('loginame').AsString '!'),'Restore Error',MB_OK MB_ICONERROR); Exit; end; ADODataSetWho.Next; end; connAdo_res.Execute(strSQL); except MessageBox(Application.Handle,'Restore Database Error!','It Is Error',MB_OK MB_ICONERROR); Exit; end; Result := true; end; procedure TFrmBackup.btnRestordClick(Sender: TObject); var FilePath: String; begin connAdo_res.Close; connAdo_res.ConnectionString := 'Provider=SQLOLEDB.1;Password=''' Trim(Password.Text) ''';Persist Security Info=True;User ID=''' Trim(UserName.Text) ''';Data Source=''' Trim(ServerName.Text) ''''; try connAdo.Close; connAdo_res.Open; if connAdo_res.Connected then begin if Show=1 then begin application.CreateForm(tfrmDlg,frmDlg); frmDlg.Show; end; BackFileName:=Trim(CmbDatabaseName.Text) FormatDateTime('yyyymmddhhmmss',Now); if RightStr(EdtPath.text,1)='\' then FilePath:=EdtPath.Text else FilePath:=EdtPath.Text '\'; FilePath:=FilePath BackFileName; if RestoreDB(Trim(CmbDatabaseName.Text),Trim(FilePath)) then MessageBox(handle,'Database Sestore Successfully!','It Is Ok!',mb_ok); end; except on ex:Exception do raise Exception.Create('Error:' #13#10 ex.Message); end; connAdo.Open; end;這樣試試, 沒 Debug.... 過 發表人 - malanlk 於 2005/09/07 23:03:31 |
timhuang
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
|
ntjrr
高階會員 ![]() ![]() ![]() ![]() 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
malanlk
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
|
timhuang
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
|
malanlk
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
|
ntjrr
高階會員 ![]() ![]() ![]() ![]() 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
malanlk
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
1. 之前貼出的程式碼中有一段是
'RESTORE DATABASE [' + strDBName + '] FROM DISK = N''' + strFileName + ''' WITH FILE = 1, NOUNLOAD , STATS = 10, RECOVERY, REPLACE'; 參考 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_ra-rz_25rm.asp FILE=1 就是說, 還原檔有一個, 你本來就只有1個檔, 所以可以拿掉
NOUNLAD 沒用, 可以拿掉 (由磁帶還原才有用)
STATS=10 每還原 10% 更新進度表, 因為是透過 Query 下指令, 所以也沒用
RECOVERY 還原後將所有尚未COMMIT 的 交易 RollBack, 是預設值, 所以也可以不加
REPLACE 這就是關鍵了... 會將已存在同名的 Database 刪除, 另存新的.....
所以可以在 timhuang 大大那段最後加上 '... with replace' 蓋掉原資料庫... 2. 應該是 這個Query沒有回應, 所以無法判斷是否執行成功 發表人 - malanlk 於 2005/09/09 00:43:36
|
ntjrr
高階會員 ![]() ![]() ![]() ![]() 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |