Developer

【SQL基礎】トリガーの作成part3
2021.09.30
Lv1

【SQL基礎】トリガーの作成part3

前々回の記事(part1)、前回の記事(part2)ではトリガーの作成方法を説明しました。
トリガー作成についての基本事項がわからない方は先に前回までの記事をご覧ください。
本記事では、引き続きトリガーの作成方法を説明します。

トリガーの概要について知りたい方はこちら


PRECEDESとFOLLOWS

同じ条件で起動するトリガーを複数登録する場合、基本的には作成された順にトリガーが実行されます。

実行順を制御したい場合は、トリガー作成時にPRECEDES/FOLLOWSキーワードを用いて指定する必要があります。

PRECEDESを使用すると指定したトリガーの前FOLLOWSを使用すると指定したトリガーの後に実行されます。

記述する場所は以下のとおり、トリガー処理の直前です。

CREATE
TRIGGER トリガー名
BEFORE/AFTER INSERT/UPDATE/DELETE
ON テーブル名 FOR EACH ROW
PRECEDES/FOLLOWS 他のトリガー名
トリガーの処理


PRECEDES/FOLLOWSの例

注文テーブル(orders)と更新履歴テーブル(update_log)を使用します。

注文テーブルは前の記事でも扱ったもので、「みかん」と「りんご」が登録されています。

更新履歴テーブルは、log_idカラム、logカラム、created_atカラムで構成されているものを新たに作成しました。

例1.注文テーブルのレコードが更新された後、更新履歴テーブルにデータが3件追加されるようにトリガーを作成する。

まずorder_update1というトリガーを作成します。ordersテーブルに更新があったとき、update_logテーブルにログをINSERTするためのトリガーです。

そして、PRECEDES order_update1を指定したorder_update2トリガーとFOLLOWS order_update1を指定したorder_update3トリガーを作成します。

order_update2トリガーもorder_update3トリガーも動作自体はorder_update1と同様です。ログの内容でそれぞれのトリガーの見分けがつくようになっています。

order_update2はorder_update1より前に実行されるはずです。

order_update3はorder_update1より後に実行されるはずです。

確認してみましょう。

注文テーブルを更新(UPDATE)してみます。

注文テーブルの「りんご」が「ぶどう」に更新されました。

更新履歴テーブルのログを確認すると、期待したとおりの実行順になっていることがわかります。

次回はトリガー作成の続きとトリガーの削除について扱います。


学習のポイント

・複数のトリガーの実行順を制御するにはPRECEDES/FOLLOWSを使用する。

・PRECEDESを使用してトリガーを作成すると、指定したトリガーの前に実行される。

・FOLLOWSを使用してトリガーを作成すると、指定したトリガーの後に実行される。


練習問題

問、次に示したtriggerA,triggerB,triggerC,triggerDの実行される順序を答えてください。


CREATE TRIGGER triggerA
AFTER UPDATE
ON orders FOR EACH ROW
トリガーの処理

CREATE TRIGGER triggerB
AFTER UPDATE
ON orders FOR EACH ROW
FOLLOWS triggerA
トリガーの処理

CREATE TRIGGER triggerC
AFTER UPDATE
ON orders FOR EACH ROW
トリガーの処理

CREATE TRIGGER triggerD
AFTER UPDATE
ON orders FOR EACH ROW
FOLLOWS triggerA
トリガーの処理

 

答え

triggerA→triggerD→triggerB→triggerC

最初に作成されたのはtriggerA。
次に作成されたtriggerBはFOLLOWS triggerAが指定されている。A→B
次に作成されたtriggerCはFOLLOWSやPRECEDESの指定がないため作成順に実行されることになる。A→B→C
最後に作成されたtriggerDはFOLLOWS triggerAが指定されている。triggerBもFOLLOWS triggerAが指定されているが、あとから作成されたtriggerDのFOLLOWS triggerAが優先される。A→D→B→C

 

 

連載目次リンク

SQL基礎 連載目次

関連する連載リンク

SQL練習問題 一覧まとめ