国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > SQL Server > 正文

在SQL Server 中使用SQLDMO

2024-08-31 00:50:40
字體:
來源:轉載
供稿:網(wǎng)友

    曾幾何時,伙伴們?yōu)閿?shù)據(jù)庫的升級傷透了腦筋.往往程序的升級趕不上數(shù)據(jù)庫的升級(版本控制的好,這也許不是什么問題,但對于很大一部分中國公司來說這是無法避免的).而有些n久以前的數(shù)據(jù)庫要使用新程序的時候,數(shù)據(jù)庫的升級簡直就是無從下手.所以對比數(shù)據(jù)庫升級的緊要性就逐漸的凸現(xiàn)出來.對于表和字段的升級按道理來說是不難的,通過sysobjects與syscolumns的比較很容易的可以找到不同之處,然后增加沒有的對象即可.而對于視圖和存儲過程等非表對象的更新就有些為難了(當然視圖和存儲過程如果用手工的辦法是很簡單的).一個在于如何生成對象腳本,另一個在于如何執(zhí)行.大家都知道syscomments表中藏有此類對象的腳本,人們肯定會優(yōu)先考慮開采這個寶庫.當站在字符型變量最大只能存儲8000個字符時,這簡直就是一個不可逾越的障礙.人們又想從導出文本腳本然后執(zhí)行這個思路著手時,又發(fā)現(xiàn)從字段中取出的腳本有個天然的缺陷:換行問題.(最后發(fā)現(xiàn),這個問題也是可以解決的).萬般無奈下人們把渴望的目光集中到了SQLDMO上,她的身上總散發(fā)著無所不能的光芒.

    當Transfer對象的美妙身材展現(xiàn)在人們眼前的時候,大家都對她的美麗所折服——這不正是我們所尋找的嗎?她的動人之處就在于可以把一個數(shù)據(jù)庫的對象腳本保存在內(nèi)存中,然后連接到另一個數(shù)據(jù)庫上執(zhí)行.太棒了!現(xiàn)在我們來看看她的輪廓吧:

重要屬性:

CopyAllDefaults                         Boolean             所有默認值

CopyAllObjects                          Boolean             所有對象

CopyAllRules                             Boolean             所有規(guī)則

CopyAllStoredPRocedures           Boolean                    所有存儲過程

CopyAllTables                            Boolean             所有表

CopyAllTriggers                         Boolean             所有觸發(fā)器

CopyAllUserDefinedDatatypes      Boolean                       所有用戶自定義類型

CopyAllViews                             Boolean             所有視圖

CopyData                                   Boolean             所有數(shù)據(jù)

DestDatabase                                    String               目標對象數(shù)據(jù)庫

DestLogin                                  String               目標數(shù)據(jù)庫登陸用戶名

DestPassWord                             String               目標數(shù)據(jù)庫登陸密碼

DestServer                                 String               目標服務器

DestUseTrustedConnection          Boolean                  用戶信任連接

DropDestObjectsFirst                  Boolean             是否先刪除目標對象

IncludeDependencies                   Boolean             是否包含依靠對象

ScriptType                                  Boolean             腳本類型

重要方法:

AddObject                   增加對象

AddObjectByName            通過對象名稱增加對象

好了,大家應該對這個對象略有些了解了.對SQLDMO熟悉的人也許一下子就可以從中得到靈感,而初學者在這里恐怕還是一頭霧水.不過不用著急,具體用法我們會慢慢道來:

CREATE PROCEDURE  P_UDB --以源數(shù)據(jù)庫為模板升級目標數(shù)據(jù)庫

(  @Source_DB                  sysname                     --原數(shù)據(jù)庫

  ,@Des_DB                     sysname                     --目標數(shù)據(jù)庫

  ,@UserName                   sysname                     --用戶名

  ,@psw                        sysname                     --密碼

 )

 AS

set nocount on

--/*  局部變量聲明

declare  @ObjName              sysname

                 ,@SrvID            int                     --服務器ID

                 ,@DBsId            int                     --數(shù)據(jù)庫集ID

                 ,@transferID      int                     --傳輸ID

                 ,@SDBId            int                     --源數(shù)據(jù)庫ID

                 ,@DDBID            int                     --目標數(shù)據(jù)庫ID

                 ,@SViewListID     int                     --源數(shù)據(jù)庫視圖列表 

                 ,@DViewListID     int                     --目標數(shù)據(jù)庫視圖列表 

                 ,@str              Nvarhar(4000)

                 ,@name             sysname

                 ,@hr               int                    --執(zhí)行語句返回值

                 ,@Error           int                       --錯誤返回值(999:存儲過程或觸發(fā)器錯誤;9999:視圖錯誤)

--*/            

--/*創(chuàng)建sqldmo對象  前面我們已經(jīng)說過SQLDMO是個com,在SQL Server中使用OLE --自動化對象需要用到sp_OACreate等一系列的存儲過程,讀者如果有不明白的可以自--己查閱相關資料

exec @hr=sp_oacreate 'SQLDMO.sqlserver',@SrvID output

if @hr<>0

begin

  set @Error=1

  goto PEnd

end

--*/

--/*連接服務器

exec @hr=sp_oamethod @SrvID,'connect',null,@@ServerName,@UserName,@psw

if @hr<>0

begin

  set @Error=2

  goto PEnd

end

--*/

--/*取數(shù)據(jù)庫集

exec @hr=sp_oagetproperty @SrvID,'databases',@DBsId output

--*/

--/*選擇源數(shù)據(jù)庫   

exec @hr=sp_oamethod @DBsId,'item',@SDBId output,@Source_DB

if @hr<>0

begin

  set @Error=3

  goto PEnd

end

--*/

--/*選擇目標數(shù)據(jù)庫   

exec @hr=sp_oamethod @DBsId,'item',@DDBId output,@Des_DB

if @hr<>0

begin

  set @Error=4

  goto PEnd

end

--*/

/*Tansfer屬性設置(生成三大對象)

exec @hr=sp_oacreate         'SQLDMO.Transfer',@transferID output

exec @hr=sp_oasetproperty   @transferID,'DestServer',@@ServerName

exec @hr=sp_oasetproperty   @transferID,'DestLogin',@UserName

exec @hr=sp_oasetproperty   @transferID,'DestPassword ',@psw

exec @hr=sp_oasetproperty   @transferID,'DestDatabase',@des_DB

exec @hr=sp_oasetproperty   @transferID,'DropDestObjectsFirst ',1

exec @hr=sp_oasetproperty   @transferID,'CopyAllStoredProcedures ',1

exec @hr=sp_oasetproperty   @transferID,'CopyAllTriggers',1

exec @hr=sp_oasetproperty   @transferID,'CopyAllViews',1

--exec @hr=sp_oasetproperty   @transferID,'ScriptType ',1 這里大家可以試試這個屬性

exec @hr=sp_oamethod  @DDBId,'Transfer ',null,@transferID

exec sp_OADestroy @TransferID 

if @hr<>0

  begin

    set @Error=10

    goto PEnd

  end

*/

PEnd:

  exec @hr = sp_OAMethod @SrvID, 'DisConnect' 

  exec sp_OADestroy @SrvID 

  print (@Error)

  Return (@Error)

GO

    上邊的存儲過程只要是介紹方法的實現(xiàn),而具體的功能比如表及字段的比較生成這里就省略了.

    其實有一個大家最后也沒能解決好的問題就是對象依賴的問題.許多對象比如視圖里嵌視圖,這時生成與執(zhí)行需要有順序的.雖然有算法但有缺陷.希望讀者能可以提供好的算法.


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 宾阳县| 稷山县| 莲花县| 株洲县| 宾川县| 屯门区| 清水河县| 新郑市| 台山市| 祁东县| 河东区| 栖霞市| 南雄市| 长丰县| 乐平市| 鄂伦春自治旗| 井研县| 新野县| 乐安县| 商都县| 夹江县| 太和县| 张北县| 莒南县| 澄江县| 辛集市| 东丽区| 手机| 武汉市| 涟源市| 揭西县| 津市市| 阳春市| 富源县| 孟州市| 文化| 怀宁县| 新田县| 阿克苏市| 商河县| 兴安盟|