1. 程式人生 > >SQL Server學習_資料庫複製

SQL Server學習_資料庫複製

資料庫複製

在網上看到一個數據庫複製,感覺挺有意思的 一般情況下最好定期備份,這只是練習

/**
*複製表結構的通用儲存過程 
*/ 
-- 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