注册
 找回密码
 注册
江西广告网
查看: 240|回复: 0
打印 上一主题 下一主题

MS SQL Server2k数据转换服务部署

[复制链接]

该用户从未签到

1
跳转到指定楼层
发表于 2009-1-15 08:31:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册

x
  1. 目标   MS SQL Server做大数据量传输的时候,我们大多会用到数据传输服务。现在假设,在开发环境下,我们已经设计好了DTS包并且运行良好,接下来我们要做的事情是迁移和部署这个DTS数据包。      所以,我们需要把设计环境下的DTS包保存成结构化的存储文件,并且这个文件导入到目标环境下的MS SQL Server中,最后添加作业,让MS SQL Server Angent在我们预期的事情执行这个DTS包完成数据传输工作。其中需要重点解决的一个问题是,在目标环境中,DTS传输的源和目的地会发生改变,需要对它进行配置。      2. 解决方案   2.1. DTSRun      DTSRun是微软提供的命令用于执行DTS包(包括结构化存储的、存储在SQL Server或存储在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]   ]      具体的用法参看微软的资料。这里需要重点指出的是,通过“/A global_variable_name:typeid=value”选项,我们可以给DTS包传递多个自定义的参数,在DTS包部署的目标环境下,我们用这个选项告诉DTS包服务器名称、用户名、密码等数据库连接信息。通过“/!Y”选项可以获取加密后的DTSRun参数。      2.2. 重新设计DTS包      为了处理DTSRun传入的自定义参数,DTS包需要重新设计。我们可以增加一个ActiveX Script任务,在ActiveX Script任务中通过VB Script或者Java Script对DTS编程,并且定义流程,把ActiveX Script任务设置成最开始的一个任务。由于DTS COM对象线程模式与ActiveX Script任务宿主的不一致,需要将ActiveX Script任务工作流属性设置成在主包线程中执行,否则可能会出现调用错误。      下面的例子是ActiveX Script任务中的脚本。例子中的DTS包包含名称为"DBConnection"的数据库连接对象。         '************************************************************************   ' 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")      ' 配置数据源对象的数据连接信息   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分析服务处理任务   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 Function      2.3. 保存为结构化的存储文件      这个过程相当的简单,通过企业管理器可以完成。另存为的结构化存储文件就是我们要分发的DTS包。      2.4. 导入到MS SQL Server      我们需要通过DTS编程来实现这个过程。需要强调的是,下面这段示例需要在ApartmentState为STA线程中才可以正确的被调用。      public void Go()   {   DTS.Package2Class pkg = new DTS.Package2Class();   DTS.Application app = new DTS.ApplicationClass();      //从SQL SERVER中删除已经存在的同名DTS包   try   {   pkg.RemoveFromSQLServer(   DBServer,   DBSUserID,   DBSPassword,   DTS.DTSSQLServerStorageFlags.DTSSQLStgFlag_Default,   "",      "",   PkgName   );   }   catch   {   }      //取得待分发DTS包(结构化的存储文件)的包信息,这里假定包中只包含一个版本   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;      //载入结构化的存储文件   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包导入到数据库失败。");   DTS.PackageInfo inf = infs.Next();      mPkgID = inf.PackageID;   mVerID = inf.VersionID;   }      2.5. 添加作业      添加作业可以用传统的方式,用SQL语句可做到,不做详细说明。MS SQL Server更是提供一系列的存储过程对作业进行修改,以达到用户预期的效果。      3. 小结   总体上说,2.2这步的实现有些困难,在实现过程当中也碰到过很多困难,有一些是在新闻组中得到的解答,其它的步骤查看MSDN都可以得到比较容易的解决。 <
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表