Pregunta

Esta pregunta formulada originalmente es el mejor método para cargar archivos a través de SFTP o FTPS en SSIS. Ahora solo se enumeran los pros y los contras de cada solución. Personalmente uso la biblioteca SFTP de CozyRoc en estos días, pero he usado cada una de las soluciones a continuación en un momento u otro.

BIBLIOTECA DE COMPONENTES SSIS

Método: instale una biblioteca de componentes SSIS desde CozyRoc , Codeplex , BizCrypto , PragmaticWorks , o algún otro proveedor en cada servidor de desarrollo y producción y use la tarea SFTP para cargar los archivos.

Pros: Fácil de usar. Se ve, huele y se siente como una tarea normal de SSIS. SSIS también reconoce la contraseña como información confidencial y le permite todas las opciones normales para proteger la información sensible en lugar de simplemente almacenarla en texto claro de forma no segura. Funciona bien con otras tareas de SSIS, como los contenedores de bucles ForEach. Errores cuando las subidas y descargas fallan. Funciona bien cuando no sabe los nombres de los archivos en el sitio FTP remoto para descargar o cuando no sabe el nombre del archivo para cargar hasta el tiempo de ejecución.

Contras: con la excepción de la solución Codeplex, esto cuesta dinero para licenciar en un entorno de producción. Requiere instalar las bibliotecas en cada máquina de desarrollo y producción. Si es la solución de Codeplex, entonces está utilizando un software que no es compatible con ningún proveedor específico. Esto también hace que dependa del proveedor para actualizar sus bibliotecas entre cada versión. Por ejemplo, antes de 2008 RTM'd, estaba desarrollando un nuevo servidor en una versión CTP de 2008 y la biblioteca CozyRoc 2005 era incompatible con él. Finalmente, lanzaron una versión compatible con 2008, pero tuve que usar temporalmente la solución de línea de comandos para solucionar este problema.

PROGRAMA SFTP DE LA LÍNEA DE COMANDOS

Método: instale una aplicación gratuita de SFTP de línea de comandos como Putty y WinSCP y ejecútela ejecutando un archivo por lotes o una tarea de proceso del sistema operativo. Las instrucciones para hacerlo a través de WinSCP están enumeradas aquí .

Pros: Gratis, gratis y gratis. Puede estar seguro de que es seguro si está utilizando Putty, ya que muchos clientes de GUI FTP parecen usar Putty debajo de las coberturas. Definitivamente sabes que estás usando SSH2 y no SSH.

Contras: Las dos utilidades de línea de comandos que probé (Putty y Cygwin) requerían el almacenamiento de la contraseña de SFTP en una ubicación no segura. No he encontrado una buena manera de capturar fallas o errores al cargar archivos. El proceso no se ve y huele como SSIS. La mayor parte del código está encapsulado en archivos de texto en lugar de SSIS. Es difícil de usar si no sabe el nombre exacto del archivo que está cargando o descargando.

A BIBLIOTECA DE LA PARTE C 3 o BIBLIOTECA VB.NET

Método: instale una biblioteca SFTP o FTPS y use una tarea de script que haga referencia a la biblioteca para cargar los archivos. (Nunca he intentado esto, así que voy a adivinar los pros y los contras)

Pros: Probablemente es fácil capturar errores. Debería funcionar bien con las variables, por lo que probablemente sería fácil de usar incluso si no conoce el nombre exacto del archivo que está cargando o descargando.

Contras: es una tarea de script combinada con bibliotecas .NET. Si está utilizando SSIS, entonces probablemente se sienta más cómodo con las tareas de SSIS que con el código .NET. Las tareas de secuencia de comandos también son difíciles de solucionar ya que no tienen las mismas herramientas y características de depuración que los proyectos .NET habituales. Crea una dependencia en el código de un tercero que puede no funcionar entre diferentes versiones de SQL Server. Para ser justos, es probable que MÁS trabaje entre diferentes versiones de SQL Server que una biblioteca de tareas de SSIS de terceros. Otra gran desventaja: aún no he encontrado una biblioteca gratuita de C # o VB.NET que haga esto. Entonces, si alguien sabe de uno, hágamelo saber.

¿Fue útil?

Solución

La siguiente pregunta podría ser de utilidad:

¿Cuál sería una opción recomendada del componente SSIS a realizar? ¿Tarea SFTP o FTPS?

Cozyroc:

Debería ser fácil probar la disponibilidad del protocolo ssh configurando el servidor para que " permita solo SSHv2 " y pruebas. ¿Has intentado preguntarle al departamento de ventas de Cozy?

Línea de comando sftp:

El problema del nombre de archivo desconocido podría resolverse mediante el uso de scripts o el uso de comodines simples (al menos en Cygwin).

Lib. de terceros:

¿Por qué necesita una biblioteca de terceros para FTPS? .NET ha admitido este protocolo desde 2.0 o algo así.

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

Otros consejos

Solo quería proporcionar una actualización sobre lo que realmente decidimos hacer para resolver los problemas de SFTP en SSIS. Aquí está el desglose de lo que pasó:

  1. Inicialmente intenté usar Putty y algunos archivos por lotes para cargar archivos, pero fue difícil capturar errores. Además, estaba almacenando nuestras credenciales de SFTP en archivos de texto sin cifrar ya que formaba parte de los scripts de subida de Putty.

  2. Compramos una licencia CozyRoc para nuestro servidor SSIS por unos doscientos dólares al año y estoy completamente satisfecho con los resultados de usar su producto. Con el producto de CozyRoc, la tarea de flujo de control genera errores si hay algún problema con la carga. Como también tengo varios programadores de SSIS junior en mi equipo, fue más fácil para ellos entender cómo configurar la tarea de flujo de control que usar el método de scripts Putty. Y, finalmente, la contraseña se cifra mediante el cifrado nativo de SSIS para proteger los datos confidenciales. Ya no tengo contraseñas almacenadas en texto sin cifrar en mi servidor.

Revisé algunas de las otras bibliotecas de terceros que se recomendaron en esta pregunta, pero parece que CozyRoc era el más barato de los proveedores y también tenían algunas otras tareas de SSIS que he podido usar en mi equipo de BI . Gracias, CozyRoc!

Sin componente, puedes usar la tarea de script. Consulte este enlace

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top