Pergunta

Esta questão originalmente perguntou qual é o melhor método para upload de arquivos via SFTP ou FTPS no SSIS. Agora apenas lista os prós e contras de cada solução. Eu pessoalmente uso biblioteca SFTP do CozyRoc estes dias, mas eu usei cada um dos abaixo soluções em um ponto ou outro.

SSIS componente de biblioteca

Método: Instalar uma biblioteca de componentes SSIS a partir CozyRoc , Codeplex , BizCrypto , PragmaticWorks , ou algum outro fornecedor em cada servidor de desenvolvimento e produção e usar a tarefa de SFTP para carregar os arquivos.

Prós: Fácil de usar. Parece, cheiros, e se sente como uma tarefa normal de SSIS. SSIS também reconhece a senha como informações confidenciais e permite-lhe todas as opções normais para proteger as informações sensíveis em vez de apenas armazenando-o em texto claro de uma forma não segura. Funciona bem com outras tarefas SSIS como Loop Foreach Containers. Erros fora quando uploads e downloads falhar. Funciona bem quando você não sabe os nomes dos arquivos no site FTP remoto para baixar ou quando você não sabe o nome do arquivo para carregar até run-time.

Contras: Com exceção da solução Codeplex, isso custa dinheiro para licença em um ambiente de produção. Requer a instalação das bibliotecas em cada máquina de desenvolvimento e produção. Se é a solução Codeplex, então você está usando um software que não é suportado por qualquer fornecedor específico. Isso também faz você dependente do fornecedor para atualizar suas bibliotecas entre cada versão. Por exemplo, antes de 2008 RTM'd, eu estava desenvolvendo um novo servidor em uma versão CTP de 2008 e a biblioteca CozyRoc 2005 foi incompatível com ele. Eventualmente, eles lançaram uma versão compatível 2008, mas eu tive que usar temporariamente a solução linha de comando para contornar esse problema.

LINHA DE COMANDO SFTP PROGRAMA

Método: Instalar um aplicativo gratuito SFTP de linha de comando, como Putty e WinSCP e executá-lo seja pela execução de um arquivo de lote ou operar tarefa processo do sistema. Instruções para fazer isso via WinSCP estão listados aqui .

Prós: Livre, livre, e livre. Você pode ter certeza que é seguro se você estiver usando Putty desde numerosos clientes GUI de FTP parecem usar Putty debaixo das cobertas. Você definitivamente sabe que você está usando SSH2 e não SSH.

Contras: Os dois utilitários de linha de comando Eu tentei (Putty e Cygwin) necessário armazenar a senha SFTP em um local não seguro. Eu não encontrei uma boa maneira de falhas de captura ou erros quando o upload de arquivos. O processo não olhar e cheirar como SSIS. A maioria do código é encapsulado em arquivos de texto em vez de si SSIS. Difíceis de usar se você não sabe o nome exato do arquivo que você está enviando ou download.

A 3rd party C # ou VB.NET BIBLIOTECA

Método: Instalar uma biblioteca SFTP ou FTPS e usar uma tarefa de script que faz referência a biblioteca para carregar os arquivos. (Eu nunca tentei isso, então eu vou adivinhar os prós e contras)

Prós: Provavelmente fácil de erros de captura. Deve funcionar bem com variáveis, por isso provavelmente seria fácil de usar, mesmo quando você não sabe o nome exato do arquivo que você está enviando ou download.

Contras: É uma tarefa de script combinado com .NET bibliotecas. Se você estiver usando SSIS, então provavelmente você está mais confortável com tarefas SSIS, em seguida, o código .NET. tarefas de script também são difíceis de solucionar problemas desde que eles não têm as mesmas ferramentas de depuração e recursos como projetos regulares .NET. Cria uma dependência de código do 3o partido que pode não funcionar entre as versões diferentesdo SQL Server. Para ser justo, é provavelmente mais propensos a trabalhar entre diferentes versões do SQL Server que um terceiro biblioteca de tarefas do partido SSIS. Outra grande con - Eu não encontrei um livre C # ou VB.NET biblioteca que faz isso ainda. Então, se alguém souber de uma, então por favor me avise!

Foi útil?

Solução

A seguinte pergunta pode ser de uso:

O que seria uma escolha recomendada de componente SSIS para executar SFTP ou FTPS tarefa?

CozyRoc:

Deve ser fácil de teste ssh disponibilidade protocolo definindo o servidor para "permitir que apenas SSHv2" e testes. Ter o seu tentou pedir Cozy departamento de vendas?

Linha de comando sftp:

O problema filename desconhecido poderia ser resolvido simples scripting / uso de wildcards (pelo menos sob Cygwin).

3rd party lib:

Por que você precisa de um terço lib festa para FTPS? NET apoiou esta protocolo de desde 2,0 ou menos.

http://msdn.microsoft.com /en-us/library/system.net.ftpwebrequest.enablessl.aspx

Outras dicas

Eu só queria fornecer uma atualização sobre o que realmente decidi fazer para resolver os problemas de SFTP em SSIS. Aqui está o resumo do que aconteceu:

  1. Inicialmente, eu tentei usar o Putty e alguns arquivos em lotes para fazer upload de arquivos, mas era difícil de erros de captura. Além disso, eu estava armazenando nossas credenciais SFTP em arquivos de texto claros, uma vez que fazia parte dos scripts de upload Putty.

  2. Nós adquiriu uma licença CozyRoc para o nosso servidor SSIS para algumas centenas de dólares por ano e eu estou completamente satisified com os resultados do uso de seu produto. Com o produto do CozyRoc, a tarefa de fluxo de controle gera erros se houver qualquer problema com o upload. Desde que eu também tenho vários programadores júnior SSIS em minha equipe, que era mais fácil para eles entenderem como configurar a tarefa de fluxo de controle do que usar o método de scripts Putty. E, finalmente, a senha é criptografada usando a criptografia nativa do SSIS para proteger dados sensíveis. Eu já não tenho quaisquer senhas armazenadas em texto claro no meu servidor.

Eu fiz rever algumas das outras bibliotecas do 3o partido que foram recomendadas nesta questão, mas parece CozyRoc foi o mais barato dos fornecedores e eles também tiveram algumas outras tarefas SSIS que eu tenho sido capaz de usar no meu time BI . Obrigado, CozyRoc!

Sem componente, você pode usar tarefa de script. Consulte este link

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top