ルールとは、テーブルに対してある操作を行う際に、別の処理も実行する仕組みである。
ルールは更新系(INSERT,UPDATE,DELETE)と参照系(SELECT)で考え方が異なる。
参照系のルールは実質ビューに限られるため、ここでは更新系のルールを確認する。
次のSQLをファイルとして作成。(aim_log_create161.sql)
ログイン画面から実行。
oddtbs=> \i aim_log_create161.sql
...
CREATE [OR REPLACE] RULE ルール名 AS ON 操作名 TO テーブル名 DO 処理;
※ 複数の処理を記述する場合は、処理を( )で囲み、; で区切る
処理の中ではOLDとNEWを使用することができる。
・NEW … 操作の対象となった変更前の行
・OLD … 操作の対象となった変更後の行
今回、aimテーブルにINSERT, UPDATE, DELETEのいずれかの操作が行われた際に、 logテーブルに情報を追加するルールを作成する。
次のSQLをファイルとして作成。(aim_log_rule161.sql)
ログイン画面から実行。
oddtbs=> \i aim_log_rule161.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テーブルにデータが追加された。