31

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

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

方法: CozyRocCodeplexBizCryptoPragmaticWorks、またはその他のベンダーの SSIS コンポーネント ライブラリを各開発サーバーと運用サーバーにインストールし、SFTP タスクを使用してファイルをアップロードします。

長所: 使いやすい。これは、通常の SSIS タスクのように見え、においがし、感じられます。また、SSIS はパスワードを機密情報として認識し、セキュリティで保護されていない方法でクリア テキストで保存するのではなく、機密情報を保護するための通常のオプションをすべて使用できるようにします。ForEach ループ コンテナーなどの他の 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 プロジェクトと同じデバッグ ツールや機能を備えていないため、トラブルシューティングも困難です。異なるバージョンの SQL Server 間で動作しない可能性があるサード パーティ コードへの依存関係を作成します。公平を期すために、おそらくサード パーティの SSIS タスク ライブラリよりも、異なるバージョンの SQL Server 間で動作する可能性が高くなります。もう 1 つの大きな欠点です。これを行う無料の C# または VB.NET ライブラリはまだ見つかりません。なので、どなたか知ってる方いたら教えてください!

4

3 に答える 3

9

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

SFTPまたはFTPSタスクを実行するためのSSISコンポーネントの推奨される選択は何でしょうか?

コジロック:

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

コマンドラインsftp:

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

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

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

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

于 2009-01-04T00:01:58.860 に答える
2

SSIS での SFTP の問題を解決するために実際に決定したことについて、最新情報を提供したかっただけです。何が起こったかの内訳は次のとおりです。

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

  2. SSIS サーバーの CozyRoc ライセンスを年間数百ドルで購入しましたが、その製品を使用した結果には完全に満足しています。CozyRoc の製品では、アップロードに問題があると、制御フロー タスクでエラーが発生します。私のチームには若手の SSIS プログラマーも何人かいるので、Putty スクリプトの方法を使用するよりも、制御フロー タスクのセットアップ方法を理解する方が簡単でした。最後に、機密データを保護するために、パスワードは SSIS のネイティブ暗号化を使用して暗号化されます。サーバーに平文で保存されているパスワードはもうありません。

この質問で推奨された他のサード パーティ製ライブラリのいくつかを確認しましたが、CozyRoc はベンダーの中で最も安価であり、BI チームで使用できる他の SSIS タスクもいくつか持っていたようです。ありがとう、コージーロック!

于 2009-03-13T15:38:34.183 に答える
-3

コンポーネントがなければ、スクリプト タスクを使用できます。このリンクを参照してください

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
于 2011-04-27T06:34:38.440 に答える