SQL
 Computer >> コンピューター >  >> プログラミング >> SQL

SQLトリガーとは?基本構文から使い方まで徹底解説

SQLトリガーとは

SQLトリガー(Trigger)とは、ユーザーが特定のテーブルに対して操作を行ったときに、自動的に一連の処理を実行させる仕組みです。フォームに入力されたデータの妥当性検証や、ビジネスルールの強制などに活用できる、非常に便利なSQL機能です。

トリガーが実行されるタイミング

トリガーは、次の3つのイベントの「前(BEFORE)」または「後(AFTER)」に実行されるように設定できます。

  • INSERT — 新しい行が挿入されたとき
  • UPDATE — 既存の行が更新されたとき
  • DELETE — 行が削除されたとき

どのトリガーが発火し、どのような処理が行われるかは、その記述方法によって決まります。それでは、実際にCREATE文を書くところから始めてみましょう。

トリガーの作成方法(CREATE TRIGGER)

CREATE TRIGGER <trigger_name> [BEFORE|AFTER] [INSERT|UPDATE|DELETE]
ON <table_name> [FOR EACH ROW|FOR EACH STATEMENT]
BEGIN
  <trigger_logic>
END;

<>で囲まれた部分には、任意の名前やロジックを記述します。[ ]内の項目は、提示された選択肢の中から1つを選んで指定してください。

BEFORE / AFTER と INSERT / UPDATE / DELETE の指定

BEFORE/AFTERINSERT|UPDATE|DELETEは、それぞれのリストから1つずつ選択します。BEFORE/AFTERはトリガーが実行されるタイミング(イベントの前か後か)を決定し、INSERT/UPDATE/DELETEはトリガーの発火条件となるイベントを指定します。

FOR EACH ROW と FOR EACH STATEMENT の違い

この2つの選択肢の違いは、トリガーが実行される回数にあります。

  • FOR EACH ROW — テーブル内で影響を受けた各行ごとにトリガーが実行されます。
  • FOR EACH STATEMENT — 対象となる行が存在するかどうかにかかわらず、少なくとも1回は必ず実行されます。

トリガーの削除方法(DROP TRIGGER)

データベースやテーブルの場合と同様に、トリガーにも削除用の構文が用意されています。

DROP TRIGGER [IF EXISTS] trigger_name;

IF EXISTSは省略可能なキーワードです。これを指定しておくと、削除対象のトリガーが存在しない場合でも「トリガーが存在しない」というエラーが発生しなくなります。また、テーブル自体を削除すると、そのテーブルに関連付けられたすべてのトリガーも自動的に削除される点に注意しましょう。

SQLトリガーを理解するための3つのポイント

SQLトリガーを扱ううえで押さえておきたい主な要素は次の3つです。

  1. トリガーに名前を付け、イベントの発生タイミングを指定するCREATE文
  2. トリガーが実行される頻度を決めるFOR EACH ROW / FOR EACH STATEMENTの指定
  3. 実際の処理内容を記述するBEGIN〜ENDブロック

まとめ

SQLトリガーはSQLの中でも比較的高度な概念のため、最初は理解に時間がかかるかもしれません。それでも焦らず、何度も手を動かして練習することが大切です。繰り返し学習することで、他のトピックよりも多くの復習が必要な分だけ、確実にスキルとして身についていきます。

  1. Oracle Database 19cのSQL検疫(SQL Quarantine)機能とは?リソースマネージャによる暴走クエリ対策の完全ガイド

    本記事では、Oracle Database 19cの新機能であるSQL検疫(SQL Quarantine)について詳しく解説します。Oracle® Resource Managerを使用すると、CPUやI/Oといったシステムリソースの使用量を制御・制限できます。さらに注目すべきは、定義された閾値を超える長時間実行クエリの実行自体を防止できる点です。 SQL検疫(SQL Quarantine)とは何か? 「検疫(Quarantine)」とは隔離を意味します。SQL検疫は、暴走クエリ(Runaway Query)がもたらすオーバーヘッドを排除するために使用できる、19cの新機能です。暴走クエリとは

  2. each...or else――Rubyで空のコレクションをエレガントに処理する方法

    Rubyのeachは非常に便利なメソッドですが、ひとつ悩ましい問題があります。コレクションが空だった場合はどうなるのでしょうか? [].eachを呼び出しても何も起こらず、単に[]が返されるだけです。それが望ましい動作であるケースもあります。しかし多くの場合、特にUIを構築している際には、空のリストを特別に扱いたくなるものです。たとえば私なら、データがひとつもないときには別のメッセージを表示したいと考えます。 ところが[].eachは[]を返すのであってnilではないため、次のような書き方をするしかありません。 app/views/users/index.html.erb<% if @u