強制還原已存在的資料庫

2021-04-01 20:24:41 字數 3376 閱讀 6279

use master

goif exists (select * from sysobjects

where id = object_id(n'[dbo].[spforcerestoredb]')

and objectproperty(id, n'isprocedure') = 1)

drop procedure [dbo].[spforcerestoredb]

goset quoted_identifier  off    set ansi_nulls  on

go/*

強制還原已存在的資料庫,基本原理是kill掉資料庫的所有會話

原貼在http://.sqlservercentral.com/scripts/contributions/827.asp

在此基礎上新增了with move選項

呼叫;use master

goexec master..spforcerestoredb 'test'

,'c:/test.bak'

,'c:/db/test_data.mdf'

,'c:/db/test_log.mdf'

vivianfdlpw 2005.9 引用請保留此資訊

*/create procedure spforcerestoredb

@databasename varchar(50),       --要恢復的資料庫名

@backupfile varchar(255),        --備份檔案路徑

@newdatafilepath  varchar(255),  --新物理檔案位置

@newlogfilepath  varchar(255)    --新日誌檔案位置

with encryption

asbegin

set nocount on 

declare @exists int

if not exists( select name from master.dbo.sysdatabases where name = @databasename)

begin

print '  database ' + @databasename + ' not found '

print '  enter valid datbase name'

return

endexec master.dbo.xp_fileexist @backupfile , @exists output

if (@exists = 0)

begin

print '  file ' + @backupfile + ' does bot exist'

print '  database cannot be restored'

print '  enter the valid backup file'

return

end-- cursor for all the spids running against this database

declare sysproc cursor local forward_only dynamic read_only for

select spid

from master.dbo.sysprocesses

where dbid = ( select dbid from master.dbo.sysdatabases

where name = @databasename)

declare @sysprocid **allint

-- opens the cursor

open sysproc

-- fetch the process id into the cursor

fetch next from sysproc into @sysprocid

declare @killstatement char(30)

while @@fetch_status = 0

begin

set @killstatement = 'kill ' + cast(@sysprocid as char(30))

-- kills the processes running against the database

exec (@killstatement)

fetch next from sysproc into @sysprocid

endwaitfor delay '000:00:01'

create table #

(logicalname varchar(255),

physicalname varchar(255),

type varchar(20),

filegroupname varchar(255),

size varchar(20),

maxsize varchar(20) )

declare @cmd varchar(200)

,@datalogicname varchar(20)

,@loglogicname varchar(20)

select @cmd = 'restore filelistonly from disk = '''+ @backupfile + ''''

insert # exec(@cmd)

select @datalogicname=logicalname from # where type='d'

select @loglogicname=logicalname from # where type='l'

drop table #

declare @strsql varchar(2000)

set @strsql = 'restore database '

set @strsql = @strsql + quotename(@databasename) 

set @strsql = @strsql + 'from  disk = n'+ '''' + @backupfile + ''''

set @strsql = @strsql + ' with  file = 1,  nounload ,  stats = 10,  recovery ,  replace'

set @strsql = @strsql + ',move '''+@datalogicname+''' to '''+@newdatafilepath+''''

set @strsql = @strsql + ',move '''+@loglogicname+''' to '''+@newlogfilepath+''''

--print @strsql

-- restore the database

exec (@strsql)

set nocount off 

endgo

db2 資料庫別名已存在

在建立資料庫時遇到資料庫別名已存在的問題時,可以通過以下方法解決 首先用 db2 list database directory 命令看在系統資料庫目錄 system database directory 中有沒有該資料庫。如果有,應該在確定該資料庫是沒有用的資料庫之後用 db2 drop data...

判斷資料在資料庫中是否已存在

今天下午和同事發生因為判斷資料是否在資料庫中已存在產生分歧.簡易 如下 觀點一,先取出資料庫中已存在id存入記憶體,再進行判斷 資料太多情況,記憶體 datetable dt excutesql select id from table list為資料集,已經去重 foreach var item ...

對已存在的資料庫表中進行分割槽

兩天一直在研究 2005 中如何對錶進行分割槽 但是參考了多數資料都是說新建表後再將原表中資料插入到新表中 這樣有些不方便 今天發現瞭如何更改表檔案組的所在檔案組 然後看了看 會不會也能應用到分割槽表中 試了試嗯.不錯 真的管用哦 下面看看 說明現有表mytb 主鍵索引 pk mytb.原理更改表的...

DBcontext應用於已存在資料庫

ef4.1有三種方式來進行資料操作及持久化。分別是database first,model first,code first,前面都已經簡單介紹過了.下面簡單小結一下 1.database first是基於已存在的資料庫,利用某些工具 如vs提供的ef設計器 建立實體類,資料庫物件與實體類的匹配關係...

SQL SEVER資料庫的還原

use master restore database 資料庫 名 如 leading from disk 資料庫備份檔案路徑 如 c program files microsoft sql server data leadingdebug.bak with move 資料庫檔名 如 leading...