e-learning、オラクル研修、LMS(学習管理システム)のiStudy

e-learning、オラクル研修、LMS(学習管理システム)のiStudy

第37回 「 DMLトリガーの特長」

2012.10.15

こんにちは、インストラクターの蓑島です。
季節の変わり目は体調を崩しやすいので、みなさんも気を付けてください。

さて、前回はトリガーの概要について説明してきました。
トリガーとは何かのイベントにより自動的に起動するプログラムです。

今回はトリガーの種類について概略を説明し、その中でもっとも一般的な種類のトリガーについて詳しく説明します。

まず概略ですが、トリガーには以下のような種類があります。

1. DMLトリガー
2. DDLトリガー
3. その他

もっとも良く知られているのが「DMLトリガー」です。
これは特定の表に対して設定するものであり、その表に対して、DML操作(INSERT, UPDATE, DELETEなど)が行われるときに起動するトリガーです。

次に「DDLトリガー」です。
これはDDL操作(CREATE, ALTER, DROPなど)により起動するトリガーです。

また「その他」として、
 ・データベースにログインやログオフするときに起動するトリガー
 ・データベースの起動時や停止時に起動するトリガー
 ・エラーの発生時に起動するトリガー

・・・といったものがあります。

このように大きく3つの種類のトリガーがありますが、もっとも一般的なトリガーは、DMLトリガーかと思います。

DMLトリガーには大事なポイントがあります。文トリガー、行トリガーという分類です。
文トリガーは一つのDMLで1回しか起動しません。
それに対して、行トリガーは、処理する行ごとに起動します。

例えば、一つのUPDATE文があり表の3行が更新されるとします。
ここでUPDATEで起動する文トリガーと行トリガーがそれぞれ設定されていると、文トリガーは1回のみ起動します。そして、行トリガーは行ごとですから3回起動します。
いわば行トリガーは更新対象の行の上で起動しているものです。

ここで重要な特徴は、『行トリガーはその行の列の値が参照できる』ことです。
更新前の値も更新後の値も参照できます。
すなわち、行の列値を使ってトリガーでなにかの処理を行うなら、行トリガーで実現することになります。

例えば前回の記事で「注文表に注文データをINSERTしたら、在庫表の該当するその商品の在庫をその分だけ減らすように自動的にUPDATEする。」といったトリガーの使用例をご紹介しましたが、このような処理は、注文表に対してINSERTで起動する行トリガーを設定しておき、その行トリガーでINSERT行の列値を使って、在庫表の該当するデータを減らすようにUPDATEするといった処理になります。

文トリガーの場合は、特定の行の上で起動しているわけではないので、行の列値は参照できません。
例えば、前回「SOCTT.EMP表に対して、08:00~18:00の時間帯以外にINSERT、UPDATE、DELETEを行うとエラーとなる」というトリガーのソースコードを掲載してますが、これはSCOTT.EMP表の行を参照している訳ではないので、文トリガーの記述となってます。

そして文トリガー、行トリガーほど根本的な違いではないですが、もうひとつ大事な分類があります。それはBEFORE とAFTERの分類です。
BEFOREの場合はDML処理の前に起動します。AFTERの場合はDML処理の後に起動します。
結局、DMLトリガーは、「文と行」、「BEFOREとAFTE」の組み合わせで4種類に分類できるのです。

・BEFOREの文トリガー
・BEFOREの行トリガー
・AFTERの行トリガー
・AFTERの文トリガー

では、上記の4種類のトリガーがすべて設定されているとして、それらがどんな順番で起動していくかを説明します。

まず、最初に起動するトリガーは「BEFOREの文トリガー」です。
これが1回だけ起動します。

次に起動するのは行トリガーです。
まず更新対象の一行目にカーソルが移動し、その行の上で「BEFOREの行トリガー」が起動します。
その後、その行が更新され、その直後、その行の上で「AFTERの行トリガー」が起動します。
これで1行目の処理が完了です。そして更新対象の2行目に移動し同じことを繰り返します。
以降、更新対象の最後の行まで同じことを繰り返します。

各行の処理がすべて終ったあと、最後に「AFTERの文トリガー」が1回だけ起動します。

このように4つのトリガーがすべて設定されていれば、このような起動順序となります。

この4つのトリガーの起動順序のイメージは、今後DMLトリガーを理解するためのベースとなりますので、しっかりと理解してくださいね。

それでは今回はここまでにします。次回もご期待ください。

先頭へ戻る