複製資料庫

2021-04-12 14:55:38 字數 3518 閱讀 8244

複製資料庫

sql200企業管理器

--右鍵要複製的資料庫a

--所有任務

--匯出資料

--目標資料庫,選擇資料庫b

--然後選擇"在sql server資料庫之間複製資料和物件"

--勾選"建立目的物件","包含擴充套件屬性"

--最後完成.

或者查詢分析器執行下面的語句建立乙個儲存過程,然後再執行呼叫示例中的呼叫方法實現資料庫複製

use master

goif exists (select * from dbo.sysobjects where id = object_id(n'[dbo].[p_copydb]') and objectproperty(id, n'isprocedure') = 1)

drop procedure [dbo].[p_copydb]

go/*--將乙個資料庫完整複製成另乙個資料庫

借助備份/恢復,將源資料庫複製為目標資料庫

--鄒建 2003.10(引用請保留此資訊)--*/

/*--呼叫示例

exec p_copydb @sdbname=n'pubs'

--*/

create proc p_copydb

@sdbname sysname=n'',   --定義要複製的資料庫名,預設為當前資料庫

@ddbname sysname=n'',   --定義複製後生成的資料庫名,預設為當前資料庫名+_bak

@overexist bit=1,       --是否覆蓋已經存在的資料庫

@killuser bit=1         --是否關閉使用者使用程序,僅@overexist=1時有效

asdeclare @s nvarchar(4000),@bkfile nvarchar(1000),@move nvarchar(4000)

--引數檢查

if @overexist is null set @overexist=0

if @killuser is null set @killuser=0

--檢查複製的源庫名

if isnull(@sdbname,n'')=n''

set @sdbname=db_name()

else if db_id(@sdbname) is null

begin

raiserror(n'資料庫"%s"無效',1,16,@sdbname)

return

end--檢查目標資料庫

if isnull(@ddbname,n'')=''

set @ddbname=@sdbname+n'_bak'

if @overexist=0 and db_id(@ddbname) is not null

begin

raiserror(n'目標資料庫"%s"已經存在',1,16,@ddbname)

return

end--臨時備份檔案名

select top 1 @bkfile=rtrim(reverse(filename))

from master.dbo.sysfiles

where name=n'master'

select @bkfile=stuff(@bkfile,1,charindex('/',@bkfile),n'')

,@bkfile=reverse(stuff(@bkfile,1,charindex('/',@bkfile),n''))

+n'/backup/'+cast(newid() as nvarchar(36))+n'.bak'

--資料檔案移動語句

set @s=n'set @move=n''''

select @move=@move

+n'',move ''+quotename(rtrim(name),n'''''''')

+n'' to ''+quotename(rtrim(case

when charindex(n'

+quotename(@sdbname,n'''')

+n',filename)>0

then stuff(filename,charindex(n'

+quotename(@sdbname,n'''')

+n',filename),'

+cast(len(@sdbname) as nvarchar)

+n',n'+quotename(@ddbname,n'''')+n')

else reverse(stuff(

reverse(filename),

charindex(''/'',reverse(filename)),

0,+n''_''+reverse(n'+quotename(@ddbname,n'''')+n')))

end),n'''''''')

from '+quotename(@sdbname)+n'.dbo.sysfiles'

exec sp_executesql @s,n'@move nvarchar(4000) out',@move out

--備份源資料庫

set @s=n'backup database '+quotename(@sdbname)+n' to disk=@bkfile with format'

exec sp_executesql @s,n'@bkfile nvarchar(1000)',@bkfile

--如果需要,做關閉使用者程序處理

if @killuser=1 and db_id(@ddbname) is not null

begin

declare tb cursor local

for

select n'kill '+cast(spid as varchar)

from master.dbo.sysprocesses

where dbid=db_id(@ddbname)

open tb

fetch tb into @s

while @@fetch_status=0

begin 

exec sp_executesql @s

fetch tb into @s

end 

close tb

deallocate tb

end--還原為目標資料庫

set @s=n'restore database '

+quotename(@ddbname)

+n' from disk=@bkfile with replace'

+@move

exec sp_executesql @s,n'@bkfile nvarchar(1000)',@bkfile

--刪除臨時備份檔案

set @s='del "'+@bkfile+'"'

exec master..xp_cmdshell @s,no_output

go注意兩種方法

第一種方法,如果不勾選建立目的物件,則適合於資料庫b已經建立好,只需要複製資料的情況

否則1,2種方法都是把資料庫a完全(包括檢視等...)複製到資料庫b,結果是兩個資料庫完全一樣

資料庫複製

if exists select from dbo.sysobjects where id object id n dbo p copydb and objectproperty id,n isprocedure 1 drop procedure dbo p copydb go 資料庫資料複製 將乙...

資料庫複製

if exists select from dbo.sysobjects where id object id n dbo p copydb and objectproperty id,n isprocedure 1 drop procedure dbo p copydb go 資料庫資料複製 將乙...

資料庫複製

if exists select from dbo.sysobjects where id object id n dbo p copydb and objectproperty id,n isprocedure 1 drop procedure dbo p copydb go 資料庫資料複製 將乙...