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
Ssis 通过SSI访问SFTP或FTPS文件的最佳方法_Ssis_Service_Integration_Sftp_Ftps - Fatal编程技术网

Ssis 通过SSI访问SFTP或FTPS文件的最佳方法

Ssis 通过SSI访问SFTP或FTPS文件的最佳方法,ssis,service,integration,sftp,ftps,Ssis,Service,Integration,Sftp,Ftps,这个问题最初是问在SSIS中通过SFTP或FTPS上传文件的最佳方法。现在只列出了每种解决方案的优缺点。这些天我个人使用CozyRoc的SFTP库,但我在某个时候使用过下面的每个解决方案 SSIS组件库 方法:在每个开发和生产服务器上安装来自、或其他供应商的SSIS组件库,并使用SFTP任务上载文件 优点:易于使用。它的外观、气味和感觉都像一个普通的SSIS任务。SSIS还将密码识别为敏感信息,并允许您使用所有常规选项来保护敏感信息,而不仅仅是以非安全方式以明文形式存储。可以很好地与其他SSIS

这个问题最初是问在SSIS中通过SFTP或FTPS上传文件的最佳方法。现在只列出了每种解决方案的优缺点。这些天我个人使用CozyRoc的SFTP库,但我在某个时候使用过下面的每个解决方案

SSIS组件库

方法:在每个开发和生产服务器上安装来自、或其他供应商的SSIS组件库,并使用SFTP任务上载文件

优点:易于使用。它的外观、气味和感觉都像一个普通的SSIS任务。SSIS还将密码识别为敏感信息,并允许您使用所有常规选项来保护敏感信息,而不仅仅是以非安全方式以明文形式存储。可以很好地与其他SSIS任务(如ForEach循环容器)配合使用。上载和下载失败时出错。当您不知道远程FTP站点上要下载的文件的名称,或者在运行时之前不知道要上载的文件的名称时,该方法非常有效

缺点:除了Codeplex解决方案之外,在生产环境中进行许可需要花费金钱。需要在每台开发和生产计算机上安装库。如果是Codeplex解决方案,那么您使用的是任何特定供应商都不支持的软件。这也使您依赖于供应商在每个版本之间更新其库。例如,在2008 RTM'd之前,我在2008的CTP版本上开发一个新服务器,CozyRoc 2005库与之不兼容。最终他们发布了一个与2008年兼容的版本,但我不得不暂时使用命令行解决方案来解决这个问题

命令行SFTP程序

方法:安装一个免费的命令行SFTP应用程序,如Putty和WinSCP,并通过运行批处理文件或操作系统进程任务来执行它。下面列出了通过WinSCP执行此操作的说明

优点:免费,免费,免费。如果您使用Putty,您可以确保它是安全的,因为许多GUI FTP客户端似乎都在幕后使用Putty。您肯定知道您使用的是SSH2,而不是SSH

缺点:我尝试的两个命令行实用程序(Putty和Cygwin)需要将SFTP密码存储在一个不安全的位置。我还没有找到一个好方法来捕获上传文件时的失败或错误。这个过程看起来和闻起来都不像SSI。大部分代码封装在文本文件中,而不是SSI本身。如果您不知道正在上载或下载的文件的确切名称,则很难使用

第三方C#或VB.NET库

方法:安装SFTP或FTPS库,并使用引用该库的脚本任务上载文件。(我从未尝试过这个,所以我将猜测其利弊)

优点:可能很容易捕捉错误。应该可以很好地处理变量,因此即使您不知道正在上载或下载的文件的确切名称,也很容易使用


缺点:这是一个与.NET库相结合的脚本任务。如果您使用的是SSIS,那么您可能比.NET代码更熟悉SSIS任务。脚本任务也很难排除故障,因为它们没有与常规.NET项目相同的调试工具和功能。创建对可能无法在不同版本的SQL Server之间工作的第三方代码的依赖关系。公平地说,与第三方SSIS任务库相比,它更有可能在不同版本的SQL Server之间工作。另一个巨大的弊病——我还没有找到一个免费的C#或VB.NET库来实现这一点。所以如果有人知道一个,请告诉我

以下问题可能有用:

Cozyroc:

通过将服务器设置为“仅允许SSHv2”并进行测试,应该可以很容易地测试ssh协议的可用性。你试过问Cozy的销售部吗

命令行sftp:

未知文件名问题可以通过编写脚本/使用通配符(至少在Cygwin下)来解决

第三方库:

为什么FTPS需要第三方库。NET从2.0左右开始支持此协议


我只是想提供一个更新,说明我们为解决SSI中的SFTP问题实际决定做些什么。下面是所发生事情的细目:

  • 我最初尝试使用Putty和一些批处理文件来上传文件,但很难捕获错误。另外,我将我们的SFTP凭证存储在明文文件中,因为它是Putty上传脚本的一部分

  • 我们以每年几百美元的价格为SSIS服务器购买了CozyRoc许可证,我对使用他们产品的结果完全满意。对于CozyRoc的产品,如果上传有任何问题,控制流任务将引发错误。由于我的团队中还有几个初级SSIS程序员,因此他们更容易理解如何设置控制流任务,而不是使用Putty脚本方法。最后,使用SSIS的本机加密对密码进行加密,以保护敏感数据。我的服务器上不再存储任何明文密码


  • 我确实回顾了在这个问题中推荐的一些其他第三方库,但CozyRoc似乎是最便宜的供应商,他们还有一些我可以在我的BI团队中使用的其他SSIS任务。谢谢,科兹罗克

    如果没有组件,您可以使用脚本任务。看


    对于免费解决方案,FTPS看起来不错,除非我必须使用SFTP。因为我更希望有一个架构来处理这两种场景,所以我可能会依赖命令行sftp。对于付费解决方案,CozyRoc、SecureBackbox和Rebex看起来都不错。谢谢仅仅用sftp前缀命名变量并不能使其成为sftp。。。
    Imports System
    Imports Microsoft.SqlServer.Dts.Runtime
    Imports Ftp
    Imports System.IO
    
    Public Class ScriptMain
    
        Public Sub Main()
    
            Try
    
                Dim cm As ConnectionManager = Dts.Connections.Add("FTP")
                cm.Properties("ServerName").SetValue(cm, Dts.Variables("SFTPServerName").Value.ToString)
                cm.Properties("ServerUserName").SetValue(cm, Dts.Variables("SFTPLogin").Value.ToString)
                cm.Properties("ServerPassword").SetValue(cm, Dts.Variables("SFTPPassword").Value.ToString)
                cm.Properties("ServerPort").SetValue(cm, Dts.Variables("SFTPPortNumber").Value.ToString)
                cm.Properties("Timeout").SetValue(cm, "0")
                cm.Properties("ChunkSize").SetValue(cm, "0") '1000 kb
                cm.Properties("Retries").SetValue(cm, "0")
                Dts.Variables("Continue").Value = 0
    
                Dim ftp As FtpClientConnection = New FtpClientConnection(cm.AcquireConnection(Nothing))
                Dim FilesList() As String
                Dim FolderName() As String
    
                Dim Separator As String = ";"
    ' \\ServerName\Share1;\\ServerName\Share2 : Local copy
                Dim FolderLocalListSrc As String = Dts.Variables("FolderLocalListSrc").Value.ToString
                Dim FolderLocalListDst() As String = Split(FolderLocalListSrc, Separator)
                Dim Counter As Integer
    
                ftp.Connect()
                ftp.GetListing(FolderName, FilesList)
    
                If FilesList IsNot Nothing Then
    
                    Dim FileName As String
    
                    For Each FileName In FilesList
    
                        Dim FileToProcess(0) As String
                        Dim FileToMove(0) As String
    
                        For Counter = 0 To FolderLocalListDst.GetUpperBound(0)
    
                            FileToProcess(0) = FileName
                            FileToMove(0) = FolderLocalListDst(Counter) + FileName
    
                            If (File.Exists(FileToMove(0)) = False) Then
    
                                ' Téléchargement en local
                                ftp.ReceiveFiles(FileToProcess, FolderLocalListDst(Counter), True, True)
    
                            End If
    
                        Next
    
                        ' Upload du fichier dans les archives du FTP
                        ftp.SendFiles(FileToMove, "/Archives", True, False)
    
                        ' Suppression du fichier à la racine du FTP
                        ftp.DeleteFiles(FileToProcess)
    
                    Next
    
                End If
    
                ftp.Close()
    
                Dts.TaskResult = Dts.Results.Success
            Catch ex As Exception
                Dts.TaskResult = Dts.Results.Failure
            End Try
    
        End Sub
    
    End Class