トリガー

トリガーとは、テーブルに対してある操作を行う際に、別の処理も実行する仕組みである。
ルールとよく似ているが、次のような違いがある。

  1. トリガーの処理は関数によって定義する。
  2. ルールは1つの操作を対象とするが、トリガーは複数の操作を対象にできる。

今回は、前回のルールと同じことをトリガーを利用して実現する。

準備

aim, log両テーブルを作成しなおす。

oddtbs=> \i aim_log_create161.sql
...

トリガー用関数の作成

  1. 次のSQLをファイルとして作成。(aim_log_func171.sql)

    
    

    ※ 戻り値をTRIGGER型にし、最後はRETURN NEWを記述する。

    トリガー用の関数の中では次のような特殊変数を使用することができる。
    ・TG_OP … 操作の種類(INSERT, UPDATE, DELETEなど)
    ・NEW … 操作の対象となった変更前の行
    ・OLD … 操作の対象となった変更後の行

    上記関数は操作の記録をlogテーブルに追加している。

  2. ログイン画面から実行。

    oddtbs=> \i aim_log_func171.sql
    CREATE FUNCTION
    

トリガーの作成

CREATE TRIGGER トリガー名 {BEFORE | AFTER} 操作名 OR 操作名 ... ON テーブル名
	[FOR ROW] EXECUTE PROCEDURE トリガー関数名
;

・トリガー関数が実行されるタイミングが操作の前か後ろかをBEFOREかAFTERで指定する。
・操作名はINSERT,UPDATE,DELETEのうちのどれか。
・FOR ROWを指定すると、各行を操作するたびにトリガー関数が実行される。指定がない場合は、1回のSQLで一度だけ実行される。

  1. 次のSQLをファイルとして作成。(aim_log_trig171.sql)

    
    
  2. ログイン画面から実行。

    oddtbs=> \i aim_log_trig171.sql
    ...
    

動作確認

  1. 両テーブルを確認

    oddtbs=> select * from aim;
     id | name
    ----+------
    (0 rows)
    
    oddtbs=> select * from log;
     operation | old_id | old_name | new_id | new_name | exuser | extime
    -----------+--------+----------+--------+----------+--------+--------
    (0 rows)
    
  2. aimテーブルにINSERTを実行。

    oddtbs=> insert into aim values(1, '田中');
    INSERT 0 1
    oddtbs=> insert into aim values(2, '鈴木');
    INSERT 0 1
    
  3. 両テーブルを確認

    oddtbs=> select * from aim;
     id | name
    ----+------
      1 | 田中
      2 | 鈴木
    (2 rows)
    
    oddtbs=> select * from log;
     operation | old_id | old_name | new_id | new_name | exuser |         extime
    -----------+--------+----------+--------+----------+--------+-------------------------
     INSERT    |        |          |      1 | 田中     | oduser | 2009-08-13 12:53:33.671
     INSERT    |        |          |      2 | 鈴木     | oduser | 2009-08-13 12:53:39.062
    (2 rows)
    ※ aimテーブルにINSERTすることにより、logテーブルにデータが追加された。
    
  4. aimテーブルにUPDATEを実行。

    oddtbs=> update aim set name = '山田' where id = 1;
    UPDATE 1
    
  5. 両テーブルを確認

    oddtbs=> select * from aim;
     id | name
    ----+------
      2 | 鈴木
      1 | 山田
    (2 rows)
    
    oddtbs=> select * from log;
     operation | old_id | old_name | new_id | new_name | exuser |         extime
    -----------+--------+----------+--------+----------+--------+-------------------------
     INSERT    |        |          |      1 | 田中     | oduser | 2009-08-13 12:53:33.671
     INSERT    |        |          |      2 | 鈴木     | oduser | 2009-08-13 12:53:39.062
     UPDATE    |      1 | 田中     |      1 | 山田     | oduser | 2009-08-13 12:53:57.843
    (3 rows)
    ※ aimテーブルにUPDATEすることにより、logテーブルにデータが追加された。
    
  6. aimテーブルにDELETEを実行。

    oddtbs=> delete from aim where id = 1;
    DELETE 1
    
  7. 両テーブルを確認

    oddtbs=> select * from aim;
     id | name
    ----+------
      2 | 鈴木
    (1 row)
    
    oddtbs=> select * from log;
     operation | old_id | old_name | new_id | new_name | exuser |         extime
    -----------+--------+----------+--------+----------+--------+-------------------------
     INSERT    |        |          |      1 | 田中     | oduser | 2009-08-13 12:53:33.671
     INSERT    |        |          |      2 | 鈴木     | oduser | 2009-08-13 12:53:39.062
     UPDATE    |      1 | 田中     |      1 | 山田     | oduser | 2009-08-13 12:53:57.843
     DELETE    |      1 | 山田     |        |          | oduser | 2009-08-13 12:54:16.531
    (4 rows)
    ※ aimテーブルにDELETEすることにより、logテーブルにデータが追加された。