Developer

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

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

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

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


トリガーの処理が複数行ある場合

トリガーの処理を複数行記述したい場合は、処理の内容をBEGIN…ENDで囲みます。

したがって、以下のように記述することになります。

CREATE
TRIGGER トリガー名
BEFORE/AFTER INSERT/UPDATE/DELETE
ON テーブル名 FOR EACH ROW
BEGIN
トリガーの処理
トリガーの処理
……
END

これで終わりといいたいところですが、トリガーの処理を複数行記述する場合にはデリミタを変更する作業が必要です。次節以降で解説します。


デリミタとは

デリミタとは、「区切り文字」のことです。

区切るために用いられている記号はデリミタであると言えます。

デリミタとしてイメージしやすいのは、「,」や「:」などでしょう。

では、SQLにおけるデリミタは何でしょうか。

それは「;(セミコロン)」です。

SQL文の最後には必ずセミコロンを付けているはずです。

セミコロンを付けることで、一つのSQL文の区切り目を示しているのです。


デリミタの変更

本題に戻りましょう。複数行のトリガーを設定する際にはデリミタの変更が必要です。

デリミタの変更はdelimiterコマンドのあとに任意のデリミタを指定するだけです。

デリミタを「//」に変更したい場合は以下のように記述します。


delimiter //

元のセミコロンに戻す場合は以下のように記述します。


delimiter ;

そもそもなぜデリミタの変更が必要なのでしょうか。

それは、トリガー自体を作成するための区切り目と、トリガーの処理内容を複数記述するための区切り目が混同されるのを避けるためです。

現段階ではピンとこないかもしれませんが、具体例を見て確認していきましょう。


複数行トリガーの例

前回の記事でも扱った注文テーブル(orders)と注文履歴テーブル(order_history)を使います。


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

前回の記事とほぼ同様の例ですが、トリガーの処理を2行にしました。

order_historyテーブルにデータを挿入する処理を2行記述しており、処理内容自体は特に意味のあるものではありません。

トリガー作成前にデリミタを変更し、処理内容はBEGIN…ENDで囲んでいるところがポイントです。


delimiter //
CREATE
TRIGGER order_insert
AFTER INSERT
ON orders FOR EACH ROW
BEGIN
INSERT INTO order_history VALUES (0, NOW());
INSERT INTO order_history VALUES (0, NOW());
END;
//

最初の赤枠のところでデリミタを「//」に変更しています。

トリガーの処理内容は青枠のところで、ここは従来のデリミタ「;」で区切り目を記述しておきます。

青枠の1行下で、変更したデリミタ「//」によってトリガー作成の完了を示し、トリガーの登録が行われています。

最後の赤枠で、従来のデリミタ「;」に戻しています。

トリガーの作成が済んだので動作を確認します。

注文テーブルにレコードをINSERTします。

すると、注文履歴テーブルには2件のデータが挿入されました。挿入された日時が同じことから、同一のトリガーによって挿入されたデータであると判断できます。

次回も引き続きトリガー作成について扱います。


学習のポイント

・複数行のトリガーを設定する際には、デリミタを変更する。

・複数行トリガーの処理内容はBEGINとENDで囲む。


練習問題

問、次の記述には、誤っている箇所があります。①~④のうちどこが誤っているのか指摘して、トリガー作成のための正しい記述を考えてください。


delimiter ? ……①
CREATE TRIGGER test_trigger
AFTER DELETE
ON test_A FOR EACH ROW
BEGIN ……②
INSERT INTO test_B VALUES (value1, value2);
INSERT INTO test_C VALUES (value1, value2);
END; ……③

delimiter ; ……④

 

答え

③ 正しい記述→「;」を「?」に修正する。

1行目のdelimiterコマンドによって、区切り文字が「?」に変更されている。したがって、トリガー作成を完了するためにはENDのあとに?を入力する必要がある。

 

 

連載目次リンク

SQL基礎 連載目次

関連する連載リンク

SQL練習問題 一覧まとめ