Metodo migliore per i file SFTP o FTPS tramite SSIS [chiuso]
-
03-07-2019 - |
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!
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:
-
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.
-
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