MySQLでSELECTトリガー

 MySQLではINSERT、UPDATE、 DELETEとトリガーが実装されていますが、SELECTのトリガーは実装されていません。というかSELECTトリガーってなんだよっ!Oracleあたりにはありそうですが、RDBMSでSELECTトリガーなんて言うものは僕も聞いたことありません。そもそも、SELECT時にトリガーで、ストアドプロシージャを実行したいことがあるのかといった話ではあります。
 そんなSELECT トリガーについて、INSERT、UPDATE、DELETEのトリガーがそれぞれの文を実行時にストアドプロシージャを実行するのと同じように、SELECT文実行時にストアドプロシージャを実行するものと定義します。さて、既存のMySQLでこれを実現する為にはどうしましょう。SELECT文中ではストアドファンクションしか使えないのでストアドファンクションを利用するしかなさそうですね。

以下のようにすれば、SELECTトリガー(文トリガー*1 )というものを実現できる筈

  • SELECT トリガー(BEFORE)
SELECT a b c d 
  FROM table 
 WHERE stored_function((常に1が返るようにする))
  AND 条件文 ....

 トリガーにはBEFORE、AFTERがあります。上記の例だとBEFOREになりますね。AFTERの場合にはどうしましょう。SELECT文1文中でユーザ変数を設定した時と同じくUNIONを使うことにしましょう。今度はストアドファンクションの返り値として0が返るようにします。

  • SELECT トリガー(AFTER)
SELECT a b c d 
  FROM table 
 WHERE 条件文 ....
UNION ALL 
SELECT a b c d 
  FROM DUAL 
 WHERE stored_function((常に0が返るようにする))

*1:FOR STATEMENT