


MS SQL Server2k數(shù)據(jù)轉(zhuǎn)換服務(wù)部署
MS SQL Server做大數(shù)據(jù)量傳輸?shù)臅r(shí)候,我們大多會(huì)用到數(shù)據(jù)傳輸服務(wù)。現(xiàn)在假設(shè),在開(kāi)發(fā)環(huán)境下,我們已經(jīng)設(shè)計(jì)好了DTS包并且運(yùn)行良好,接下來(lái)我們要做的事情是遷移和部署這個(gè)DTS數(shù)據(jù)包。
所以,我們需要把設(shè)計(jì)環(huán)境下的DTS包保存成結(jié)構(gòu)化的存儲(chǔ)文件,并且這個(gè)文件導(dǎo)入到目標(biāo)環(huán)境下的MS SQL Server中,最后添加作業(yè),讓MS SQL Server Angent在我們預(yù)期的事情執(zhí)行這個(gè)DTS包完成數(shù)據(jù)傳輸工作。其中需要重點(diǎn)解決的一個(gè)問(wèn)題是,在目標(biāo)環(huán)境中,DTS傳輸?shù)脑春湍康牡貢?huì)發(fā)生改變,需要對(duì)它進(jìn)行配置。
2. 解決方案
2.1. DTSRun
DTSRun是微軟提供的命令用于執(zhí)行DTS包(包括結(jié)構(gòu)化存儲(chǔ)的、存儲(chǔ)在SQL Server或存儲(chǔ)在Meta Data Services的包)。
dtsrun的用法:
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]
]
具體的用法參看微軟的資料。這里需要重點(diǎn)指出的是,通過(guò)“/A global_variable_name:typeid=value”選項(xiàng),我們可以給DTS包傳遞多個(gè)自定義的參數(shù),在DTS包部署的目標(biāo)環(huán)境下,我們用這個(gè)選項(xiàng)告訴DTS包服務(wù)器名稱、用戶名、密碼等數(shù)據(jù)庫(kù)連接信息。通過(guò)“/!Y”選項(xiàng)可以獲取加密后的DTSRun參數(shù)。
2.2. 重新設(shè)計(jì)DTS包
為了處理DTSRun傳入的自定義參數(shù),DTS包需要重新設(shè)計(jì)。我們可以增加一個(gè)ActiveX 任務(wù),在ActiveX 任務(wù)中通過(guò)VB 或者Java 對(duì)DTS編程,并且定義流程,把ActiveX 任務(wù)設(shè)置成最開(kāi)始的一個(gè)任務(wù)。由于DTS COM對(duì)象線程模式與ActiveX 任務(wù)宿主的不一致,需要將ActiveX 任務(wù)工作流屬性設(shè)置成在主包線程中執(zhí)行,否則可能會(huì)出現(xiàn)調(diào)用錯(cuò)誤。
下面的例子是ActiveX 任務(wù)中的腳本。例子中的DTS包包含名稱為"DBConnection"的數(shù)據(jù)庫(kù)連接對(duì)象。
'************************************************************************
' Visual Basic ActiveX
'************************************************************************
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傳入的自定義參數(shù)
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
' 取得當(dāng)前DTS包對(duì)象的技巧
Set oPackage = DTSGlobalVariables.Parent
' 取得包中的數(shù)據(jù)連接對(duì)象
Set oConnection = oPackage.Connections("DBConnection")
' 配置數(shù)據(jù)源對(duì)象的數(shù)據(jù)連接信息
If bDBUseTrusted Then
oConnection.UseTrustedConnection = bDBUseTrusted
Else
oConnection.UserID = sDBUserID
oConnection.Password = sDBPassword
End If
oConnection.DataSource = sDBDataSource
oConnection.Catalog = sDBCatalog
Set oConnection = nothing
' 配置跟多的信息,這里是OLAP分析服務(wù)處理任務(wù)
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
' 返回成功狀態(tài)
Main = DTSTaskExecResult_Success
End Function
2.3. 保存為結(jié)構(gòu)化的存儲(chǔ)文件
這個(gè)過(guò)程相當(dāng)?shù)暮?jiǎn)單,通過(guò)企業(yè)管理器可以完成。另存為的結(jié)構(gòu)化存儲(chǔ)文件就是我們要分發(fā)的DTS包。
2.4. 導(dǎo)入到MS SQL Server
我們需要通過(guò)DTS編程來(lái)實(shí)現(xiàn)這個(gè)過(guò)程。需要強(qiáng)調(diào)的是,下面這段示例需要在ApartmentState為STA線程中才可以正確的被調(diào)用。
public void Go()
{
DTS.Package2Class pkg = new DTS.Package2Class();
DTS.Application app = new DTS.ApplicationClass();
//從SQL SERVER中刪除已經(jīng)存在的同名DTS包
try
{
pkg.RemoveFromSQLServer(
DBServer,
DBSUserID,
DBSPassword,
DTS.DTSSQLServerStorageFlags.DTSSQLStgFlag_Default,
"",
"",
PkgName
);
}
catch
{
}
//取得待分發(fā)DTS包(結(jié)構(gòu)化的存儲(chǔ)文件)的包信息,這里假定包中只包含一個(gè)版本
DTS.SavedPackageInfos infos = pkg.GetSavedPackageInfos(UNCFile);
DTS.SavedPackageInfo info = infos.Item(1);
object obj1 = null;
object obj2 = null;
string sPkgID = info.PackageID;
string sVerID = info.VersionID;
string sPkgName = info.PackageName;
//載入結(jié)構(gòu)化的存儲(chǔ)文件
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();
//檢查是否保存成功
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包導(dǎo)入到數(shù)據(jù)庫(kù)失敗。");
DTS.PackageInfo inf = infs.Next();
mPkgID = inf.PackageID;
mVerID = inf.VersionID;
}
2.5. 添加作業(yè)
添加作業(yè)可以用傳統(tǒng)的方式,用SQL語(yǔ)句可做到,不做詳細(xì)說(shuō)明。MS SQL Server更是提供一系列的存儲(chǔ)過(guò)程對(duì)作業(yè)進(jìn)行修改,以達(dá)到用戶預(yù)期的效果。
3. 小結(jié)
文章到此已經(jīng)達(dá)到我們的目標(biāo)。總體上說(shuō),2.2這步的實(shí)現(xiàn)有些困難,在實(shí)現(xiàn)過(guò)程當(dāng)中也碰到過(guò)很多困難,有一些是在新聞組中得到的解答,其它的步驟查看MSDN都可以得到比較容易的解決。
關(guān)鍵字:SQL Server、數(shù)據(jù)、企業(yè)管理器
新文章:
- CentOS7下圖形配置網(wǎng)絡(luò)的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS單網(wǎng)卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗(yàn)證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網(wǎng)打印機(jī)IP講解
- CentOS7使用hostapd實(shí)現(xiàn)無(wú)AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網(wǎng)絡(luò)重啟出錯(cuò)
- 解決Centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統(tǒng)有什么不同呢
- Centos 6.6默認(rèn)iptable規(guī)則詳解