您的位置主页 > MYSQL

MS SQL Server2k数据转换服务部署

  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都可以得到比较容易的解决。