SSIS是SQL Server Intergration Service的缩写,是SQL Server 2005才有的新成员,从名字可以看出是用来整合数据的,微软非常NB得把它归类到BI feature(商业智能)中。和上次的VSTO一样,其实SSIS并不是新东西,在SQL Server 2000甚至更早版本中,我们见过它的雏形--DTS。当年DTS的作用可以简单地认为是用来读写各种支持OLE DB的数据源中的数据,再简单一点就是用来在不同数据库之间复制数据。SSIS基本内容虽然也是如此,但是SSIS变得强大了很多。对于开发者来说, DTS顶多是一个工具,而SSIS演变成一套框架,框架提供了数据相关的控制流、数据转换、日志、变量、event、连接管理等基础设施。微软提供了基于 VS的可视化设计器,将这些基础设施方便地组合起来,就可以完成数据转换、集成的任务。SSIS的体系结构图在这里可以看到。
上面说的东西可能还有点不够具体,接下来说得具体一点。撇开日志啊,事件啊什么的不说,对于数据从一个数据源到另一个数据源转换的任务,至少需要知道源、目标、转换方法三类信息,三类信息经过某种组合可以完成比较复杂的任务,比如:源-->转换1-->转换2-->转换3-->目标,此时,上一个转换的输出就是下一个转换的输入。在SSIS里,每一个转换都对应一个Data Flow对象,将Data Flow对象经过某种逻辑串接起来,就可以完成上面那种转换任务。需要注意的是,源和目标都是特殊的Data Flow,源只有输出,而目标只有输入。
简单的转换,用Data Flow就能搞定,如果转换中涉及到分支啊,循环啊,还有一些与数据无关的操作,比如发送Email等等,Data Flow就完成不了了(从设计上来说,也不应该让Data Flow承载全部这些杂七杂八的功能)。这时候又来了一组对象--Control Flow。它完成上述“杂七杂八”的任务,Control Flow中有一个特殊对象,它能包含一些Data Flow对象,这样Control Flow就能干正事了。也就是说,Data Flow成为了Control Flow的一部分,而且是最重要的一部分--试想你整个任务都是些杂七杂八的工作,反而没有数据转换,这不是不务正业么?这一切的Flow,组合起来是一个任务,在SSIS里叫包(Package)。
上面说又有点琐碎了,总结一下。一个数据集成任务在SSIS里叫包,用户在需要完成某种数据集成任务的时候建立一个包,再通过创建Control Flow的组件/对象,并将它们连起来的方法,告诉SSIS这个任务的具体流程。这个流程中有一个或多个步骤是关于数据转换的,这时又需要通过建立Data Flow对象和连接这些对象来告诉SSIS到底如何做这个数据转换。这么说还是有点晕的话,再做一个类比。工作流大家都知道吧?Control Flow就相当于一个为数据集成特化的工作流,每一个步骤对应一个Control Flow的对象。而数据转换相关的步骤有点特殊,虽然它也是Control Flow对象,但它包含了一些Data Flow对象,用以描述/提供数据转换的具体算法。
SSIS经过上述机制,提供了一个强大的数据集成框架。问题又来了,强大是强大了,灵活是灵活了,但是易用性呢?不能指望每个用户都写程序组装这些Data Flow和Control Flow再扔给SSIS跑吧。万一别人不太会写程序呢?微软提供的解决方案是向导(Wizard)+可视化设计器的方式。向导封装了一些简单而普遍的数据集成任务,用户只需要回答一些问题,向导自动会生成好相应的包。对于高级一点的用户,SSIS的可视化设计器允许用户在图形解密那上通过拖拽生成和连接Data Flow和Control Flow。
下面稍微提一点关于定制开发的内容。SSIS确实提供了很多现成的、完善的Data Flow和Control Flow操作,但是如果客户想要把自己的逻辑嵌入到整个集成过程中呢?SSIS也提供了解决方法:制作继承自特定接口/类的类,并封装成.net assembly或者COM组件嵌入到Package中供SSIS runtime调用。
要想定制自己的Data Flow组件,用户需要继承自Microsoft.SQLServer.Dts.Pipeline.PipelineComponent,在这里可以找到详细的帮助。对于Control Flow,用户需要继承自Microsoft.SQLServer.Dts.Runtime.Task,在这里有详细帮助。当然,SSIS可供定制的东西不仅仅是这些,包括连接管理器、日志、For循环等等都是可以定制的。
对于Data Flow和Control Flow的定制有一些地方需要注意,首先是需要注意区分从基类继承的函数中哪些是在Design-time(设计时)被调用,那些是在Runtime(运行时)被调用。你需要考虑你的对象能够在可视化设计器中被正常的使用。另外注意事件、消息、进度等触发的机制--不是使用throw exception, 也不是delegate,而是通过调用传入参数componentEvents或events的相应方法完成。另外,Data Flow由于涉及到具体的数据转换,所以相关联的类及PipelineComponent本身的结构有点复杂。Control Flow就简单多了。
写了这么多,只是希望大家在能通过这篇文章,了解一下SSIS的大概。不要被MSDN那些官方化而形式化的语言弄得一头雾水。要是你被这篇文章搞得更加一头雾水~~~那~~~我也没办法了-_-