SQL Server學習_資料庫複製
阿新 • • 發佈:2018-12-11
資料庫複製
在網上看到一個數據庫複製,感覺挺有意思的 一般情況下最好定期備份,這只是練習
/**
*複製表結構的通用儲存過程
*/
-- Transfer物件的重要屬性
-- 1. 屬性
屬性名 型別 描述
--------------------------------- ------------------- --------------------
CopyAllDefaults Boolean 所有預設值
CopyAllObjects Boolean 所有物件
CopyAllRules Boolean 所有規則
CopyAllStoredProcedures Boolean 所有儲存過程
CopyAllTables Boolean 所有表
CopyAllTriggers Boolean 所有觸發器
CopyAllUserDefinedDatatypes Boolean 所有使用者自定義型別
CopyAllViews Boolean 所有檢視
CopyData Boolean 所有資料
DestDatabase String 目標物件資料庫
DestLogin String 目標資料庫登陸使用者名稱
DestPassword String 目標資料庫登陸密碼
DestServer String 目標伺服器
DestUseTrustedConnection Boolean 使用者信任連線
DropDestObjectsFirst Boolean 是否先刪除目標物件
IncludeDependencies Boolean 是否包含依靠物件
ScriptType Boolean 指令碼型別
-- 2. 重要方法:
方法名稱 功能描述
--------------------------- --------------------------
AddObject 增加物件
AddObjectByName 通過物件名稱增加物件
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
/*-- 在 SQLServer 中使用SQLDMO.Transfer 實現資料遷移
儲存過程實現源資料庫到目標資料庫的物件和資料的複製
要求源資料庫和目標資料庫在同一伺服器
如果是要實現不同伺服器之間的複製,則需要增加驗證資訊
--鄒建 2005.07(引用請保留此資訊)--*/
/*--呼叫示例
CREATE DATABASE test
EXEC P_CopyDB @Source_DB='northwind',@Des_DB='test'
DROP DATABASE test
--*/
CREATE PROCEDURE P_CopyDB
@Des_DB sysname, --目標資料庫
@Obj_Type nvarchar(4000)=N'',--複製的物件型別,可以是下列字串列表:
-- O 所有物件,D 預設值,R 規則,P 儲存過程
-- T 表,TR 觸發器,DT 使用者定義資料型別
-- V 檢視,DATA 資料,DEL 刪除目標物件
@Source_DB sysname=N'', --源資料庫
@ServerName sysname=N'', --伺服器名
@UserName sysname=N'', --使用者名稱,不指定則表示使用 Windows 身份登入
@pwd sysname=N'' --密碼
AS
SET NOCOUNT ON
DECLARE @srvid int,@Dbid int,@S_dbid int,@D_dbid int,@TransferID int,
@err int,@src varchar(255), @desc varchar(255)
IF ISNULL(@ServerName,N'')=N'' SET @ServerName=@@SERVERNAME
IF ISNULL(@Source_DB,N'')=N'' SET @Source_DB=DB_NAME()
--建立sqldmo物件·
EXEC @err=sp_oacreate 'sqldmo.sqlserver',@srvid OUT
IF @err<>0 GOTO lb_Err
--連線伺服器
IF ISNULL(@UserName,N'')=N'' --使用 Windows 身份登入
BEGIN
EXEC @err=sp_oasetproperty @srvid,'loginsecure',-1
IF @err<>0 GOTO lb_Err
EXEC @err=sp_oamethod @srvid,'connect',NULL,@servername
END
ELSE
EXEC @err=sp_oamethod @srvid,'connect',NULL,@servername,@UserName,@pwd
IF @err<>0 GOTO lb_Err
--獲取資料庫集
EXEC @err=sp_oagetproperty @srvid,'databases',@Dbid OUT
IF @err<>0 GOTO lb_Err
--選擇源資料庫
EXEC @err=sp_oamethod @Dbid,'item',@S_dbid OUT,@Source_DB
IF @err<>0 GOTO lb_Err
--選擇目標資料庫
EXEC @err=sp_oamethod @Dbid,'item',@D_dbid OUT,@Des_DB
IF @err<>0 GOTO lb_Err
--設定複製的物件
EXEC @err=sp_oacreate 'SQLDMO.Transfer',@TransferID OUT
IF @err<>0 GOTO lb_Err
--設定目標伺服器資訊
EXEC @err=sp_oasetproperty @TransferID,'DestServer',@ServerName
IF @err<>0 GOTO lb_Err
--設定連線使用者
IF ISNULL(@UserName,N'')=N'' --使用 Windows 身份登入
BEGIN
EXEC @err=sp_oasetproperty @TransferID,'DestUseTrustedConnection',1
IF @err<>0 GOTO lb_Err
END
ELSE
BEGIN
EXEC @err=sp_oasetproperty @TransferID,'DestLogin',@UserName
IF @err<>0 GOTO lb_Err
EXEC @err=sp_oasetproperty @TransferID,'DestPassword',@pwd
IF @err<>0 GOTO lb_Err
END
--設定複製物件資訊
EXEC @err=sp_oasetproperty @TransferID,'DestDatabase',@Des_DB
IF @err<>0 GOTO lb_Err
DECLARE tb CURSOR FAST_FORWARD LOCAL
FOR
SELECT Name FROM(
SELECT KeyWord=N',D,', Name=N'CopyAllDefaults' UNION ALL
SELECT KeyWord=N',O,', Name=N'CopyAllObjects' UNION ALL
SELECT KeyWord=N',R,', Name=N'CopyAllRules' UNION ALL
SELECT KeyWord=N',P,', Name=N'CopyAllStoredProcedures' UNION ALL
SELECT KeyWord=N',T,', Name=N'CopyAllTables' UNION ALL
SELECT KeyWord=N',TR,', Name=N'CopyAllTriggers' UNION ALL
SELECT KeyWord=N',DT,', Name=N'CopyAllUserDefinedDatatypes' UNION ALL
SELECT KeyWord=N',V,', Name=N'CopyAllViews' UNION ALL
SELECT KeyWord=N',DATA,',Name=N'CopyData' UNION ALL
SELECT KeyWord=N',DEL,', Name=N'DropDestObjectsFirst'
)A WHERE CHARINDEX(KeyWord,
CASE WHEN ISNULL(@Obj_Type,N'')='' THEN ',O,DATA,' ELSE @Obj_Type END)>0
OPEN tb
FETCH tb INTO @src
WHILE @@FETCH_STATUS=0
BEGIN
EXEC @err=sp_oasetproperty @TransferID,@src,1
IF @err<>0 GOTO lb_Err
FETCH tb INTO @src
END
CLOSE tb
DEALLOCATE tb
--複製物件
EXEC @err=sp_oamethod @S_dbid,'Transfer',null,@TransferID
IF @err<>0 GOTO lb_Err
--結束
SET @err=0
GOTO lb_Exit
--錯誤處理
lb_Err:
EXEC sp_oageterrorinfo NULL, @src OUT, @desc OUT
RAISERROR(N'錯誤編號 %#x, 錯誤源 "%s", 錯誤描述 "%s"',16,1,@err,@src,@desc)
RETURN -1
lb_Exit:
EXEC sp_OADestroy @Dbid
EXEC sp_OADestroy @srvid
EXEC sp_OADestroy @TransferID
RETURN @err
GO