Вопрос

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

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

Метод:Установите библиотеку компонентов SSIS из УютныйРок, Кодплекс, БизКрипто, ПрагматикВоркс, или другого поставщика на каждом сервере разработки и производства и используйте задачу SFTP для загрузки файлов.

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

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

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

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

Плюсы:Бесплатно, бесплатно и бесплатно.Вы можете быть уверены, что это безопасно, если вы используете Putty, поскольку многие FTP-клиенты с графическим интерфейсом используют Putty под прикрытием.Вы ОПРЕДЕЛЕННО знаете, что используете SSH2, а не SSH.

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

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

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

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

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

Это было полезно?

Решение

Возможно, будет полезен следующий вопрос:

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

Козирок:

Проверить доступность протокола ssh должно быть легко, настроив сервер на «разрешить только SSHv2» и проведя тестирование.Вы пробовали обратиться в отдел продаж Кози?

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

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

Сторонняя библиотека:

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

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

Другие советы

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

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

  2. Мы приобрели лицензию CozyRoc для нашего SSIS-сервера за пару сотен долларов в год, и я полностью доволен результатами использования их продукта.В продукте CozyRoc задача потока управления выдает ошибки, если возникают какие-либо проблемы с загрузкой.Поскольку в моей команде также есть несколько младших программистов SSIS, им было легче понять, как настроить задачу потока управления, чем использовать метод сценариев Putty.И, наконец, пароль шифруется с использованием собственного шифрования 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top