Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SSIS:为什么序列容器需要TransactionOption Required来报告任务失败?_Sql Server_Ssis - Fatal编程技术网

Sql server SSIS:为什么序列容器需要TransactionOption Required来报告任务失败?

Sql server SSIS:为什么序列容器需要TransactionOption Required来报告任务失败?,sql-server,ssis,Sql Server,Ssis,我有一项工作,可以从各种非数据库源在网络文件夹中创建文件。在作业中,我将序列容器中包含的各种文件创建任务与每个枚举器的移动文件任务隔离开来,以防止各种文件创建任务产生优先约束: 数据流任务,其中包含使用C和LDAP从Active Directory提取数据并将其输出到多个文件的脚本组件 从SFTP下载文件的脚本组件实现WinSCPNET.dll 成功完成后,序列容器将转到foreach文件枚举器,将提取的文件移动到一个文件夹,该文件夹指示文件已准备好加载-这里没有问题 但是,在生产过程中出现了一

我有一项工作,可以从各种非数据库源在网络文件夹中创建文件。在作业中,我将序列容器中包含的各种文件创建任务与每个枚举器的移动文件任务隔离开来,以防止各种文件创建任务产生优先约束:

数据流任务,其中包含使用C和LDAP从Active Directory提取数据并将其输出到多个文件的脚本组件 从SFTP下载文件的脚本组件实现WinSCPNET.dll 成功完成后,序列容器将转到foreach文件枚举器,将提取的文件移动到一个文件夹,该文件夹指示文件已准备好加载-这里没有问题

但是,在生产过程中出现了一个间歇性问题,即AD连接在文件提取过程完成之前终止,导致部分文件。这在测试中没有观察到,但应该考虑到-我的问题。因此,我在序列容器外部添加了一个foreach枚举器,该枚举器具有故障优先约束,用于删除这些部分提取文件

在测试此修复程序的过程中,我将序列容器中的一个任务设置为报告失败。最初,序列容器报告成功,因此绕过delete-foreach枚举器。我尝试将MaximumErrorCount从0设置为1,但这并没有导致所需的行为更改。然后,我将序列容器的TransactionOption从supported更改为required,这似乎解决了问题。现在,作业将移动完全提取的文件,同时删除报告提取错误的文件


我的问题是:这条路线是否存在潜在问题?我不确定这个解决方案为什么有效。联机文档讨论了数据库连接上下文中的TransactionOption。但是,在这种情况下,没有与数据库的连接。我只是不想发布一个可能有我不知道的潜在bug的补丁。

关于事务和文件。 假设您使用NTFS或其他支持事务的文件系统将文件写入磁盘。然后,所有文件创建和文件保存操作都包含在一个事务中。如果事务因任务失败而失败,则事务中创建的所有文件都将回滚,即删除。 因此,您将对文件采用全有或全无的方法,仅当所有提取都成功时才接收文件。
若您将文件存储在非事务性文件系统(如旧FAT)上,则“全有或全无”将不再起作用,您将收到部分文件集。在序列上设置的事务将没有这种效果

这是有道理的——如果微软将他们的文档扩展到这一点,那将是很有帮助的。但是,我离题了。无论如何,我还是禁用了delete-foreach枚举器,发现当任务报告失败时,文件没有被删除。所以,我仍然需要这一步。但是,理解这个解决方案为什么有效是件好事。非常感谢。