Question

À l'origine, cette question demandait quelle était la meilleure méthode pour télécharger des fichiers via SFTP ou FTPS dans SSIS. Il ne fait maintenant que lister les avantages et les inconvénients de chaque solution. Personnellement, j’utilise la bibliothèque SFTP de CozyRoc ces derniers temps, mais j’ai utilisé chacune des solutions ci-dessous à un moment ou à un autre.

BIBLIOTHEQUE DE COMPOSANTS SSIS

Méthode: Installez une bibliothèque de composants SSIS à partir de de CozyRoc , Codeplex , BizCrypto , PragmaticWorks ou un autre fournisseur sur chaque serveur de développement et de production et utilisez la tâche SFTP pour télécharger les fichiers.

Avantages: facile à utiliser. Cela ressemble, sent et ressemble à une tâche SSIS normale. SSIS reconnaît également le mot de passe en tant qu'information confidentielle et vous offre toutes les options habituelles pour protéger les informations confidentielles au lieu de simplement les stocker en texte clair de manière non sécurisée. Fonctionne bien avec d'autres tâches SSIS telles que les conteneurs de boucles ForEach. Erreurs de sortie lorsque les téléchargements et les téléchargements échouent. Fonctionne bien lorsque vous ne connaissez pas les noms des fichiers sur le site FTP distant à télécharger ou lorsque vous ne connaissez pas le nom du fichier à télécharger jusqu'au moment de l'exécution.

Inconvénients: à l’exception de la solution Codeplex, l’achat de licences dans un environnement de production coûte cher. Nécessite l'installation des bibliothèques sur chaque machine de développement et de production. S'il s'agit de la solution Codeplex, vous utilisez un logiciel qui n'est pris en charge par aucun fournisseur spécifique. Cela vous rend également dépendant du fournisseur pour mettre à jour ses bibliothèques entre chaque version. Par exemple, avant 2008 RTM'd, je développais un nouveau serveur sur une version CTP de 2008 et la bibliothèque CozyRoc 2005 était incompatible avec celle-ci. Finalement, ils ont publié une version compatible 2008, mais je devais utiliser temporairement la solution de ligne de commande pour contourner ce problème.

PROGRAMME SFTP DE LA LIGNE DE COMMANDE

Méthode: installez une application SFTP en ligne de commande gratuite telle que Putty et WinSCP et exécutez-la en exécutant un fichier de commandes ou une tâche de processus du système d'exploitation. Les instructions pour le faire via WinSCP sont listées ici .

Avantages: gratuit, gratuit et gratuit. Vous pouvez être sûr qu'il est sécurisé si vous utilisez Putty car de nombreux clients FTP à interface graphique semblent utiliser Putty sous les couvertures. Vous savez DÉFINITIVEMENT que vous utilisez SSH2 et non SSH.

Inconvénients: les deux utilitaires de ligne de commande que j'ai essayés (Putty et Cygwin) nécessitaient le stockage du mot de passe SFTP dans un emplacement non sécurisé. Je n'ai pas trouvé un bon moyen de capturer les échecs ou les erreurs lors du téléchargement de fichiers. Le processus ne ressemble pas et ne sent pas comme SSIS. La plupart du code est encapsulé dans des fichiers texte au lieu de SSIS lui-même. Difficile à utiliser si vous ne connaissez pas le nom exact du fichier que vous téléchargez ou téléchargez.

BIBLIOTHÈQUE VB.NET DE 3E PARTIES C # ou VB.NET

Méthode: installez une bibliothèque SFTP ou FTPS et utilisez une tâche de script qui référence la bibliothèque pour télécharger les fichiers. (Je n'ai jamais essayé cela, alors je vais deviner les avantages et les inconvénients)

Avantages: Probablement facile de capturer les erreurs. Devrait bien fonctionner avec les variables, il serait donc probablement facile à utiliser même si vous ne connaissez pas le nom exact du fichier que vous téléchargez ou téléchargez.

Inconvénients: il s’agit d’une tâche de script associée à des bibliothèques .NET. Si vous utilisez SSIS, vous êtes probablement plus à l'aise avec les tâches SSIS qu'avec le code .NET. Les tâches de script sont également difficiles à résoudre car elles ne disposent pas des mêmes outils et fonctionnalités de débogage que les projets .NET classiques. Crée une dépendance sur du code tiers qui peut ne pas fonctionner entre différentes versions de SQL Server. Pour être juste, il est probablement PLUS probable que vous travailliez entre différentes versions de SQL Server par rapport à une bibliothèque de tâches SSIS tierce. Un autre gros problème - je n’ai pas trouvé de bibliothèque libre C # ou VB.NET qui le fasse pour le moment. Donc, si quelqu'un en connaît un, alors s'il vous plaît faites le moi savoir!

Était-ce utile?

La solution

La question suivante pourrait être utile:

Quel serait le choix recommandé du composant SSIS à exécuter Tâche SFTP ou FTPS?

Cozyroc:

Il devrait être facile de tester la disponibilité du protocole ssh en définissant le serveur sur "autoriser uniquement SSHv2". et tests. Avez-vous essayé de demander au service des ventes de Cozy?

Ligne de commande sftp:

Le problème du nom de fichier inconnu pourrait être résolu avec l’utilisation de caractères génériques (au moins sous Cygwin).

Librairie tierce:

Pourquoi avez-vous besoin d'une bibliothèque tierce pour FTPS? .NET prend en charge ce protocole depuis la version 2.0 environ.

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

Autres conseils

Je souhaitais simplement fournir une mise à jour de ce que nous avions décidé de faire pour résoudre les problèmes de SFTP dans SSIS. Voici la ventilation de ce qui s'est passé:

  1. J'ai d'abord essayé d'utiliser Putty et certains fichiers de traitement par lots pour télécharger des fichiers, mais il était difficile de capturer les erreurs. De plus, je stockais nos identifiants SFTP dans des fichiers en texte clair, car ils faisaient partie des scripts de téléchargement Putty.

  2. Nous avons acheté une licence CozyRoc pour notre serveur SSIS pour quelques centaines de dollars par an et je suis complètement satisfait des résultats de l’utilisation de leur produit. Avec le produit CozyRoc, la tâche de flux de contrôle génère des erreurs en cas de problème de téléchargement. Étant donné que mon équipe compte également plusieurs programmeurs SSIS juniors, il leur a été plus facile de comprendre comment configurer la tâche de flux de contrôle que d'utiliser la méthode des scripts Putty. Enfin, le mot de passe est crypté à l'aide du cryptage natif de SSIS pour la protection des données sensibles. Je n'ai plus de mots de passe stockés en texte clair sur mon serveur.

J'ai examiné certaines des bibliothèques tierces recommandées dans cette question, mais il semble que CozyRoc soit le moins cher des fournisseurs. Ils avaient également quelques autres tâches SSIS que j'ai pu utiliser dans mon équipe de BI. . Merci, CozyRoc!

Sans composant, vous pouvez utiliser une tâche de script. Voir ce lien

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top