トリガーとは、テーブルに対してある操作を行う際に、別の処理も実行する仕組みである。
ルールとよく似ているが、次のような違いがある。
今回は、前回のルールと同じことをトリガーを利用して実現する。
aim, log両テーブルを作成しなおす。
oddtbs=> \i aim_log_create161.sql
...
次のSQLをファイルとして作成。(aim_log_func171.sql)
※ 戻り値をTRIGGER型にし、最後はRETURN NEWを記述する。
トリガー用の関数の中では次のような特殊変数を使用することができる。
・TG_OP … 操作の種類(INSERT, UPDATE, DELETEなど)
・NEW … 操作の対象となった変更前の行
・OLD … 操作の対象となった変更後の行
上記関数は操作の記録をlogテーブルに追加している。
ログイン画面から実行。
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で一度だけ実行される。
次のSQLをファイルとして作成。(aim_log_trig171.sql)
ログイン画面から実行。
oddtbs=> \i aim_log_trig171.sql
...
両テーブルを確認
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)
aimテーブルにINSERTを実行。
oddtbs=> insert into aim values(1, '田中'); INSERT 0 1 oddtbs=> insert into aim values(2, '鈴木'); INSERT 0 1
両テーブルを確認
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テーブルにデータが追加された。
aimテーブルにUPDATEを実行。
oddtbs=> update aim set name = '山田' where id = 1;
UPDATE 1
両テーブルを確認
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テーブルにデータが追加された。
aimテーブルにDELETEを実行。
oddtbs=> delete from aim where id = 1;
DELETE 1
両テーブルを確認
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テーブルにデータが追加された。