web-dev-qa-db-ja.com

SQLトリガーはWebサービスを呼び出すことができますか?

IPhoneアプリ用のRESTfulAPIを構築しています。

ユーザーが「チェックイン」したとき[新しい行をテーブルに挿入]次に、その挿入からデータを取得してWebサービスを呼び出し、その挿入に基づいてプッシュ通知を送信します。

これを行うことを考える唯一の方法は、triggerを介して行うか、挿入が成功したときに実際の挿入メソッドを使用してWebサービスを呼び出すことです。それは私には悪い考えのように思えます。

これについて何か考えがあったのか、それとも私が考えていなかったより良いアプローチがあるのか​​疑問に思いました。

14
Jack Marchetti

技術的には可能だとしても、それは本当に良い考えではありません!トリガーは非常にスリムである必要があり、長時間の操作(Webサービス呼び出しは間違いなくそうです)を伴うべきではありません!アーキテクチャを再考してください-これを行うためのより良い方法があるはずです!

私の推奨事項は、トリガーでWebサービスを呼び出す必要があることを「通知」するタスクを、そのWebサービス呼び出しの実際の実行から分離することです。

何かのようなもの:

  1. トリガーコードで、「後でWebサービスを呼び出す」をテーブルに挿入します(無駄のない高速な状態を維持するためにINSERTだけです-それだけです)

  2. 実際のトリガーの実行とは別にこれらの呼び出しを行い、そのWebサービスから取得したデータをデータベースの適切なテーブルに格納する非同期サービス(SQLジョブまたはできればWindows NTサービス)があります。

トリガーは非常に厄介なものです-それは常に非常に速く、非常に無駄がないはずです-最大でINSERTまたは2つを実行します-そして、トリガー内のカーソルや他の長い操作(Webサービス呼び出しなど)を絶対に避けてください)

Brent Ozarは、 スケーリングしない開発者の間違いトップ1 に関するすばらしいWebキャスト(SQL PASSで発表)を公開しており、トリガーは彼が最初に焦点を当てるものです!強くお勧めします

18
marc_s

それはビジネスニーズに依存します。これはビジネスロジックであり、BLで処理する必要があるため、通常はトリガーを使用しないようにします。

しかし、答えはあなたの質問に「はい」です。それは可能です。Webサービスを非同期で呼び出すようにしてください。そうすれば、Webサービスの呼び出しが終了するまで挿入が遅れることはありません。

OneWay Webサービスの使用を検討することもできます。つまり、ファイアアンドフォーゲットです。

しかし、他の人が指摘しているように、トリガーを使用しない方が常に良いでしょう。

適切にアーキテクチャ化されている場合、データベースと通信できるコードは1つだけである必要があります。つまり、単一のサービスでDALを抽象化したものです。そこに引っ掛けて、挿入後に必要なものを作ります。

DALサービスを介さずに、データベースに直接アクセスしてデータベースに書き込むことができるさまざまなアプリケーションが多数ある場合は、トリガーを使用します。これもまた、起こるのを待っている災害です。

内部でホストされているサードパーティアプリケーションを処理する必要がある場合、つまりデータベースサーバー自体にはアクセスできるが、データベースに書き込むコードにはアクセスできない場合に、トリガーが発生する可能性がある別の状況。

2
Sunny Milenov

トリガー->キュー-> SP-> XP_XMDShell-> BAT-> cURL->サードパーティのWebサービス

トリガーを使用してキューテーブルにレコードを挿入し、次にカーソルを使用してキューエントリをプルするストアドプロシージャを使用しました。

WSDLやサードパーティのAPI開発者へのアクセスがなく、プロトタイプを完成させる緊急の必要があるため、ストアドプロシージャはXP_CMDShellを呼び出し、パラメーターを使用して.batファイルを呼び出します。

Batファイルは、REST/JSONの呼び出しと応答を管理するcURLを呼び出します。

それは無料で、迅速で、確実に機能します。アーキテクチャ的に純粋ではありませんが、プロトタイプを公開しました。

1
Todd C

ストアドプロシージャはどうですか?トリガーで設定する代わりに、ストアドプロシージャを呼び出します。これにより、データが挿入され、場合によっては他の処理が実行されます。

私の知る限り、トリガーは実行できる範囲がかなり制限されています。ストアドプロシージャには、より多くのスコープがある場合があります(またはない場合があります)。

最悪の場合、いつでも独自の「API」ページを作成できます。データを直接挿入する代わりに、データの挿入とプッシュ通知の両方を実行できるAPIページをリクエストします。

1
ashes999

ユーザーがページにアクセスしたときに、そのWebページに別のテーブル(message_queueを呼び出します)にエントリを作成させることをお勧めします。

次に、サーバー上のWindowsサービス/ * nixデーモンにmessage_queueテーブルをスキャンさせ、Webサービスを介してモバイルアプリへのプッシュを実行します。 SQLのトランザクション処理の能力を活用して、キュー処理を管理できます。

このアプローチの良いところは、1つのスタンドアロンサーバーですべてを開始でき、スケールアップするにつれてWebサイト、データベース、サービス/デーモンを異なる物理サーバーまたはサーバークラスターに分離できることです。

0
Dave