質問

この質問はもともと、SSISでSFTPまたはFTPSを介してファイルをアップロードするのに最適な方法はどれかを尋ねました。現在は、各ソリューションの長所と短所をリストしています。私は最近、個人的にCozyRocのSFTPライブラリを使用していますが、以下のソリューションをある時点で使用しています。

SSISコンポーネントライブラリ

方法: CozyRoc Codeplex BizCrypto PragmaticWorks 、または各開発サーバーと本番サーバー上のその他のベンダーで、SFTPタスクを使用してファイルをアップロードします。

長所:使いやすい。見た目も匂いも、通常のSSISタスクのようにも感じられます。また、SSISはパスワードを機密情報として認識し、非セキュアな方法でクリアテキストに保存するだけでなく、機密情報を保護するための通常のオプションをすべて許可します。 ForEach Loop Containersなどの他のSSISタスクとうまく機能します。アップロードとダウンロードが失敗するとエラーが発生します。ダウンロードするリモートFTPサイト上のファイルの名前がわからない場合、または実行時までアップロードするファイルの名前がわからない場合に有効です。

短所:Codeplexソリューションを除き、実稼働環境でライセンスを取得するには費用がかかります。各開発マシンおよび本番マシンにライブラリをインストールする必要があります。 Codeplexソリューションの場合、特定のベンダーによってサポートされていないソフトウェアを使用しています。また、これにより、各バージョン間でライブラリを更新するベンダーに依存するようになります。たとえば、2008年のRTMの前に、2008年のCTPバージョンで新しいサーバーを開発していましたが、CozyRoc 2005ライブラリはそれと互換性がありませんでした。最終的に彼らは2008互換バージョンをリリースしましたが、この問題を回避するには一時的にコマンドラインソリューションを使用する必要がありました。

コマンドラインSFTPプログラム

方法:PuttyやWinSCPなどの無料のコマンドラインSFTPアプリケーションをインストールし、バッチファイルまたはオペレーティングシステムプロセスタスクを実行して実行します。 WinSCPを介してこれを行う手順は、こちらに記載されています。

長所:無料、無料、無料。多くのGUI FTPクライアントが裏でPuttyを使用しているように見えるので、Puttyを使用している場合は安全であると確信できます。 SSHではなくSSH2を使用していることは間違いなくわかっています。

短所:私が試した2つのコマンドラインユーティリティ(PuttyとCygwin)では、SFTPパスワードを安全でない場所に保存する必要がありました。ファイルをアップロードするときに失敗やエラーをキャプチャする良い方法を見つけられませんでした。このプロセスは、SSISのようには見えず、臭いもしません。ほとんどのコードは、SSIS自体ではなくテキストファイルにカプセル化されています。アップロードまたはダウンロードするファイルの正確な名前がわからない場合は使用が困難です。

サードパーティのC#またはVB.NETライブラリ

方法:SFTPまたはFTPSライブラリをインストールし、ライブラリを参照するスクリプトタスクを使用してファイルをアップロードします。 (私はこれを試したことがないので、長所と短所を推測します)

長所:おそらく簡単にエラーをキャプチャできます。変数でうまく動作するはずなので、アップロードまたはダウンロードするファイルの正確な名前がわからなくても、おそらく使いやすいでしょう。

短所:.NETライブラリと組み合わせたスクリプトタスクです。 SSISを使用している場合、おそらく.NETコードよりもSSISタスクの方が使いやすいでしょう。また、スクリプトタスクは、通常の.NETプロジェクトと同じデバッグツールと機能を持たないため、トラブルシューティングが困難です。異なるバージョン間で動作しない可能性のあるサードパーティのコードへの依存関係を作成します

役に立ちましたか?

解決

次の質問が役に立つかもしれません:

実行するSSISコンポーネントの推奨される選択肢SFTPまたはFTPSタスク?

Cozyroc:

「SSHv2のみを許可」にサーバーを設定することにより、sshプロトコルの可用性を簡単にテストできます。およびテスト。コージーの営業部に聞いてみましたか?

コマンドラインsftp:

不明なファイル名の問題は、単純なスクリプト/ワイルドカードの使用で解決できます(少なくともCygwinでは)。

サードパーティのライブラリ:

FTPSにサードパーティのライブラリが必要なのはなぜですか? .NETは2.0以降でこのプロトコルをサポートしています。

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

他のヒント

私は、SSISでSFTPの問題を解決するために実際に行うことを決定した内容の更新を提供したかっただけです。発生した内容の内訳は次のとおりです。

  1. 最初にPuttyといくつかのバッチファイルを使用してファイルをアップロードしようとしましたが、エラーをキャプチャすることは困難でした。また、SFTP資格情報は、Puttyアップロードスクリプトの一部であるため、クリアテキストファイルに保存していました。

  2. SSISサーバーのCozyRocライセンスを年間数百ドルで購入しましたが、製品を使用した結果に完全に満足しています。 CozyRocの製品では、アップロードに問題がある場合、制御フロータスクでエラーが発生します。私のチームには複数のジュニアSSISプログラマもいるので、Puttyスクリプトメソッドを使用するよりも、制御フロータスクの設定方法を理解する方が簡単でした。最後に、機密データを保護するために、SSISのネイティブ暗号化を使用してパスワードが暗号化されます。サーバーにパスワードがクリアテキストで保存されなくなりました。

この質問で推奨された他のサードパーティライブラリのいくつかを確認しましたが、CozyRocは最も安価なベンダーであり、BIチームで使用できる他のSSISタスクもいくつかあったようです。ありがとう、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