1. 目標 www.yestar2000itbulo.comwp3xq ms sql server做大數據量傳輸的時候,我們大多會用到數據傳輸服務。現在假設,在開發環境下,我們已經設計好了dts包并且運行良好,接下來我們要做的事情是遷移和部署這個dts數據包。www.yestar2000itbulo.comwp3xq
所以,我們需要把設計環境下的dts包保存成結構化的存儲文件,并且這個文件導入到目標環境下的ms sql server中,最后添加作業,讓ms sql server angent在我們預期的事情執行這個dts包完成數據傳輸工作。其中需要重點解決的一個問題是,在目標環境中,dts傳輸的源和目的地會發生改變,需要對它進行配置。 www.yestar2000itbulo.comwp3xq
2. 解決方案 www.yestar2000itbulo.comwp3xq
2.1. dtsrun www.yestar2000itbulo.comwp3xq
dtsrun是微軟提供的命令用于執行dts包(包括結構化存儲的、存儲在sql server或存儲在meta data services的包)。 www.yestar2000itbulo.comwp3xq
dtsrun的用法: www.yestar2000itbulo.comwp3xq
| dtsrun [/?]| [ [ /[~]s server_name[/instance_name] { {/[~]u user_name [/[~]p password]} | /e } ] { {/[~]n package_name } | {/[~]g package_guid_string} | {/[~]v package_version_guid_string} } [/[~]m package_password] [/[~]f filename] [/[~]r repository_database_name] [/a global_variable_name:typeid=value] [/l log_file_name] [/w nt_event_log_completion_status] [/z] [/!x] [/!d] [/!y] [/!c] ] |
www.yestar2000itbulo.comwp3xq 具體的用法參看微軟的資料。這里需要重點指出的是,通過“/a global_variable_name:typeid=value”選項,我們可以給dts包傳遞多個自定義的參數,在dts包部署的目標環境下,我們用這個選項告訴dts包服務器名稱、用戶名、密碼等數據庫連接信息。通過“/!y”選項可以獲取加密后的dtsrun參數。 www.yestar2000itbulo.comwp3xq
2.2. 重新設計dts包 www.yestar2000itbulo.comwp3xq
為了處理dtsrun傳入的自定義參數,dts包需要重新設計。我們可以增加一個activex script任務,在activex script任務中通過vb script或者java script對dts編程,并且定義流程,把activex script任務設置成最開始的一個任務。由于dts com對象線程模式與activex script任務宿主的不一致,需要將activex script任務工作流屬性設置成在主包線程中執行,否則可能會出現調用錯誤。 www.yestar2000itbulo.comwp3xq
下面的例子是activex script任務中的腳本。例子中的dts包包含名稱為"dbconnection"的數據庫連接對象。 www.yestar2000itbulo.comwp3xq
| '************************************************************************ ' visual basic activex script '************************************************************************ function main() dim sdbdatasource dim sdbcatalog dim sdbuserid dim sdbpassword dim bdbusetrusted dim solapserver dim solapcatalog dim opackage dim oconnection dim otask dim ocustomtask ' 獲取dtsrun傳入的自定義參數 sdbdatasource = dtsglobalvariables("dbdatasource").value sdbcatalog = dtsglobalvariables("dbcatalog").value sdbuserid = dtsglobalvariables("dbuserid").value sdbpassword = dtsglobalvariables("dbpassword").value bdbusetrusted = dtsglobalvariables("dbusetrusted").value solapserver = dtsglobalvariables("olapserver").value solapcatalog = dtsglobalvariables("olapcatalog").value ' 取得當前dts包對象的技巧 set opackage = dtsglobalvariables.parent ' 取得包中的數據連接對象 set oconnection = opackage.connections("dbconnection")www.yestar2000itbulo.comwp3xq ' 配置數據源對象的數據連接信息 if bdbusetrusted then oconnection.usetrustedconnection = bdbusetrusted else oconnection.userid = sdbuserid oconnection.password = sdbpassword end ifwww.yestar2000itbulo.comwp3xq |
www.yestar2000itbulo.comwp3xq
| oconnection.datasource = sdbdatasource oconnection.catalog = sdbcatalog set oconnection = nothingwww.yestar2000itbulo.comwp3xq ' 配置跟多的信息,這里是olap分析服務處理任務 set otask = opackage.tasks("dtstask_dtsolapprocess.certificate") set ocustomtask = otask.customtask set otask = nothing ocustomtask.properties("treekey").value = solapserver & "/" _ & solapcatalog & "/cubefolder/certificate" set ocustomtask = nothing ' 返回成功狀態 main = dtstaskexecresult_success end functionwww.yestar2000itbulo.comwp3xq |
www.yestar2000itbulo.comwp3xq 2.3. 保存為結構化的存儲文件 www.yestar2000itbulo.comwp3xq
這個過程相當的簡單,通過企業管理器可以完成。另存為的結構化存儲文件就是我們要分發的dts包。 www.yestar2000itbulo.comwp3xq
2.4. 導入到ms sql server www.yestar2000itbulo.comwp3xq
我們需要通過dts編程來實現這個過程。需要強調的是,下面這段示例需要在apartmentstate為sta線程中才可以正確的被調用。 www.yestar2000itbulo.comwp3xq
| public void go() { dts.package2class pkg = new dts.package2class(); dts.application app = new dts.applicationclass();www.yestar2000itbulo.comwp3xq //從sql server中刪除已經存在的同名dts包 try { pkg.removefromsqlserver( dbserver, dbsuserid, dbspassword, dts.dtssqlserverstorageflags.dtssqlstgflag_default, "", www.yestar2000itbulo.comwp3xq |
www.yestar2000itbulo.comwp3xq
| "", pkgname ); } catch { }www.yestar2000itbulo.comwp3xq //取得待分發dts包(結構化的存儲文件)的包信息,這里假定包中只包含一個版本 dts.savedpackageinfos infos = pkg.getsavedpackageinfos(uncfile); dts.savedpackageinfo info = infos.item(1);www.yestar2000itbulo.comwp3xq object obj1 = null; object obj2 = null; string spkgid = info.packageid; string sverid = info.versionid; string spkgname = info.packagename;www.yestar2000itbulo.comwp3xq //載入結構化的存儲文件 pkg.loadfromstoragefile( uncfile, pkgpwd, spkgid, sverid, spkgname, ref obj1 ); //保存到sql server中 pkg.savetosqlserveras( pkgname, dbserver, dbsuserid, dbspassword, dts.dtssqlserverstorageflags.dtssqlstgflag_default, pkgownerpwd, pkgoperatorpwd, "", ref obj2, false); pkg.uninitialize();www.yestar2000itbulo.comwp3xq |
www.yestar2000itbulo.comwp3xq
www.yestar2000itbulo.comwp3xq
| //檢查是否保存成功 dts.packagesqlserver pkgsqlserver = app.getpackagesqlserver( dbserver, dbsuserid, dbspassword, dts.dtssqlserverstorageflags.dtssqlstgflag_default ); dts.packageinfos infs = pkgsqlserver.enumpackageinfos(pkgname, true, ""); if (infs.eof) throw new exception("dts包導入到數據庫失敗。"); dts.packageinfo inf = infs.next(); www.yestar2000itbulo.comwp3xq mpkgid = inf.packageid; mverid = inf.versionid; }www.yestar2000itbulo.comwp3xq |
www.yestar2000itbulo.comwp3xq 2.5. 添加作業 www.yestar2000itbulo.comwp3xq
添加作業可以用傳統的方式,用sql語句可做到,不做詳細說明。ms sql server更是提供一系列的存儲過程對作業進行修改,以達到用戶預期的效果。www.yestar2000itbulo.comwp3xq
3. 小結 www.yestar2000itbulo.comwp3xq
文章到此已經達到我們的目標??傮w上說,2.2這步的實現有些困難,在實現過程當中也碰到過很多困難,有一些是在新聞組中得到的解答,其它的步驟查看msdn都可以得到比較容易的解決。www.yestar2000itbulo.comwp3xq