私は C# と Microsoft SQL Server Express 2008 を使用しています。テーブルはリモート ハードウェアによって設定されるため、挿入用の SQL コマンドを制御することはできません。C# (またはその他の .NET) アプリケーションでキャッチ可能な挿入時にイベントを生成するように SQL サーバーを設定できますか?
4 に答える
それを行うには多くの方法があります。
そのテーブルにinsert Triggerを書き込み、そのトリガーでexeを呼び出します
例えば :
declare @sqlcmd varchar(200)
SET @SQLCmd = 'c:\dba\sampl_2.exe'
EXEC master..xp_cmdshell @SQLCmd , no_output
そしてそのexeでは、あなたが望むものは何でも処理できます...
このようなことを行うには、いくつかのオプションがあります。メッセージの送信、別のテーブルへの書き込み、ログへの書き込みなど、任意の数のタスクを実行できるイベントを効果的に発生させる挿入トリガーを SQL で設定するのは簡単です。等
私にとっての問題は、C# プログラムにこのトリガー イベントを "リッスン" させる最善の方法です。
1 つのオプションは、挿入トリガーが発生したときに SQL サーバーから送信されたメッセージに応答するリスナーとして小さな WCF プログラムをセットアップすることです。これは、そのようなことを行うことに関する CodeProject の作品へのリンクです。
http://www.codeproject.com/Articles/21149/Invoking-a-WCF-Service-from-a-CLR-Trigger
おそらくあなたが探しているのは: SqlDependency class .
しかし、私が覚えている限り、SQL Server Express は SqlDependency 機能をサポートしていません。その場合、「IsProcessed」のような列をもう 1 つ作成し、アプリが行を処理したら、それを true または何かに設定します。このアプローチを使用すると、where 句を使用してテーブルをクエリできます。where IsProcessed は null です。
この種の質問が SO で時々発生するのは興味深いことです。そして、すべての状況で与えられる明示的な唯一の答えはまだありません。
実際、この質問は、特定のテーブルの SQL サーバーで複数の挿入イベントをどのようにキャプチャする必要があるかを尋ねます。SQL Server自体には、すべてのテーブルへのDML変更( * from tablesなど)を一度にリッスンする方法がないため、特定のテーブルであることを願っています。必要に応じて、N 個のテーブルに N 個のトリガーを作成し (たとえば、動的 SQL を使用して実行できます)、これらをリッスンできますが、新しいテーブルが追加されたらどうなるでしょうか?
INSERT、UPDATE、および DELETE イベントをリッスンしたい特定のテーブル MyTable があるとします。これを行う 1 つの方法は、トリガーを実装することです (この場合、INSTEAD OF トリガーは作成されないため、具体的には AFTER トリガー)。もう 1 つのオプションは、クエリ通知です。しかし、本当に必要なのはどれですか?
クエリ通知は、.NET アプリケーションをコーディングする必要があることを意味します。トリガーとは、トリガーに関連するすべてのことを意味します。TSQL コードを使用することも、CLR トリガーを使用してデータベースから Web サービスを呼び出すこともできます。しかし - 何が必要ですか?
そのため、ログ レコードをテーブルに書き込むだけの方法で本当に対応する必要がある場合は、プレーン オールド トリガーを使用してください。それ以外の場合は、次のように考える必要があります。なぜ、ここで C# アプリケーションが本当に必要なのですか?
たとえば、delete ステートメントをキャッチし、削除されたすべての行を XML 形式でファイル システムにシリアル化する必要があるとします。EXTERNAL_ACCESS モードで CLR トリガーを使用して、ファイルを作成し、情報をディスクに保存できるようにします。