web-dev-qa-db-ja.com

mysqlのトリガーからURLを呼び出す

あまりお勧めできませんが、

私はそれがパフォーマンス、速度などの問題であることを知っていますが、それは統合のためのものであり、彼らはmysqlを介してのみ更新を行っています彼らは何も変更したくないので、大量の販売を行います)。

URLに投稿するだけです( http://www.google.com?id=skuid と同じくらい簡単です)

私はこのブログとスタックを読んでいますが、2歳以上なので、udfを使用する代替手段があるかどうか知りたいです:

http://open-bi.blogspot.pe/2012/11/call-restful-web-services-from-mysql.html

http://www.mooreds.com/wordpress/archives/1497

mysqlトリガーを使用してphpファイルを呼び出す

すべてに感謝します!!

15
Saikios

外部アクションをトリガーするには、UDFを使用する必要があります。これはmysqlが「外の世界」に何かを伝える唯一の方法です。 唯一の選択肢 は、DBを継続的にポーリングする外部エージェントです-これは劣ったソリューションです。

UDFの選択に関しては、

  • dBの負荷を最小限に抑えるには、おそらくすぐに終了するものでなければなりません(UDFは同期的に実行されることに注意してください)。
  • そのため、インストールが十分に小規模でない限り、イベントを外部エージェントに通知するだけです。これにより、DB側でのエラー処理も最小限に抑えられます。
    • そうでなければ、(まだ)気にしないなら、例えばcurlを生成するだけの価値があります。

思い浮かぶ方法:

  • 小さなプログラムを生成する-例touchエージェントが監視するファイル。既存の _sys_exec_ があり、system()を使用します(すべての考慮事項があります)。
  • IPC(信号は最も単純です。他のものでは、追加の情報を渡すことができますが、より多くのセットアップが必要です)

_sys_exec_のソース が示すように、UDFを書くことはそれほど難しくないので、すでに利用可能なものに本当に制限されていません(これは_lib_mysqludf_sys_が制限されている理由を説明するかもしれません:より良いものが必要な場合は、タスク固有の関数を書くのは簡単です。現在のドキュメントは 26.4.2新しいユーザー定義関数の追加-MySQL 5.7リファレンスマニュアル にあります。

21
ivan_pozdeev

トリガーから「sys_exec」コマンドを使用して外部スクリプトを実行できます。秘trickは、そのスクリプトを非ブロック方式で記述することです。これにより、非同期で作業を行うバックグラウンドプロセスが生成され、メインプロセスがすぐに終了します。

たとえば、次のようなものです:

#!/bin/sh
Nohup curl(or wget) http://www.example.com ...other_post_parameters... &

ただし、同時に多くのプロセスを作成しないように注意する必要があります。これは、トリガー(たとえば、最後の実行時間を何らかのテーブルに書き込んでから、ある程度の時間が経過したかどうかを確認する)、またはシェルスクリプト(実行中のプロセスを示すフラグファイルを作成/削除できます)で実行できます)。

1
amaksr

これは、Windowsプラットフォーム上のMySQLサーバー5.6 64ビット(!)のソリューションです。 Win10 64ビットでテストしました。シェルでコマンドを実行するための機能を提供する64ビットの.dllバージョンのプラグインが必要でした。この機能はここで見つけました: http://winadmin.blogspot.nl/2011/06/mysql-sysexec -udf-for-64-bit-windows.html

Windowsで自分でコンパイルすることもできます: http://rpbouman.blogspot.nl/2007/09/creating-mysql-udfs-with-Microsoft.html

MySQL 5.1+の場合、プラグイン/ dllをMySQLインストールルートのサブディレクトリに配置する必要があります。たとえば、C:\wamp\bin\mysql\mysql5.6.17\lib\pluginまたは、エラーが発生します。

共有ライブラリdllを開けません–エラーコード193

curl.exeによって呼び出されるsys_evalも必要です。ここで正しいものをダウンロードする必要があります(両方の(!)ファイル.exeと.crtをPATH環境変数から到達可能なパスにコピーしてください)、私はc:\windows\system32を使用しました: https:/ /winampplugins.co.uk/curl/

必要なコードは次のとおりです。

--one time setup. run inside your database
CREATE FUNCTION sys_eval RETURNS STRING SONAME ‘lib_mysqludf_sys.dll’;

--example call to an URL
select CONVERT(sys_eval(CONCAT(‘curl https://randomuser.me/api?results=1‘)) USING UTF8MB4);
1
Jan