Первоначально в этом вопросе задавался вопрос, какой метод загрузки файлов через SFTP или FTPS в SSIS является наилучшим. Теперь он просто перечисляет плюсы и минусы каждого решения. Я лично использую библиотеку SFTP от CozyRoc в наши дни, но я использовал каждое из нижеприведенных решений в тот или иной момент.
БИБЛИОТЕКА КОМПОНЕНТОВ SSIS
Метод: установите библиотеку компонентов SSIS из CozyRoc, Codeplex, BizCrypto, PragmaticWorks или другого поставщика на каждый сервер разработки и производства и используйте задачу 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. Трудно использовать, если вы не знаете точное имя файла, который вы загружаете или скачиваете.
БИБЛИОТЕКА С 3 СТОРОНЫ 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. Вот разбивка того, что произошло:
Сначала я пробовал использовать Putty и некоторые командные файлы для загрузки файлов, но было сложно зафиксировать ошибки. Кроме того, я хранил наши учетные данные SFTP в текстовых файлах, поскольку они были частью сценариев загрузки Putty.
Мы приобрели лицензию 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
Простое наименование ваших переменных с префиксом sftp не делает его sftp ...
Для бесплатных решений FTPS выглядит хорошо, за исключением случаев, когда мне приходится использовать SFTP. Поскольку я предпочел бы иметь одну архитектуру для обработки обоих сценариев, я, вероятно, полагаюсь на командную строку sftp. Для платных решений CozyRoc, SecureBlackBox и Rebex выглядят неплохо. Спасибо!