web-dev-qa-db-ja.com

mysqlのselectステートメントでトリガーを起動できますか?

テーブルYのレコードをINSERTするたびに、テーブルXでSELECTステートメントを実行しようとしていますが、MySQLのみを使用してそれを実行できる方法はありますか?

トリガーのようなもの?

20

簡単な答えは「いいえ」です。トリガーはINSERTUPDATE、またはDELETEでトリガーされます。

この(奇妙な)シナリオの可能な解決策:

  • まず、テーブルXで必要なSELECTsを実行するいくつかのストアドプロシージャを記述します。
  • 次に、すべてのユーザーがこれらのストアドプロシージャのみを使用するように制限し、テーブルXでSELECTを使用できないようにします。
  • 次に、ストアドプロシージャを変更して、必要なアクション(INSERTなど)を実行するストアドプロシージャも呼び出します。
24
ypercubeᵀᴹ

いいえ-SELECTでトリガーすることはできません-クエリステートメントで暗黙的に呼び出すストアドプロシージャ(またはログファイルなどの他のタイプのロギング機能)を作成する必要があります-作成すると簡単になりますクエリを呼び出し、ロギングを呼び出し、クエリ結果を返すラッパー。

4
Ian Wood

テーブルXを使用してテーブルYのSELECTクエリの順序をログに記録しようとしている場合(かなり一般的なクエリログ設定)、操作の順序を逆にしてINSERTクエリを実行できます最初次にSELECTクエリを実行します。

そうすれば、2つのステートメントをTRIGGERにリンクすることを心配する必要はありません。2つのステートメント間でサーバーがクラッシュした場合は、最初のステートメントで気になることをすでにログに記録しており、SELECTクエリが実行されるか失敗するかは記録されていません。基盤となるデータベースへの影響。

クエリをログに記録していない場合は、テーブルYをタスクキューとして使用しようとしている可能性があります-私が苦労していた状況がこのスレッドにつながります-そして、最初にYをクエリしたセッションで他のすべてのセッションをロックする必要があります返された行から、結果に対していくつかの操作を実行し、出力をテーブルXに挿入できるようにします。その場合は、テーブルYにいくつかのロギング機能を追加するだけです。

たとえば、Yに「owner」列を追加し、WHEREクエリのSELECT部分をUPDATEステートメントに追加して実行し、SELECTクエリを変更して、UPDATEによって要求された結果のみを表示できます。

UPDATE Y SET owner = 'me' WHERE task = 'new' AND owner IS NULL;
SELECT foo FROM Y WHERE task = 'new' AND owner = 'me';

... fooでいくつかの作業を行ってから、...

INSERT INTO X (output) VALUES ('awesomeness');

繰り返しになりますが、重要なのはログに記録することです最初、次にクエリを実行します。

0
David Townes