2011-12-27 18 views
5

私の問題を解決する最善の方法を見つけることに問題があります。私はこのタスクについてより良い方法を検討しています。テーブル更新トリガの後にSQL Serverからコンソールアプリケーションを非同期で実行しますか?

テーブルの行の値が更新されたら、そのテーブルの2つのフィールドをコンソールアプリケーションのパラメータとして使用する必要があります。今私はテーブルにトリガを設定し、を使用してパラメータでアプリケーションを実行することで、これを達成できます。しかし、私は非同期的にこれを行う必要がありますので、私のストアドプロシージャは、コンソールアプリケーションが終了するのを待つ間、ハングしません。

多分私はこれについて間違った方法をとっています。

私はSQL Server 2008の

EDIT使用しています - 私は、これは「即座に」実現するための方法を必要とするコメントで述べたようにアンドリー・Mによって答えは現在、最高のようですけど。 SPかTriggerからジョブを呼び出すことは可能ですか?または同様の結果を達成するための別の方法でしょうか?

皆さんありがとうございます。

編集 - 私は彼が最も良い解決に来るのを助けたので、彼は以下の答えを選ぶ。私がやったことは、更新された行を追跡する別のテーブルに対してテーブルを照会するだけの仕事を作成することでした。私は行を更新する必要があるとき私は指定されたパラメータで私のアプリケーションを実行するためにxp_cmdshellを使用します。これまでのところ、このソリューションはスムーズに動作しているようです。

+0

アプリケーションは何をしますか? – UnhandledExcepSean

+0

私のテーブルで更新された値に基づいていくつかのバッチ操作を行います。 – kds6253

+0

データベースの外で何かする必要がありますか? – UnhandledExcepSean

答えて

5

アプリケーションをトリガから直接実行することには別の欠点があります。一般に、複数の行が更新される可能性があるという事実と関係しています。トリガーでそれを説明するには、おそらく更新された行にループを編成し、アプリケーションを個別に実行する必要があります。カーソルは通常、最後の手段とみなされ、トリガーに入っているものはさらにそうです。

このような状況では、おそらくトリガーによって作成された専用テーブルから更新された値を読み取るSQLエージェントジョブを作成することを検討します。仕事はまだカーソルを使わなければならないと思いますが、あなたのトリガーはそうではなく、主な点は、仕事からアプリケーションを実行しても主な作業プロセスは止まらないということです。

+0

これは最善の解決策のようです。トリガーは、テーブルを照会してそのパラメーターの情報を取得し、ジョブ内のxp_cmdshellからmy app.exeを実行するジョブを呼び出します。 – kds6253

+0

誰もこのロジックや改善の可能性について何か問題を見ていますか? – kds6253

+0

@ kds6253:私はSQLジョブを扱うのにあまり堪能ではありません。特に、トリガーからジョブを呼び出すことについて聞いたことがありません。私は、単に特定のテーブルにデータを入れるだけのトリガーについては考えていませんでした。私が言及した仕事はスケジュールどおりに実行され、テーブルをポーリングします。新しい行に遭遇した後、それは順番にすべての行に対してアプリケーションを呼び出すことになります。トリガーでジョブを直接開始することができれば、それは素晴らしいボーナスとして見えます。 –

0

xp_cmd_shellを使用してコンソールアプリケーションを呼び出す代わりに、拡張ストアドプロシージャ(DLL)を開発する必要があると思います。

+0

拡張ストアドプロシージャの代替手段はありますか? – kds6253

+1

[拡張ストアドプロシージャプログラミングは非推奨](http://msdn.microsoft.com/en-us/library/ms143729.aspx) –

+0

私はそれを知りませんでした。ありがとう。 – Baatar

0

CLRプロシージャを使用することをお勧めします。これは、プロセスをより詳細に制御できるためです。しかし、となります。これはxp_cmdshellで行います。

これを行うには、xp_cmdshellで呼び出すバッチファイルを作成します。バッチファイル内で、STARTコマンドを使用して、適切なパラメータでコンソールアプリケーションを起動します。これはあなたのプロセスを非同期的に起動します。バッチファイルと呼び出しはすぐに戻ります。

+0

CLRプロシージャの作成と登録の完全な例は、私がここでできること以上のものです。オンラインですばらしい例があります。 'START'トリックが動作しない場合、' AT'プログラムを試すこともできます。これを使用して、将来実行するジョブをスケジュールできます。あなたが将来、それを動作させるはずです。しかし、私は、これらの 'xp_cmdshell'アプローチのどれかがハックだと強調しています。あなたができるならば、あなたは本当に問題の根本的なデザインを見ておくべきです。 – mwigdahl

1

トリガーで、更新された各行のService Brokerキューにメッセージを挿入します。キューからメッセージを処理するストアドプロシージャを記述します。ストアドプロシージャをキューのアクティブ化ストアドプロシージャとして設定します。

関連する問題