SSIS中如何实现延迟验证

51次阅读
没有评论

共计 3039 个字符,预计需要花费 8 分钟才能阅读完成。

这篇文章给大家分享的是有关 SSIS 中如何实现延迟验证的内容。丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,一起跟随丸趣 TV 小编过来看看吧。

验证是一个事件,该事件在 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 中如何实现延迟验证”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-04发表,共计3039字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)