スクリプト タスクを使用して Excel ファイルを開き、書式を設定し、Excel の一部のデータを更新するパッケージを SSIS で作成しました。スクリプト タスクの実行中に Excel を表示して、常に発生する Excel のハングアップを確認したいと考えています。これは可能ですか?シェル スクリプトを介して Excel を呼び出すプロセスを、代わりに SSIS を使用して Excel を呼び出すように変換しています。2番目の質問は、それは悪い考えですか?
2 に答える
なぜこれが悪い考えなのか
一般的に言えば、管理者は、サーバーまたはサーバー上のサービスの「稼働時間」を最大化する任務を負っています。マシンにインストールされるソフトウェアが増えるほど、パッチ適用によるサービスの中断や停止の可能性が高くなります。説明したメカニズムで Excel を操作できるようにするには、そのマシンに MS Office を強制的にインストールします。これにはソフトウェア ライセンスの費用がかかり、必要なパッチ適用の量によって、管理者が遵守する必要のある SLA に穴が開くことになります。
メモリリーク。全体的なパッチ適用に加えて、少なくとも過去には、Excel をプログラムで操作する際に問題があり、基本的にメモリ リークが発生しやすいという問題がありました (理解してもらいたいのですが、割り当てられたメモリは決してあきらめませんでした。割り当てられたメモリがダウンすることはありません)。時間が経つにつれて、このパッケージを実行すると利用可能なシステム メモリがどんどん少なくなり、それを再利用する唯一の方法は SLA に戻る再起動によるものになります。
Excelが何をしているかを見たいのは、「常にハングアップする」ため、実行を監視できるようにするためです。それは安定したプロセスのようには聞こえません。繰り返しになりますが、管理者はサーバー上で不安定なプロセスを実行したいとは思わないでしょう。イベントのサイクルで何かが正しくありません。Excel を開くコードであろうと、Excel が実行するマクロであろうと、そこに何か問題があるため、プロセスを検査する必要があります。これは、散弾銃の傷に絆創膏を貼るようなものです。自分を撃つことをやめれば、包帯は必要ありません。
実行しようとしているタスクは、「Excel ファイルを開き、書式を設定し、Excel で一部のデータを更新する」ことです。SSIS はデータを Excel にネイティブにプッシュできます。ファイルを事前にフォーマットする場合は、SSIS を開発して、フォーマットされたファイルに書き込み、それをコピーするだけで動作するはずです。優雅ではありませんが、機能します。フォーマットされたデータを提供するためのより良い方法はありますが、インフラストラクチャを知らなければ、SSRS、SharePoint、Excel Services、Power Pivot などが実行可能なオプションかどうかわかりません。
Excel が表示されない理由
一般的に言えば、SQL エージェントを実行するアカウントはおそらくかなり強力です。粉砕攻撃などを防ぐために、Windows 2008 以降のサービスではできることが制限されています。サービス アカウントがデスクトップと対話できるようにするには、サービス アカウントをアプリのユーザー層に移動する必要があります。これは、あなた、または DBA/管理者がリスクを嫌う場合には、良いことではない可能性があります。
詳細については、次のリンクをお楽しみください。
- デスクトップとの対話
- http://lostechies.com/keithdahlby/2011/08/13/allowing-a-windows-service-to-interact-with-desktop-without-localsystem/
- https://serverfault.com/questions/576144/allow-service-to-interact-with-desktop
- https://superuser.com/questions/415204/how-do-i-allow-interactive-services-in-windows-7
とはいえ、すべての星が揃っていて、デスクトップとの対話をサービスに許可するというリスクを受け入れる場合、答えは Sam が示したとおりです。表示されていないコードでは、Visible
プロパティを true に設定する必要があります。
デスクトップとの対話を可能にし、誰かがパッケージに「テスト」コードを残して本番環境にデプロイするMessageBox.Show("Click OK to continue");
ときに、このダイアログ ボックスがそこにあることに誰も気付かない場合は、完了するまでジョブが待機することになることに注意してください。とても長い間。
最初の質問についてですが、スクリプト タスクをデバッグしたいということは承知しております。スクリプト タスクに次のコード行を追加することで、Excel を表示することができます (C# がコーディング言語であると仮定します)。
// Create your Excel app
var excelApp = new Excel.Application();
// Make the Excel window visible to spot any issues
excelApp.Visible = true;
デバッグ後にその行を削除/コメントすることを忘れないでください。
2 番目の質問については、メモリの問題を回避するために、Excel の開閉方法を適切に処理すれば、これは悪い考えではありません。