Лучший метод для SFTP или FTPS файлов через SSIS [закрыт]

этот вопрос первоначально задан, который является лучшим методом для загрузки файлов через SFTP или FTPS в SSIS. Теперь в нем просто перечислены плюсы и минусы каждого решения. Я лично использую библиотеку SFTP CozyRoc в эти дни, но я использовал каждое из приведенных ниже решений в тот или иной момент.

БИБЛИОТЕКА КОМПОНЕНТОВ СЛУЖБ SSIS

метод: установите библиотеку компонентов служб SSIS из CozyRoc, страницы CodePlex, BizCrypto, PragmaticWorks или какой-либо другой поставщик на каждом сервере разработки и производства и использовать задачу SFTP для загрузки файлов.

Pros: простота в использовании. Это выглядит, пахнет и чувствует себя как нормальная задача SSIS. SSIS также распознает пароль как конфиденциальную информацию и позволяет вам использовать все обычные опции для защиты конфиденциальной информации вместо того, чтобы просто хранить ее в незащищенном виде. Хорошо работает с другими задачами SSIS, такими как цикл ForEach Стеклотара. Ошибки при загрузке и загрузке не удается. Работает хорошо, когда вы не знаете имена файлов на удаленном FTP-сайте для загрузки или когда вы не будете знать имя файла для загрузки до времени выполнения.

минусы: за исключением решения Codeplex, это стоит денег, чтобы лицензировать в производственной среде. Требуется установка библиотек на каждой машине разработки и производства. Если это решение Codeplex, то вы используете программное обеспечение, которое не поддерживается любым конкретным поставщиком. Это также делает вас зависимым от поставщика для обновления своих библиотек между каждой версией. Например, до 2008 RTM'D Я разрабатывал новый сервер на CTP-версии 2008 года, и библиотека CozyRoc 2005 была несовместима с ней. В конце концов они выпустили совместимую версию 2008, но мне пришлось временно использовать решение командной строки для решения этой проблемы.

ПРОГРАММА SFTP КОМАНДНОЙ СТРОКИ

метод: установите бесплатно приложение SFTP командной строки, такое как Putty и WinSCP, и выполните его, запустив пакетный файл или задачу процесса операционной системы. Инструкции для этого через WinSCP перечислены здесь.

плюсы: бесплатно, бесплатно и бесплатно. Вы можете быть уверены, что это безопасно, если вы используете шпатлевку, так как многочисленные клиенты FTP GUI, похоже, используют шпатлевку под крышками. Вы определенно знаете, что используете SSH2, а не SSH.

минусы: две утилиты командной строки, которые я пробовал (Putty и Cygwin) требуется хранить пароль SFTP в небезопасном месте. Я не нашел хорошего способа фиксировать сбои или ошибки при загрузке файлов. Процесс не выглядит и не пахнет как SSIS. Большая часть кода инкапсулируется в текстовые файлы вместо самого SSIS. Трудно использовать, если вы не знаете точное имя файла, который вы загружаете или скачиваете.

третья сторона C# или VB.NET библиотека

метод: установите библиотеку SFTP или FTPS и используйте задачу сценария это ссылается на библиотеку для загрузки файлов. (Я никогда не пробовал это, поэтому я собираюсь угадать плюсы и минусы)

Pros: вероятно, легко фиксировать ошибки. Должно хорошо работать с переменными, поэтому его, вероятно, будет легко использовать, даже если вы не знаете точное имя файла, который вы загружаете или загружаете.

минусы: это задача скрипта в сочетании с библиотеками .NET. Если вы используете SSIS, то вам, вероятно, более комфортно с задачами SSIS, чем .NET-код. Задачи сценариев также трудно устранить, так как они не имеют те же инструменты отладки и функции, как обычные проекты .NET. Создает зависимость от стороннего кода, который может не работать между различными версиями SQL Server. Справедливости ради, вероятно, более вероятно, что он будет работать между различными версиями SQL Server, чем сторонняя библиотека задач SSIS. Еще одна огромная афера - я не нашел бесплатный C# или VB.NET библиотека, которая делает это до сих пор. Так что если кто-то знает об этом, пожалуйста, позвольте мне знать!

4 ответов


следующий вопрос может быть:

что было бы рекомендуемым выбором компонента SSIS для выполнения задачи SFTP или FTPS?

Cozyroc:

должно быть легко проверить доступность протокола ssh, установив сервер на "разрешить только SSHv2" и тестирование. Вы пробовали спросить отдел продаж Cozy?

Командная строка sftp:

неизвестная проблема с именем файла может быть решена просто сценарии/использование подстановочных знаков (по крайней мере под Cygwin).

3rd party lib:

зачем вам нужен сторонний lib для FTPS? .NET поддерживает этот протокол с 2.0 или около того.

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


следующее скрипт может быть вариантом вместо сохранения учетных данных доступа в текстовый файл с WINSCP.


Я просто хотел предоставить обновление о том, что мы на самом деле решили сделать, чтобы решить проблемы SFTP в SSIS. Вот разбивка того, что произошло:

  1. сначала я пытался использовать Putty и некоторые пакетные файлы для загрузки файлов, но было трудно захватить ошибки. Кроме того, я хранил наши учетные данные SFTP в текстовых файлах, так как это было частью сценариев загрузки шпатлевки.

  2. мы приобрели лицензию CozyRoc для нашего сервера SSIS для пара сотен долларов в год, и я полностью удовлетворен результатами использования их продукта. С продуктом CozyRoc задача потока управления вызывает ошибки, если есть какие-либо проблемы с загрузкой. Поскольку в моей команде также есть несколько младших программистов служб SSIS, им было легче понять, как настроить задачу потока управления, чем использовать метод Putty scripts. И, наконец, пароль шифруется с помощью собственного шифрования служб SSIS для защиты конфиденциальных данных. У меня больше нет любые пароли, хранящиеся в открытом тексте на моем сервере.

Я просмотрел некоторые из других сторонних библиотек, которые были рекомендованы в этом вопросе, но, похоже, CozyRoc был самым дешевым из поставщиков, и у них также было несколько других задач SSIS, которые я смог использовать в своей команде BI. Спасибо, CozyRoc!


без компонента можно использовать задачу "скрипт". См.этой ссылке

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