ルール

ルールとは、テーブルに対してある操作を行う際に、別の処理も実行する仕組みである。
ルールは更新系(INSERT,UPDATE,DELETE)と参照系(SELECT)で考え方が異なる。
参照系のルールは実質ビューに限られるため、ここでは更新系のルールを確認する。

準備

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

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

    oddtbs=> \i aim_log_create161.sql
    ...
    

ルール作成

CREATE [OR REPLACE] RULE ルール名 AS ON 操作名 TO テーブル名 DO 処理;

※ 複数の処理を記述する場合は、処理を( )で囲み、; で区切る

処理の中ではOLDとNEWを使用することができる。
・NEW … 操作の対象となった変更前の行
・OLD … 操作の対象となった変更後の行

今回、aimテーブルにINSERT, UPDATE, DELETEのいずれかの操作が行われた際に、 logテーブルに情報を追加するルールを作成する。

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

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

    oddtbs=> \i aim_log_rule161.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テーブルにデータが追加された。