數據轉換服務(DTS)在數據庫管理和開發的多種領域都有會涉及DTS:
數據倉庫-將數據從原始的處理系統和表格中提取出來以供報表使用
建立OLAP
將大量數據從文本文件或其它非數據庫格式的文件中拷貝到數據庫
生成Microsoft Office文檔報表
使用 Distributed Transaction Coordinator (DTC)實現多數據庫操作
在客戶的桌面程序或網站上,經常需要允許用戶按需執行DTS包。在這種情況下,在部署DTS包時,你應該決定將DTS包安置在何處,以及通過何種手段調用它。
你的選擇
要建立一個按需執行的DTS包,可以有多種選擇。下面就對這些選擇進行逐一說明。
SQL Server job
你可以在SQL Server裡建立一個job,並調用sp_start_job存儲過程。使用sp_start_job的不足之處在於它是一個異步過程。由於它不能返回成功或失敗指示,你必須強制使用sp_help_job系統存儲過程查詢job的結果。除非不關心job調用後的結果,否則異步的job將使桌面程序或Web程序變得很復雜。一個job可以被設置成非管理員(sa)模式,但需要一些額外的步驟。
在客戶端桌面使用DTS DLLs
第二種方法是用戶電腦載入Enterprise Manager或DTS DLLs,在用戶的電腦上調用DTS包。雖然用戶電腦執行DTS包有一定可行性,但也有不足:必須考慮到升級DTS包帶來的分發和安裝問題。
在服務器上使用sp_OA 擴展存儲過程
第三種選擇,也就是本文所介紹的核心內容,就是使用sp_OA系統存儲過程族並有計劃的調用DTS包。這種方案可以有效的避免上兩種方案的弊端。
使用 VBScript調用DTS包
實現一個可以運行DTS包的存儲過程的第一步是,編寫一段VBScript代碼。因為sp_OA存儲過程使用起來有些麻煩,因此在利用sp_OA存儲過程實現目標之前,要用VBScript編寫你希望實現的代碼。一般傾向於使用Visual Basic進行簡單的腳本開發工作。如圖A所示,通過在項目引用窗口中加入DTS包對象庫,就可以在腳本中引用DTS包對象了。
Sp_OAGetProperty、sp_OASetProperty以及sp_OAMethod用來連接對象庫中的特性和函數。和VB或 VBScript不同的是,sp_OA存儲過程導致的COM+錯誤不會令SQL語句失敗,因此必須手動檢查每個使用sp_OA的函數是否工作正常。
同時,很多sp_OA存儲過程都會引用參數,因此必須在sp_OA存儲過程中的適當參數後加入OUTPUT語句。如果省略了OUTPUT 語句,T-SQL也不會發出警告信息。因此在運行時狀態,雖然存儲過程運行正常但也不會返回正確值。列表B是一個詳細的實現代碼。
解決方案中包括可以重命名DTS包的表格以及實現的過程。其中sp_AdRunDTSPackageOnServer存儲過程接收一個ID參數。在繼續執行前,程序會從T_AdDTSPackageSetup表中,查找到達DTS包的SQL Server路徑。
安全性
詳細的安全性問題不在本文的討論范圍,這裡要說的是一些必須考慮到的基本問題:
在主數據庫的sp_OA擴展系統存儲過程中,實現sp_AdRunDTSPackageOnServer存儲過程需要EXECUTE權限。為了防止一些惡意用戶通過sp_OA過程實現某種目的,可以針對應用程序修改SQL Server規則,以加強安全性。
T-SQL的CURRENT_USER函數對系統安全會有稍許幫助。使用CURRENT_USER和T_AdDTSPackageSetup表格中的區域,可以查詢某個用戶是否被設為:使用給定的DTS包。
DTS包在SQL Server上執行時,會受到SQL Server Agent服務的帳戶設置影響,如果從文件系統中讀取ASCII文件,應該確定SQL Server Agent的帳戶設置對該文件有通過許可。
擴展范例
可以使用sp_OA系統存儲過程與其