ValidateExternalMetadata属性是什么?它具体是做什么的?

3
我有一个程序包,它从表中读取数据,并根据列值将记录存储在另外两个表中。该程序包使用事务必需属性。直到最近,当我在源表上创建了一个非聚集索引以提高性能时,程序包才运行得很顺利。但是,在显示“验证已开始”的进度后,该程序包拒绝执行。
有两件事可以解决这个问题:
1. 使用聚集索引而不是非聚集索引。 2. 将ValidateExternalMetadata属性设置为False。
我不必同时使用两者,只需使用其中之一即可使程序包运行顺畅。我选择了选项1,但我不明白底层发生了什么。我的问题是:
1. 当您将属性设置为false时,除了检查列元数据之外,还会发生什么? 2. 为什么非聚集索引会导致验证问题?
PS:在表上之前没有索引。
2个回答

13

在前一个答案中链接到的KB应该可以解决这个具体问题,但并没有完全解释ValidateExternalMetadata标志的作用。

大多数与外部系统交互的SSIS组件(例如Lookup Transform或Source/Destination组件)都会定义外部元数据列,这些列代表组件正在交互的表/视图/查询中的列。此元数据信息会缓存在包文件(.dtsx)中。

验证阶段,组件应检查包中缓存的元数据是否仍然与底层表/视图/查询同步。如果存在不匹配,组件将返回特殊状态(VS_NEEDSNEWMETADATA)。当这在设计时发生时,SSIS通过调用ReinitializeMetadata()触发元数据刷新。在运行时,这将导致错误。

由于元数据验证可能很耗时(例如具有许多列的大型表),因此ValidateExternalMetadata标志可以设置为false以禁用此验证。通常,您只需要在确保包和底层表/视图/查询保持同步时才会这样做。


0

这可能是解释:

http://support.microsoft.com/kb/2253391

当你在 Microsoft SQL Server 中为一个包启用 DTC 事务时,SQL Server Integration Services (SSIS) 包的执行响应停止。


谢谢Chris。我看过了,但它没有解释里面发生了什么。 - Faiz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接