Domanda

Questa domanda originariamente poneva quale fosse il metodo migliore per caricare file tramite SFTP o FTPS in SSIS. Ora elenca solo i pro e i contro di ogni soluzione. Oggi uso personalmente la libreria SFTP di CozyRoc, ma ho usato ciascuna delle soluzioni seguenti in un punto o nell'altro.

LIBRERIA DEI COMPONENTI SSIS

Metodo: installa una libreria di componenti SSIS da CozyRoc , Codeplex , BizCrypto , PragmaticWorks o qualche altro fornitore su ciascun server di sviluppo e produzione e utilizzare l'attività SFTP per caricare i file.

Pro: facile da usare. Sembra, odora e si sente come una normale attività SSIS. SSIS riconosce anche la password come informazioni riservate e ti offre tutte le normali opzioni per proteggere le informazioni sensibili invece di memorizzarle in testo chiaro in modo non sicuro. Funziona bene con altre attività SSIS come ForEach Loop Containers. Errori quando upload e download falliscono. Funziona bene quando non conosci i nomi dei file sul sito FTP remoto da scaricare o quando non conosci il nome del file da caricare fino al runtime.

Contro: ad eccezione della soluzione Codeplex, questo costa denaro in licenza in un ambiente di produzione. Richiede l'installazione delle librerie su ogni macchina di sviluppo e produzione. Se si tratta della soluzione Codeplex, si sta utilizzando un software non supportato da alcun fornitore specifico. Questo ti rende anche dipendente dal fornitore per aggiornare le loro librerie tra ogni versione. Ad esempio, prima del 2008 RTM, stavo sviluppando un nuovo server su una versione CTP del 2008 e la libreria CozyRoc 2005 era incompatibile con esso. Alla fine hanno rilasciato una versione compatibile del 2008, ma ho dovuto utilizzare temporaneamente la soluzione della riga di comando per aggirare questo problema.

PROGRAMMA SFTP DELLA LINEA DI COMANDO

Metodo: installare un'applicazione SFTP a riga di comando gratuita come Putty e WinSCP ed eseguirla eseguendo un file batch o un'attività di processo del sistema operativo. Le istruzioni per farlo tramite WinSCP sono elencate qui .

Pro: gratuito, gratuito e gratuito. Puoi essere sicuro che sia sicuro se stai usando Putty poiché numerosi client FTP della GUI sembrano usare Putty sotto le copertine. Sicuramente sai che stai usando SSH2 e non SSH.

Contro: le due utility da riga di comando che ho provato (Putty e Cygwin) hanno richiesto l'archiviazione della password SFTP in una posizione non sicura. Non ho trovato un buon modo per catturare errori o errori durante il caricamento dei file. Il processo non ha l'aspetto e l'odore di SSIS. Gran parte del codice è incapsulato in file di testo anziché nello stesso SSIS. Difficile da usare se non si conosce il nome esatto del file che si sta caricando o scaricando.

UNA LIBRERIA DI TERZE PARTI C # o VB.NET

Metodo: installa una libreria SFTP o FTPS e usa un'attività Script che fa riferimento alla libreria per caricare i file. (Non l'ho mai provato, quindi indovinerò pro e contro)

Pro: probabilmente facili errori di acquisizione. Dovrebbe funzionare bene con le variabili, quindi sarebbe probabilmente facile da usare anche quando non si conosce il nome esatto del file che si sta caricando o scaricando.

Contro: è un'attività di script combinata con le librerie .NET. Se si utilizza SSIS, probabilmente si è più a proprio agio con le attività SSIS rispetto al codice .NET. Le attività di script sono inoltre difficili da risolvere poiché non dispongono degli stessi strumenti e funzionalità di debug dei normali progetti .NET. Crea una dipendenza da codice di terze parti che potrebbe non funzionare tra diverse versioni di SQL Server. Ad essere onesti, è probabilmente PIÙ probabile che funzioni tra versioni diverse di SQL Server rispetto a una libreria di attività SSIS di terze parti. Un altro enorme con - Non ho ancora trovato una libreria C # o VB.NET gratuita che lo faccia ancora. Quindi, se qualcuno ne conosce uno, per favore fatemelo sapere!

È stato utile?

Soluzione

Potrebbe essere utile la seguente domanda:

Quale sarebbe una scelta consigliata del componente SSIS da eseguire Attività SFTP o FTPS?

Cozyroc:

Dovrebbe essere facile testare la disponibilità del protocollo ssh impostando il server su " consentire solo SSHv2 " e test. Hai provato a chiedere al reparto vendite di Cosy?

Sftp dalla riga di comando:

Il problema del nome file sconosciuto potrebbe essere risolto tramite script / utilizzo semplici di caratteri jolly (almeno in Cygwin).

Lib di terze parti:

Perché hai bisogno di una libreria di terze parti per FTPS? .NET supporta questo protocollo dalla 2.0 in poi.

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

Altri suggerimenti

Volevo solo fornire un aggiornamento su ciò che abbiamo effettivamente deciso di fare per risolvere i problemi SFTP in SSIS. Ecco la ripartizione di quello che è successo:

  1. Inizialmente ho provato a usare Putty e alcuni file batch per caricare file, ma era difficile catturare errori. Inoltre, stavo archiviando le nostre credenziali SFTP in file di testo chiaro poiché faceva parte degli script di caricamento di Putty.

  2. Abbiamo acquistato una licenza CozyRoc per il nostro server SSIS per circa duecento dollari all'anno e sono completamente soddisfatto dei risultati dell'utilizzo del loro prodotto. Con il prodotto CozyRoc, l'attività del flusso di controllo genera errori in caso di problemi con il caricamento. Dal momento che ho anche diversi programmatori SSIS junior nel mio team, è stato più facile per loro capire come impostare l'attività del flusso di controllo piuttosto che utilizzare il metodo degli script Putty. Infine, la password viene crittografata utilizzando la crittografia nativa di SSIS per proteggere i dati sensibili. Non ho più password memorizzate in chiaro sul mio server.

Ho esaminato alcune delle altre librerie di terze parti consigliate in questa domanda, ma sembra che CozyRoc fosse il più economico dei fornitori e che avesse anche alcune altre attività SSIS che sono stato in grado di utilizzare nel mio team BI . Grazie, CozyRoc!

Senza componente, è possibile utilizzare l'attività di script. Vedi questo 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top