2.4. The PostgreSQL ルールシステム

PostgreSQL には、ビューと理解のしかたでどうとも取れるビューの更新の仕様に対応する強力なルールシステムがあります。もともと PostgreSQLのルールシステムは 2 つの実装で構成されていました。

PostgreSQL システムの構文やルールの作成に関する情報については ユーザガイドを参照してください。

2.4.1. 書き換えシステム

問い合わせ書き換えシステムは、構文解析過程とプランナ/オプティマイザの間にあるモジュールです。このシステムは構文解析過程から返された(ユーザーの問い合わせを示す)ツリーを処理し、問い合わせに適用されるべきルールがあった場合はツリーをそれに合わせて書き直します。

2.4.1.1. ビュー実装の手法

ここでは問い合わせ書き換えシステムのアルゴリズムを紹介します。よりわかりやすくするために、ルールを使ってビューを実装する方法を例として使います。

つぎのルールがあったとします。

  create rule view_rule
  as on select 
  to test_view
  do instead
     select s.sname, p.pname
     from supplier s, sells se, part p
     where s.sno = se.sno and
           p.pno = se.pno;   
      

ルールは、リレーションtest_viewに対する SELECT が検知されると起動がかかります。test_view からタプルを SELECT する代わりにルールのアクションパートにある SELECT 文が実行されます。

test_viewに対してつぎのようなユーザー問い合わせがあったとします。

  select sname 
  from test_view
  where sname <> 'Smith';
      

以下に、test_viewに対するユーザー問い合わせがあるたびに問い合わせ書き換えシステムが実行する過程を示します。(このリストは、基礎的な理解をうながすためのアルゴリズムを、非常に簡略したかたちで書いたものです。詳しい説明については A commentary on the POSTGRES rules system を参照してください。)

test_view 書き換え

  1. ルールのアクション部分で与えられた問い合わせを受け取ります。

  2. ユーザー問い合わせで与えられた属性の数字と順番が合うようにターゲットリストを調整します。

  3. ユーザー問い合わせの where 句で与えられる制限を、ルールのアクション部分で与えられる問い合わせの制限に追加します。

上記のようにルールが定義されると、ユーザーの問い合わせは次のような形に書き換えられます(書き換えは構文解析過程から返されたユーザー問い合わせの内部表現に適用されますが、新しく作られたデータ構造は次の問い合わせを表現していることに注意してください)。

  select s.sname
  from supplier s, sells se, part p
  where s.sno = se.sno and
        p.pno = se.pno and
        s.sname <> 'Smith';