0

非常に簡単に言えば、.netフロントエンドを備えたSQLデータベースがあり、特定の時間に達したときにイベントを開始する必要があります。私はそれらをアラームと呼んでいるので、ユーザーはx日の午前12時30分にアラームを設定でき、x日のその時間に達すると、ポップアップが表示されてユーザーに通知されます。

これを実現するための最良の方法は何ですか?データベースをポーリングするか、SQLトリガーを使用する必要がありますか?私はこれまでこれを試みたことがないので、誰かが経験を積んだら、最善のアプローチに光を当てることができますか?と私が陥らないようにする必要がある甌穴!。

任意の洞察=素晴らしい

はい、申し訳ありませんが、別のプロジェクト(睡眠不足)の頭のどこかでトリガーされます。

明確にするために、複数のクライアントが接続されている可能性があります(通常、2つは常にオンになりますが、すべてがダウンし、接続されていない場合もあります)。したがって、アラーム/ポップアップがどのように発生するかを考える必要があります。ポップアップアラームを受信すると、タスクを完了したと言って、それを却下するか「アクション」するかを選択できます。

アラームの情報に応じて、さまざまなユーザーに通知する必要があります。つまり、選択した場合にアラームを受け取らない人もいます(できれば、Active Directoryログインを介してこれを達成し、現在のユーザーのテーブルを保持し、それぞれをエリアに割り当てて、人々が他の人がすべてを受け取るかもしれない間、そこのエリアのアラームを見てください)

すべての入力に感謝します:中央のプログラムまたはサービスが必要なようです。

データベースのポーリングを続けてアラーム時間と現在のアクティブユーザーをチェックするサービスを利用できます。検出された場合は、ユーザーページが数秒ごとにポーリングする通知テーブルを更新します(10)(明確化:アラーム時間は適切に入力する必要があります)事前に、アラーム通知は秒単位で正確である必要はありません)。それはどのように聞こえますか?

負荷に関しては、一度に15〜20程度しか使用できませんが、通常は5〜6程度です。

明白な欠落や懸念はありますか?

4

3 に答える 3

2

データベースで何かが発生すると、トリガーがアクティブになります。

私は過去に次のすべてを使用しました...

1.外部アプリケーションの使用

イベントについて知る必要のあるアプリがある場合は、アプリでイベントの時間を計ります。

複数のクライアントがある場合は、それらを調整する必要があります。中央のマスターアプリケーション、またはいくつかの同期プロセスのいずれかを使用します。

2.エージェント

MS SQL Serverには、一部のSQLを起動する時間と繰り返しイベントを設定する機能があります。

これらは、このイベントを発生させる必要のある外部クライアントアプリケーションがない場合に役立ちます。

複数のクライアントアプリケーションがある場合は、オプション1と同様ですが、SQL Serverが中央アプリになり、クライアントはサーバーをポーリングして何が起こっているかを確認します。

3.無限ループ

エージェントの代わりに(またはエージェントと同様に)、無限ループを記述し、WAITタイプのコマンドを使用して、次のイベントの期限が切れるまで一時停止することができます。

ノート

何が最善かは、これらのイベントで実際に何をするかによって異なります。ポーリングは問題ではありませんが、イベントの発生を制御する単一のポイントを持つことが一般的に最善です。

(通常は)クライアントからSQLServerへの接続を永久に開いたままにしたくないことに注意してください。また、SQLServerから多数のクライアントアプリへの接続を開くことはできません。そのため、アプリは関係なくサーバーをポーリングする必要があります。しかし、あなたはポーリングについて賢くすることができます。

于 2011-10-25T16:09:15.593 に答える
2

トリガーを正しく理解していないと思います。実行されたアクションに基づいて起動します(たとえば、行がテーブルに挿入されます)。それらは時間ベースではありません。あなたの説明から、これがあなたが探しているものではないと思います。

これらのアラームは誰に表示されますか?それらは文字通りクライアントマシンのポップアップウィンドウになりますか?森の中にポップアップが表示され、それを読む人がいない場合でも、アラームはありましたか?

しかし、私の最初の情報は限られているので、最初に開いたときにクライアントにアラームデータをロードさせることです。アラームが見落とされた場合(つまり、人がシステムにログインしていないときにアラームが鳴るはずだった場合)、すぐにポップアップします(できれば過去の視覚的な合図が表示されます)。近い将来にスケジュールされている他のアラームは、適切な時間に発生するように設定できます。

アプリケーションは、サーバーを頻繁に(1分に1回?10分に1回?)再ポーリングして、システムに新しいアラームが設定されているかどうかを確認できます。ここでの欠点は、誰かが入ってすぐにアラームを作成した場合、データベースの次のポーリングまでポップアップしない可能性があることです。これは、ポーリングを実行する必要がある頻度に関するビジネスルールを決定するのに役立ちます。

このアプローチに関するいくつかの追加の注意事項...アラームが再びポップアップしないように、アラームを「処理済み」としてマークする必要があります。また、クライアントのクロックがサーバーと同期していることを確認する必要があります。さらに、異なるタイムゾーンを考慮する必要がありますか?

別の可能なアプローチは、データベースをポーリングし、クライアントにアラームをプッシュする中央サーバーを用意することです。これにより、各クライアントがデータベースを常にポーリングする必要がなくなります(ポーラーは1つだけです)が、「欠落した」アラームをキャッチすることはありません。常に多数のクライアントが接続されていて、「世界中の」アラートを送信する必要がある場合は、これがルートである可能性があります。アラームがユーザー固有の場合は、最初のアプローチを使用します。

于 2011-10-25T17:31:07.310 に答える
1

アプローチの1つは、クライアントが常にDATBASEをリッスンし、データベースで何かが変更されたときにローカルでイベントを発生させることです。これが私のSOです

編集:

また、将来のために何かの実行を遅らせたい場合は、優れたSQLコマンド待機があります

于 2011-10-25T17:41:25.377 に答える