SSIS 延迟验证方法
验证是一个事件,该事件在package执行时,第一个被触发,验证能够避免ssis引擎执行一个有异常的package或task。延迟验证(delayvalidation)是把验证操作延迟到package真正运行(run-time)时开始执行,当禁用延迟验证时,一旦验证操作返回错误(error)或警告(warning),package就不会继续执行下去。在更新海量的数据时,通常需要用到暂存表把远端数据加载到本地,这就需要在package执行之后,创建暂存表(staging table);在package执行之后,删除暂存表,当禁用延迟验证时。当禁用延迟验证时,验证操作在package执行之前,会检测暂存表是否存在,由于暂存表需要在package执行之后创建,因此,验证事件发出错误消息,package停止运行,这对这种情况,必须使用延迟验证,在真正引用到暂存表时,延迟暂存表是否存在。
一,延迟验证属性
延迟验证属性作用于package,task,容器(container)和链接管理器(connection manager),默认情况下,禁用延迟验证,这就意味着,在package执行时,首先验证package,task,容器和链接管理器引用的对象是否有效,如果有任何对象不存在,那么验证失败,package停止运行。
在package开始执行之前,验证package,能够尽早发现错误,避免浪费系统资源去执行一个必定会失败的package,合理配置,会带来性能的优化。
二,验证方式
按照验证的执行顺序来看,package包含两种类型的验证方式:
package validation:在package执行时,首先验证package及其包含的所有组件,是package级别的验证;
组件验证:组件级别的验证,包含task , connection manager和container,在组件开始执行之前,验证组件中引用对象的有效性。
验证分为两个阶段(phrase),首先进行package级别的验证,而后进行组件级别的验证:
package级别的验证包含组件级别的验证,如果禁用延迟验证,那么组件级别的验证会执行两次,这在设计package时,不是一个好的选择,这会增加package的验证时间,还会增加每一次打开package进行编辑的时间。而启用延迟验证,这会禁用了package 级别的验证,以至于在package的设计时(design-time),只执行组件级别的验证,注意,任何情况下,无法禁用组件级别的验证。
通常情况下,对一个完成开发的package启用延迟验证,是一个好的选择,这会减少package整体的执行时间,因为跳过了package级别的验证。
1,禁用延迟验证
禁用package的延迟验证,需要设置package的delayvalidation属性值为false,默认情况下,packag会禁用延迟验证,如下图所示:
那么在package开始运行之后,第一件事就是开始执行package validation,当package级别的验证操作完成之后,开始验证package包含的各个task等,如果验证发现错误,package不会被执行,直接报错。
2,启用延迟验证
启用package的延迟验证,需要设置package的delayvalidation属性值为true,如下图所示:
当启用延迟验证时,package会执行下去,知道运行到特定的组件时,才会执行组件验证,如果组件验证失败,那么抛出错误消息,停止package的运行。
组件验证发生真正执行组件,如果上流组件新建一个暂存表(staging table),下游组件引用该暂存表,并不会出现异常,这是因为在该组件进行验证时,该暂存表已经存在。
三,延迟验证属性的层次结构
在package级别上设置delayvalidation属性并不能阻止打开package时的最初的验证过程,它只是在运行包时延迟package级别的验证,这就意味着package将继续运行,但是当打开package时警报仍然出现。如果想阻止打开package时的验证,那么必须把task级别上的delayvalidation属性设置为true。
避免验证链接管理器,有时,是一个非常节省开发时间的选择。有时打开package的过程会花费很长的时间,这可能是因为它引用了一个远程数据源,而数据源的响应很缓慢,或者链接不上。如果我们正在开发一个包,并且需要经常打开这个包,那么我们可能需要花费很长的时间来等待ssis验证一个数据源。在这样的情况下,在任务级设置delayvalidation属性为true可以为我们节省大量的时间。
示例1,验证操作只会验证属性的完整性
设置package level的属性delayvalidation=false,task level的属性delayvalidation=false
package的处理流程如下图所示,package级别的validation在create staging table的validation之前开始,在insert data的validation之后结束,从图中能看到insert data的验证完成,实际上,验证操作并没有检查出一个非常简单的语法错误,直到task真正执行时,才发现错误,这说明,验证操作只会验证task属性的完整性,效果是有限的。
示例2,验证操作会验证引用的对象是否存在
设置package level的属性delayvalidation=false,task level的属性delayvalidation=false,在data flow task中,ole db source组件从一个当前不存在的表dbo.delay_test中selelct数据:
在执行package时,ssis弹出“package validation error”窗体,这就是package级别上的验证发现的错误:
设置package level的属性delayvalidation=false,task data flow task的属性delayvalidation=true,重新执行,package成功执行。
示例3,打开package的验证
设置package level的属性delayvalidation=true,task level的属性delayvalidation=false,在打开package时,task data flow task上面是有红色x号的,当设置task level的属性delayvalidation=true时,在打开package时,task data flow task上面的红色x符号消失,这说明,在打开package时,验证操作已经开始,并且task 级别的验证属性会覆盖上层的验证。
以上三个示例说明,在打开package,设计package和运行package时,ssis引擎都会对package进行验证,并且package的验证操作是优层次结构的,底层的延迟验证会覆盖上层的延迟验性。
以上这篇ssis 延迟验证方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。