在将新文件主动写入源目录时,如何安全地将文件导入 ssis 中的 sql server?

Posted

技术标签:

【中文标题】在将新文件主动写入源目录时,如何安全地将文件导入 ssis 中的 sql server?【英文标题】:how can I safely import files to sql server in ssis while new files are actively being written to the source directory? 【发布时间】:2019-09-12 17:22:08 【问题描述】:

我每天需要将很多xml文件导入sql server。我正在考虑每隔几分钟运行一个 for each 循环容器以将文件导入 db 表,然后将它们移动到另一个目录,但有时每分钟都会将十几个新文件写入源文件夹。如果包在新文件被写入文件夹的确切时刻试图循环遍历文件夹,这是否会成为一个问题?如果是这样,我该如何解决这个问题?

【问题讨论】:

SSIS 在读取时通常会尝试打开文件进行编辑,因此如果将文本文件写入 SSIS 可能会失败。 我们通常将文件移动到我们控制的新文件夹中。完成后,我们将它们移动到另一个文件夹。然后,我们总是知道什么在等待,什么在进行中,什么已经完成。作为另一种方法,我们重命名文件以完成相同的控制 ssis 中的文件系统任务也是这样吗?这意味着我必须完全使用 ssis 之外的方法将文件移动到暂存文件夹吗? 如果你问它是一个脚本任务,那么回答是肯定的。 【参考方案1】:

您可以遍历脚本任务中的文件并尝试将它们移动到 try/catch 中的单独“ReadyToProcess”文件夹。如果文件正在被另一个进程使用,则捕获 IOException,然后继续处理下一个文件。跳过的文件将在下次运行时被拾取。然后遍历“ReadyToProcess”中的文件以将它们读入数据库。

【讨论】:

【参考方案2】:

您似乎知道哪些文件已完成写入以及哪些文件仍在修改中,这使事情变得容易一些。重要的是要记住:如果您的 SSIS 任务尝试打开当前正在被另一个进程修改或使用的文件,则 SSIS 包将失败。

您可以通过使用脚本任务在某个时间点在源文件夹中生成文件列表并使用 for 或 foreach 循环仅获取生成列表中的文件来解决此问题。正如您的帖子所暗示的那样,这与获取源文件夹中的所有内容形成对比。

其他解决方案是批量处理传入的文件并抵消包执行时间,这样就不会在将文件导入源文件夹时将文件导出到 SQL 的风险。

例如,每 30 分钟分批加载源文档:1:00、1:30、2...

每 30 分钟执行一次您的 SSIS 任务,但从批处理偏移 15 分钟:1:15、1:45、2:15...

最后,如果可能,在没有新文件写入源文件夹的时间段运行 SSIS 包。虽然并非总是可能,但如果您知道凌晨 2 点不会有任何新文档进来,那将是安排 SSIS 包的最佳时间。

【讨论】:

以上是关于在将新文件主动写入源目录时,如何安全地将文件导入 ssis 中的 sql server?的主要内容,如果未能解决你的问题,请参考以下文章

Azure Blob 存储 - 在将新文件上传到 Blob 容器中的特定文件夹时设置警报

如何正确地将文本文件传递给 NSFileManager

sh 使用find with print0安全地将带有任何合法字符的文件名或文件路径写入数组并迭代它们。

在将输出写入文件时使用多处理显示来自子进程的实时输出

如何将目录设置为具有持久组权限?

无法将新帐户信息写入 csv 文件