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
文章到此已经达到我们的目标。总体上说,2.2这步的实现有些困难,在实现过程当中也碰到过很多困难,有一些是在新闻组中得到的解答,其它的步骤查看msdn都可以得到比较容易的解决。www.yestar2000itbulo.comwp3xq