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

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

第36回 「 データベーストリガーの概要」

2012.10.01

今回から「データベーストリガー」について紹介します。
これ以降、単に「トリガーと」呼ぶことにします。

トリガーとは、何かの出来事(イベント)をきっかけとして、自動的に起動するプログラムです。
プロシージャやファンクションと同じように、データベースに格納されたPL/SQLのプログラムですが、明示的にプログラムなどからコールされるということはなく、あくまでもなにかのイベントをきっかけとして、バックグラウンドで自動的に起動します。
その用途は相当にあり、アイディア次第でまだ誰も思いついていない面白い利用方法だってあるかもしれせん。

以下はトリガーが使われる場面として良くある、トリガー“あるある”です。

★注文表に注文データをINSERTしたら、在庫表の該当するその商品の在庫をその分だけ減らすように自動的にUPDATEする。

★ある表を更新(UPDATEなど)するとき、CHECK制約では対応できない複雑な状況のチェックをトリガー内でプログラム的に判定してそのチェックに反する場合はその表の更新(UPDATEなど)をエラーにする。

このように様々な利用方法が考えられるわけです。

使い方によっては便利なのですが、反面トリガーを多用したシステムはわかりにくいものとなりがちです。
なぜなら、「あれ?、このデータだれがいつ、こんな風に更新したの?」といったように、ユーザが知らないうちに、水面下で処理しますので、多用するのは適切ではないでしょう。
また、トリガーを多用すると、更新のたびにトリガーが起動して追加の処理をするためパフォーマンス劣化の原因にもなります。
トリガーは、自動化すれば便利な特定の事柄について対応すべきです。

詳しい文法説明などは次回以降にするとして、今回は極めて単純なトリガーの例をご紹介します。
内容は、SOCTT.EMP表に対して、08:00~18:00の時間帯以外にINSERT, UPDATE, DELETEを行うとエラーとなる、というトリガーです。

以下の例をご覧ください。

<<1.トリガーの作成例>>
SQL> CREATE OR REPLACE TRIGGER TRIG_EMP_CHECK1
  2  BEFORE INSERT OR DELETE OR UPDATE ON SCOTT.EMP
  3  DECLARE
  4     V_DATE VARCHAR2(5);
  5  BEGIN
  6     V_DATE := TO_CHAR(SYSDATE,'HH24:MI');
  7     IF V_DATE BETWEEN '08:00' AND '18:00' THEN
  8        NULL;
  9     ELSE
 10        $RAISE_APPLICATION_ERROR(-20000,'EMP表は時間外に更新できません');
 11     END IF;
 12  END;
 13  /

トリガーが作成されました。

<<解説>>
ここではトリガーを作成しているのですが、
1行目で、トリガー名を TRIG_EMP_CHECK1としています。
2行目で、SOCTT.EMPに対するINSERT, UPDATER, DELETEが行われる前にこのトリガーが起動することを示しています。
3行目から12行目までが無名ブロックです。
6行目で現在の時間を取得し、
7行目でその時間が 08:00~18:00の範囲内がチェックし、範囲外であれば、10行目でエラーにしているわけです。

<<トリガーのチェックに反したのでエラーとなっている具体例>>
SQL> UPDATE SCOTT.EMP
  2  SET SAL = SAL + 10
  3  WHERE EMPNO = 7934;
UPDATE SCOTT.EMP
*
行1でエラーが発生しました。:
ORA-20000: EMP表は時間外に更新できません
ORA-06512: "SCOTT.TRIG_EMP_CHECK1", 行8
ORA-04088: トリガー'SCOTT.TRIG_EMP_CHECK1'の実行中にエラーが発生しました

<<解説>>
このUPDATE文を実際に実行した時間は21:00以降でした。
このSOCTT.EMPに対するUPDATEにより、トリガーTRIG_EMP_CHECK1が起動し、そのトリガーの中で時間帯のチェックを行い、その時の時間がこのチェックに反しているので、RAISE_APPLICATION_ERRORによりエラーとなっている様子です。

このトリガーが有効である限りは、誰がどのような方法でSCOTT.EMPに対してINSERT,UPDATE,DELETEしても、時間帯が08:00~18:00の範囲外であれば必ずエラーとなる訳です。

いかがですか?
雰囲気をつかんでいただいたところで、今日は終わりにします。
次回以降、構文や注意点などを詳しく解説いたします。ご期待ください!

先頭へ戻る