web-dev-qa-db-ja.com

パスワード付きのテーブルとZipをエクスポートする

TSQLから、ビューを使用してテーブルからデータを抽出し、BCPで出力してから、サードパーティ以外のツールを使用して、パスワードとAES暗号化でZip圧縮したいと考えています。オプションとして、ローカルインストールを必要としないサードパーティのツール(たとえば、ネットワークドライブ上のスタンドアロンEXE)を使用することもできます。

私はsp_OA*を使用してみましたが、バグがあり、メモリリークがあり、非推奨の機能であると言っている この投稿を見つけました だから、もしあれば、私は代わりを探しています。 Google検索はすべて同じソリューションに戻りました:7Zip、Winrar、またはsp_OA*

コードは必要ありません。役立つ機能またはメソッドの名前だけなので、何を検索すればよいかわかります。

MSSQL2008以降。 Powershellソリューションにすることができます。可能であればSSISではありません。記録としては、ソースに直接アクセスできないため、ソフトウェアを最新のデータで毎日更新することです。

7Zipが最善で唯一の方法である場合、SQLサーバーに非データベースソフトウェアをインストールすることを正当化するために、記入する書類や会議に出席するための膨大な書類が必要になります。 :-)

2
Philippe

はい、sp_OA* OLE Automationプロシージャから離れてください。

SQL Server内でこれを純粋に処理する必要がある場合は、SQLCLRを使用してこれを行うことができます。これは、sp_OA* OLEオートメーションプロシージャに代わるものです。他の目的でxp_cmdshellを使用していない場合は、これだけのためにそれを有効にする必要はありません(SQLエージェントを使用している場合は公平ですが、CMDステップはxp_cmdshellを有効にする必要なしにBCPや7Zipを実行できます)。

SQLCLRを使用すると、次のことができます。

  • t-SQL内からもエクスポートを実行し、外部プロセスであるBCPをいじる必要はありません( FileStream を参照)。
  • 別の手順として、ファイルを圧縮します。 NETにはgzipおよびgunzipするメソッドがあります( GZipStream を参照)。
  • パスワードで暗号化します( RijndaelManaged および AesManaged を参照)。 AESを指定しましたが、AesManagedのMSDNドキュメントには次のように記載されています。

    AESアルゴリズムは基本的に、固定ブロックサイズと反復回数を使用するラインダール対称アルゴリズムです。このクラスはRijndaelManagedクラスと同じように機能しますが、ブロックを128ビットに制限し、フィードバックモードを許可しません。

    違いは、SQL Server 2005、2008、または2008 R2を使用している場合です。これらのバージョンは.NET 3.5の使用に限定されており、AesManagedのMSDNドキュメント(そのバージョンの場合)にはホスト保護属性(HPA)があると記載されています。つまり、そのクラスを使用するすべてのアセンブリはPERMISSION_SET = UNSAFERijndaelManagedにはその問題はなく、EXTERNAL_ACCESSアセンブリで使用できます。ただし、AesManagedのドキュメントには、.NET Frameworkバージョン4.0以降(SQL Server 2012、2014、2016では.NET Framework 4.0以降(現在は4.6まで)を使用)、 HPAについては削除されました。 UNSAFEが許容される場合でも、特定のHPAは MayLeakOnAbort であることに注意してください。これは、「操作が終了するとメモリがリークする可能性がある」ことを意味します。

この設定では、パスワードは暗号化の一部であり、圧縮ではありません。したがって、暗号化されたファイルを含むZipファイルがあるか、Zipファイルを含む暗号化されたファイルがあります。前者の方法では、誰でも解凍できるファイルを提供しますが、正しいパスワードを持つユーザーだけが読み取ることができます。後者の方法では、圧縮ファイルを取得するためにパスワードを知っている必要があり、圧縮はテキストファイルで行われるため(圧縮可能なパターンの可能性が高いため)、より良い圧縮が可能になります。

暗号化アルゴリズムはまだ実装していませんが、ファイルエクスポート(ランダムクエリの)とGZip/GZunzipの両方をSQLCLRにコーディングしており、それらが効率的に実行されること、または少なくとも効率的にすることができます(そして非効率的にすることもできます)。つまり、これらを使用して5 GBのテキストファイルを生成するクエリを抽出し、それらの5 GBのテキストファイルをGZ圧縮しました。両方の操作がストリーミングされるため、メモリに悪影響が及ぶことはありません。 .NETが提供するGZipStreamクラスはZip64形式をサポートしないため、4 GBのソースデータに制限されることに注意してください。

事前に構築されたSQLCLR関数(上記で説明したもの)を実行して抽出と圧縮を行うことに関心がある人は、 SQL# ライブラリ(私が作成者です)で利用できます。その点に注意してください:

  • sQL#の無料バージョンがある間、ここで言及されている2つのオブジェクトDB_BulkExportFile_GZip、フルバージョンでのみ利用可能です。
  • GZipStreamクラスの4 GBの制限を克服するために、Zip64をサポートするサードパーティライブラリを組み込む必要がありました。
  • 間もなく、Rijndael(少なくともSQL Server 2005-2016で利用可能)とAes(少なくともSQL Server 2012-2016で利用可能)を介してファイルの暗号化と復号化を処理する関数が登場します。
3
Solomon Rutzky

xp_cmdshell。 SQLジョブからデータをエクスポートし、そのストアドプロシージャを使用してZipできます。最善の方法は、Zipのbatファイルを実行することです。

備考:そのspを使用するには、それが(SQL Serverレベルで)許可されている必要があり、それを実行する権限が必要です。

0
Bogdan Bogdanov